[Mesa-dev] [PATCH 7/8] softpipe: add image support to softpipe (v3)

2016-03-30 Thread Dave Airlie
From: Dave Airlie 

This adds support for ARB_shader_image_load_store to softpipe.

v2: add RESQ support (Ilia)
v3: constify, cleanup internals, add some comments (Brian).

Signed-off-by: Dave Airlie 
---
 src/gallium/auxiliary/tgsi/tgsi_exec.h  |   4 +-
 src/gallium/drivers/softpipe/Makefile.sources   |   2 +
 src/gallium/drivers/softpipe/sp_context.c   |  20 +-
 src/gallium/drivers/softpipe/sp_context.h   |   2 +
 src/gallium/drivers/softpipe/sp_flush.c |  26 +
 src/gallium/drivers/softpipe/sp_flush.h |   2 +
 src/gallium/drivers/softpipe/sp_fs_exec.c   |   6 +-
 src/gallium/drivers/softpipe/sp_image.c | 762 
 src/gallium/drivers/softpipe/sp_image.h |  37 ++
 src/gallium/drivers/softpipe/sp_state.h |   7 +-
 src/gallium/drivers/softpipe/sp_state_derived.c |   3 +-
 src/gallium/drivers/softpipe/sp_state_image.c   |  57 ++
 src/gallium/drivers/softpipe/sp_texture.c   |   8 +-
 src/gallium/drivers/softpipe/sp_texture.h   |   4 +-
 14 files changed, 928 insertions(+), 12 deletions(-)
 create mode 100644 src/gallium/drivers/softpipe/sp_image.c
 create mode 100644 src/gallium/drivers/softpipe/sp_image.h
 create mode 100644 src/gallium/drivers/softpipe/sp_state_image.c

diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h 
b/src/gallium/auxiliary/tgsi/tgsi_exec.h
index 2c81d5e..45fb8d4 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
@@ -497,8 +497,10 @@ tgsi_exec_get_shader_param(enum pipe_shader_cap param)
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
-   case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
   return 0;
+   case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
+  return PIPE_MAX_SHADER_IMAGES;
+
case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
   return 32;
}
diff --git a/src/gallium/drivers/softpipe/Makefile.sources 
b/src/gallium/drivers/softpipe/Makefile.sources
index 2af3d6a..efe8846 100644
--- a/src/gallium/drivers/softpipe/Makefile.sources
+++ b/src/gallium/drivers/softpipe/Makefile.sources
@@ -10,6 +10,7 @@ C_SOURCES := \
sp_flush.h \
sp_fs_exec.c \
sp_fs.h \
+   sp_image.c \
sp_limits.h \
sp_prim_vbuf.c \
sp_prim_vbuf.h \
@@ -31,6 +32,7 @@ C_SOURCES := \
sp_state_blend.c \
sp_state_clip.c \
sp_state_derived.c \
+   sp_state_image.c \
sp_state.h \
sp_state_rasterizer.c \
sp_state_sampler.c \
diff --git a/src/gallium/drivers/softpipe/sp_context.c 
b/src/gallium/drivers/softpipe/sp_context.c
index d2a3220..30b0276 100644
--- a/src/gallium/drivers/softpipe/sp_context.c
+++ b/src/gallium/drivers/softpipe/sp_context.c
@@ -50,7 +50,7 @@
 #include "sp_query.h"
 #include "sp_screen.h"
 #include "sp_tex_sample.h"
-
+#include "sp_image.h"
 
 static void
 softpipe_destroy( struct pipe_context *pipe )
@@ -199,6 +199,10 @@ softpipe_create_context(struct pipe_screen *screen,
   softpipe->tgsi.sampler[i] = sp_create_tgsi_sampler();
}
 
+   for (i = 0; i < PIPE_SHADER_TYPES; i++) {
+  softpipe->tgsi.image[i] = sp_create_tgsi_image();
+   }
+
softpipe->dump_fs = debug_get_bool_option( "SOFTPIPE_DUMP_FS", FALSE );
softpipe->dump_gs = debug_get_bool_option( "SOFTPIPE_DUMP_GS", FALSE );
 
@@ -216,6 +220,7 @@ softpipe_create_context(struct pipe_screen *screen,
softpipe_init_streamout_funcs(>pipe);
softpipe_init_texture_funcs( >pipe );
softpipe_init_vertex_funcs(>pipe);
+   softpipe_init_image_funcs(>pipe);
 
softpipe->pipe.set_framebuffer_state = softpipe_set_framebuffer_state;
 
@@ -223,7 +228,8 @@ softpipe_create_context(struct pipe_screen *screen,
 
softpipe->pipe.clear = softpipe_clear;
softpipe->pipe.flush = softpipe_flush_wrapped;
-
+   softpipe->pipe.texture_barrier = softpipe_texture_barrier;
+   softpipe->pipe.memory_barrier = softpipe_memory_barrier;
softpipe->pipe.render_condition = softpipe_render_condition;

/*
@@ -272,6 +278,16 @@ softpipe_create_context(struct pipe_screen *screen,
 (struct tgsi_sampler *)
softpipe->tgsi.sampler[PIPE_SHADER_GEOMETRY]);
 
+   draw_image(softpipe->draw,
+  PIPE_SHADER_VERTEX,
+  (struct tgsi_image *)
+  softpipe->tgsi.image[PIPE_SHADER_VERTEX]);
+
+   draw_image(softpipe->draw,
+  PIPE_SHADER_GEOMETRY,
+  (struct tgsi_image *)
+  softpipe->tgsi.image[PIPE_SHADER_GEOMETRY]);
+
if (debug_get_bool_option( "SOFTPIPE_NO_RAST", FALSE ))
   softpipe->no_rast = TRUE;
 
diff --git a/src/gallium/drivers/softpipe/sp_context.h 
b/src/gallium/drivers/softpipe/sp_context.h
index d18bbe6..20a1235 100644
--- a/src/gallium/drivers/softpipe/sp_context.h
+++ b/src/gallium/drivers/softpipe/sp_context.h
@@ -83,6 +83,7 @@ struct 

Re: [Mesa-dev] [PATCH 7/8] softpipe: add image support to softpipe

2016-03-22 Thread Brian Paul

A bunch of nit-picks below.

Overall, I'd like to see more comments on the new functions to explain 
what's going on.



On 03/21/2016 04:02 PM, Dave Airlie wrote:

From: Dave Airlie 

This adds support for ARB_shader_image_load_store to softpipe.

Signed-off-by: Dave Airlie 
---
  src/gallium/auxiliary/tgsi/tgsi_exec.h  |   4 +-
  src/gallium/drivers/softpipe/Makefile.sources   |   2 +
  src/gallium/drivers/softpipe/sp_context.c   |  20 +-
  src/gallium/drivers/softpipe/sp_context.h   |   2 +
  src/gallium/drivers/softpipe/sp_flush.c |  26 +
  src/gallium/drivers/softpipe/sp_flush.h |   2 +
  src/gallium/drivers/softpipe/sp_fs_exec.c   |   6 +-
  src/gallium/drivers/softpipe/sp_image.c | 643 
  src/gallium/drivers/softpipe/sp_image.h |  37 ++
  src/gallium/drivers/softpipe/sp_state.h |   7 +-
  src/gallium/drivers/softpipe/sp_state_derived.c |   3 +-
  src/gallium/drivers/softpipe/sp_state_image.c   |  57 +++
  src/gallium/drivers/softpipe/sp_texture.c   |   8 +-
  src/gallium/drivers/softpipe/sp_texture.h   |   4 +-
  14 files changed, 809 insertions(+), 12 deletions(-)
  create mode 100644 src/gallium/drivers/softpipe/sp_image.c
  create mode 100644 src/gallium/drivers/softpipe/sp_image.h
  create mode 100644 src/gallium/drivers/softpipe/sp_state_image.c

diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h 
b/src/gallium/auxiliary/tgsi/tgsi_exec.h
index 9ff8a72..99051ed 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
@@ -518,8 +518,10 @@ tgsi_exec_get_shader_param(enum pipe_shader_cap param)
 case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
 case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
 case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
-   case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
return 0;
+   case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
+  return PIPE_MAX_SHADER_IMAGES;
+
 case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
return 32;
 }
diff --git a/src/gallium/drivers/softpipe/Makefile.sources 
b/src/gallium/drivers/softpipe/Makefile.sources
index 2af3d6a..efe8846 100644
--- a/src/gallium/drivers/softpipe/Makefile.sources
+++ b/src/gallium/drivers/softpipe/Makefile.sources
@@ -10,6 +10,7 @@ C_SOURCES := \
sp_flush.h \
sp_fs_exec.c \
sp_fs.h \
+   sp_image.c \
sp_limits.h \
sp_prim_vbuf.c \
sp_prim_vbuf.h \
@@ -31,6 +32,7 @@ C_SOURCES := \
sp_state_blend.c \
sp_state_clip.c \
sp_state_derived.c \
+   sp_state_image.c \
sp_state.h \
sp_state_rasterizer.c \
sp_state_sampler.c \
diff --git a/src/gallium/drivers/softpipe/sp_context.c 
b/src/gallium/drivers/softpipe/sp_context.c
index d2a3220..30b0276 100644
--- a/src/gallium/drivers/softpipe/sp_context.c
+++ b/src/gallium/drivers/softpipe/sp_context.c
@@ -50,7 +50,7 @@
  #include "sp_query.h"
  #include "sp_screen.h"
  #include "sp_tex_sample.h"
-
+#include "sp_image.h"

  static void
  softpipe_destroy( struct pipe_context *pipe )
@@ -199,6 +199,10 @@ softpipe_create_context(struct pipe_screen *screen,
softpipe->tgsi.sampler[i] = sp_create_tgsi_sampler();
 }

+   for (i = 0; i < PIPE_SHADER_TYPES; i++) {
+  softpipe->tgsi.image[i] = sp_create_tgsi_image();
+   }
+
 softpipe->dump_fs = debug_get_bool_option( "SOFTPIPE_DUMP_FS", FALSE );
 softpipe->dump_gs = debug_get_bool_option( "SOFTPIPE_DUMP_GS", FALSE );

@@ -216,6 +220,7 @@ softpipe_create_context(struct pipe_screen *screen,
 softpipe_init_streamout_funcs(>pipe);
 softpipe_init_texture_funcs( >pipe );
 softpipe_init_vertex_funcs(>pipe);
+   softpipe_init_image_funcs(>pipe);

 softpipe->pipe.set_framebuffer_state = softpipe_set_framebuffer_state;

@@ -223,7 +228,8 @@ softpipe_create_context(struct pipe_screen *screen,

 softpipe->pipe.clear = softpipe_clear;
 softpipe->pipe.flush = softpipe_flush_wrapped;
-
+   softpipe->pipe.texture_barrier = softpipe_texture_barrier;
+   softpipe->pipe.memory_barrier = softpipe_memory_barrier;
 softpipe->pipe.render_condition = softpipe_render_condition;

 /*
@@ -272,6 +278,16 @@ softpipe_create_context(struct pipe_screen *screen,
  (struct tgsi_sampler *)
 softpipe->tgsi.sampler[PIPE_SHADER_GEOMETRY]);

+   draw_image(softpipe->draw,
+  PIPE_SHADER_VERTEX,
+  (struct tgsi_image *)
+  softpipe->tgsi.image[PIPE_SHADER_VERTEX]);
+
+   draw_image(softpipe->draw,
+  PIPE_SHADER_GEOMETRY,
+  (struct tgsi_image *)
+  softpipe->tgsi.image[PIPE_SHADER_GEOMETRY]);
+
 if (debug_get_bool_option( "SOFTPIPE_NO_RAST", FALSE ))
softpipe->no_rast = TRUE;

diff --git a/src/gallium/drivers/softpipe/sp_context.h 
b/src/gallium/drivers/softpipe/sp_context.h
index d18bbe6..20a1235 100644
--- 

[Mesa-dev] [PATCH 7/8] softpipe: add image support to softpipe

2016-03-21 Thread Dave Airlie
From: Dave Airlie 

This adds support for ARB_shader_image_load_store to softpipe.

Signed-off-by: Dave Airlie 
---
 src/gallium/auxiliary/tgsi/tgsi_exec.h  |   4 +-
 src/gallium/drivers/softpipe/Makefile.sources   |   2 +
 src/gallium/drivers/softpipe/sp_context.c   |  20 +-
 src/gallium/drivers/softpipe/sp_context.h   |   2 +
 src/gallium/drivers/softpipe/sp_flush.c |  26 +
 src/gallium/drivers/softpipe/sp_flush.h |   2 +
 src/gallium/drivers/softpipe/sp_fs_exec.c   |   6 +-
 src/gallium/drivers/softpipe/sp_image.c | 643 
 src/gallium/drivers/softpipe/sp_image.h |  37 ++
 src/gallium/drivers/softpipe/sp_state.h |   7 +-
 src/gallium/drivers/softpipe/sp_state_derived.c |   3 +-
 src/gallium/drivers/softpipe/sp_state_image.c   |  57 +++
 src/gallium/drivers/softpipe/sp_texture.c   |   8 +-
 src/gallium/drivers/softpipe/sp_texture.h   |   4 +-
 14 files changed, 809 insertions(+), 12 deletions(-)
 create mode 100644 src/gallium/drivers/softpipe/sp_image.c
 create mode 100644 src/gallium/drivers/softpipe/sp_image.h
 create mode 100644 src/gallium/drivers/softpipe/sp_state_image.c

diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h 
b/src/gallium/auxiliary/tgsi/tgsi_exec.h
index 9ff8a72..99051ed 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
@@ -518,8 +518,10 @@ tgsi_exec_get_shader_param(enum pipe_shader_cap param)
case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
-   case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
   return 0;
+   case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
+  return PIPE_MAX_SHADER_IMAGES;
+
case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
   return 32;
}
diff --git a/src/gallium/drivers/softpipe/Makefile.sources 
b/src/gallium/drivers/softpipe/Makefile.sources
index 2af3d6a..efe8846 100644
--- a/src/gallium/drivers/softpipe/Makefile.sources
+++ b/src/gallium/drivers/softpipe/Makefile.sources
@@ -10,6 +10,7 @@ C_SOURCES := \
sp_flush.h \
sp_fs_exec.c \
sp_fs.h \
+   sp_image.c \
sp_limits.h \
sp_prim_vbuf.c \
sp_prim_vbuf.h \
@@ -31,6 +32,7 @@ C_SOURCES := \
sp_state_blend.c \
sp_state_clip.c \
sp_state_derived.c \
+   sp_state_image.c \
sp_state.h \
sp_state_rasterizer.c \
sp_state_sampler.c \
diff --git a/src/gallium/drivers/softpipe/sp_context.c 
b/src/gallium/drivers/softpipe/sp_context.c
index d2a3220..30b0276 100644
--- a/src/gallium/drivers/softpipe/sp_context.c
+++ b/src/gallium/drivers/softpipe/sp_context.c
@@ -50,7 +50,7 @@
 #include "sp_query.h"
 #include "sp_screen.h"
 #include "sp_tex_sample.h"
-
+#include "sp_image.h"
 
 static void
 softpipe_destroy( struct pipe_context *pipe )
@@ -199,6 +199,10 @@ softpipe_create_context(struct pipe_screen *screen,
   softpipe->tgsi.sampler[i] = sp_create_tgsi_sampler();
}
 
+   for (i = 0; i < PIPE_SHADER_TYPES; i++) {
+  softpipe->tgsi.image[i] = sp_create_tgsi_image();
+   }
+
softpipe->dump_fs = debug_get_bool_option( "SOFTPIPE_DUMP_FS", FALSE );
softpipe->dump_gs = debug_get_bool_option( "SOFTPIPE_DUMP_GS", FALSE );
 
@@ -216,6 +220,7 @@ softpipe_create_context(struct pipe_screen *screen,
softpipe_init_streamout_funcs(>pipe);
softpipe_init_texture_funcs( >pipe );
softpipe_init_vertex_funcs(>pipe);
+   softpipe_init_image_funcs(>pipe);
 
softpipe->pipe.set_framebuffer_state = softpipe_set_framebuffer_state;
 
@@ -223,7 +228,8 @@ softpipe_create_context(struct pipe_screen *screen,
 
softpipe->pipe.clear = softpipe_clear;
softpipe->pipe.flush = softpipe_flush_wrapped;
-
+   softpipe->pipe.texture_barrier = softpipe_texture_barrier;
+   softpipe->pipe.memory_barrier = softpipe_memory_barrier;
softpipe->pipe.render_condition = softpipe_render_condition;

/*
@@ -272,6 +278,16 @@ softpipe_create_context(struct pipe_screen *screen,
 (struct tgsi_sampler *)
softpipe->tgsi.sampler[PIPE_SHADER_GEOMETRY]);
 
+   draw_image(softpipe->draw,
+  PIPE_SHADER_VERTEX,
+  (struct tgsi_image *)
+  softpipe->tgsi.image[PIPE_SHADER_VERTEX]);
+
+   draw_image(softpipe->draw,
+  PIPE_SHADER_GEOMETRY,
+  (struct tgsi_image *)
+  softpipe->tgsi.image[PIPE_SHADER_GEOMETRY]);
+
if (debug_get_bool_option( "SOFTPIPE_NO_RAST", FALSE ))
   softpipe->no_rast = TRUE;
 
diff --git a/src/gallium/drivers/softpipe/sp_context.h 
b/src/gallium/drivers/softpipe/sp_context.h
index d18bbe6..20a1235 100644
--- a/src/gallium/drivers/softpipe/sp_context.h
+++ b/src/gallium/drivers/softpipe/sp_context.h
@@ -83,6 +83,7 @@ struct softpipe_context {
struct pipe_scissor_state scissors[PIPE_MAX_VIEWPORTS];
struct