Re: [Mesa-dev] [PATCH 29/37] i965/gen6/gs: Setup SOL surfaces for user-provided geometry shaders

2014-09-18 Thread Jordan Justen
On Thu, Aug 14, 2014 at 4:12 AM, Iago Toral Quiroga ito...@igalia.com wrote:
 From: Samuel Iglesias Gonsalvez sigles...@igalia.com

 Update gen6_gs_binding_table and gen6_sol_surface to use user-provided
 geometry program information when present. This is necessary to implement
 transform feedback support.

 Signed-off-by: Samuel Iglesias Gonsalvez sigles...@igalia.com
 ---
  src/mesa/drivers/dri/i965/brw_context.h |   2 +-
  src/mesa/drivers/dri/i965/gen6_sol.c| 119 
 ++--
  2 files changed, 82 insertions(+), 39 deletions(-)

 diff --git a/src/mesa/drivers/dri/i965/brw_context.h 
 b/src/mesa/drivers/dri/i965/brw_context.h
 index 3418b76..82f32af 100644
 --- a/src/mesa/drivers/dri/i965/brw_context.h
 +++ b/src/mesa/drivers/dri/i965/brw_context.h
 @@ -914,7 +914,7 @@ struct brw_stage_state
 uint32_t push_const_offset; /* Offset in the batchbuffer */
 int push_const_size; /* in 256-bit register increments */

 -   /* Binding table: pointers to SURFACE_STATE entries. */
 +   /** Binding table: pointers to SURFACE_STATE entries. */

Shouldn't be part of this patch. With it removed:
Reviewed-by: Jordan Justen jordan.l.jus...@intel.com

 uint32_t bind_bo_offset;
 uint32_t surf_offset[BRW_MAX_SURFACES];

 diff --git a/src/mesa/drivers/dri/i965/gen6_sol.c 
 b/src/mesa/drivers/dri/i965/gen6_sol.c
 index e1c1b3c..d21a010 100644
 --- a/src/mesa/drivers/dri/i965/gen6_sol.c
 +++ b/src/mesa/drivers/dri/i965/gen6_sol.c
 @@ -41,13 +41,21 @@ gen6_update_sol_surfaces(struct brw_context *brw)
 /* BRW_NEW_TRANSFORM_FEEDBACK */
 struct gl_transform_feedback_object *xfb_obj =
ctx-TransformFeedback.CurrentObject;
 -   /* BRW_NEW_VERTEX_PROGRAM */
 -   const struct gl_shader_program *shaderprog =
 -  ctx-_Shader-CurrentProgram[MESA_SHADER_VERTEX];
 -   const struct gl_transform_feedback_info *linked_xfb_info =
 -  shaderprog-LinkedTransformFeedback;
 +   const struct gl_shader_program *shaderprog;
 +   const struct gl_transform_feedback_info *linked_xfb_info;
 int i;

 +   if (brw-geometry_program) {
 +  /* BRW_NEW_GEOMETRY_PROGRAM */
 +  shaderprog =
 + ctx-_Shader-CurrentProgram[MESA_SHADER_GEOMETRY];
 +   } else {
 +  /* BRW_NEW_VERTEX_PROGRAM */
 +  shaderprog =
 + ctx-_Shader-CurrentProgram[MESA_SHADER_VERTEX];
 +   }
 +   linked_xfb_info = shaderprog-LinkedTransformFeedback;
 +
 for (i = 0; i  BRW_MAX_SOL_BINDINGS; ++i) {
const int surf_index = SURF_INDEX_GEN6_SOL_BINDING(i);
if (_mesa_is_xfb_active_and_unpaused(ctx) 
 @@ -56,12 +64,24 @@ gen6_update_sol_surfaces(struct brw_context *brw)
   unsigned buffer_offset =
  xfb_obj-Offset[buffer] / 4 +
  linked_xfb_info-Outputs[i].DstOffset;
 - brw_update_sol_surface(
 -brw, xfb_obj-Buffers[buffer], 
 brw-ff_gs.surf_offset[surf_index],
 -linked_xfb_info-Outputs[i].NumComponents,
 -linked_xfb_info-BufferStride[buffer], buffer_offset);
 + if (brw-geometry_program) {
 +brw_update_sol_surface(
 +   brw, xfb_obj-Buffers[buffer],
 +   brw-gs.base.surf_offset[surf_index],
 +   linked_xfb_info-Outputs[i].NumComponents,
 +   linked_xfb_info-BufferStride[buffer], buffer_offset);
 + } else {
 +brw_update_sol_surface(
 +   brw, xfb_obj-Buffers[buffer],
 +   brw-ff_gs.surf_offset[surf_index],
 +   linked_xfb_info-Outputs[i].NumComponents,
 +   linked_xfb_info-BufferStride[buffer], buffer_offset);
 + }
} else {
 - brw-ff_gs.surf_offset[surf_index] = 0;
 + if (!brw-geometry_program)
 +brw-ff_gs.surf_offset[surf_index] = 0;
 + else
 +brw-gs.base.surf_offset[surf_index] = 0;
}
 }

 @@ -73,6 +93,7 @@ const struct brw_tracked_state gen6_sol_surface = {
.mesa = 0,
.brw = (BRW_NEW_BATCH |
BRW_NEW_VERTEX_PROGRAM |
 +  BRW_NEW_GEOMETRY_PROGRAM |
BRW_NEW_TRANSFORM_FEEDBACK),
.cache = 0
 },
 @@ -86,38 +107,50 @@ const struct brw_tracked_state gen6_sol_surface = {
  static void
  brw_gs_upload_binding_table(struct brw_context *brw)
  {
 -   struct gl_context *ctx = brw-ctx;
 -   /* BRW_NEW_VERTEX_PROGRAM */
 -   const struct gl_shader_program *shaderprog =
 -  ctx-_Shader-CurrentProgram[MESA_SHADER_VERTEX];
 -   bool has_surfaces = false;
 uint32_t *bind;

 -   if (shaderprog) {
 -  const struct gl_transform_feedback_info *linked_xfb_info =
 -shaderprog-LinkedTransformFeedback;
 -  /* Currently we only ever upload surfaces for SOL. */
 -  has_surfaces = linked_xfb_info-NumOutputs != 0;
 -   }
 +   if (!brw-geometry_program) {
 +  struct gl_context *ctx = brw-ctx;
 +  /* BRW_NEW_VERTEX_PROGRAM */
 +  const struct gl_shader_program *shaderprog =
 + 

[Mesa-dev] [PATCH 29/37] i965/gen6/gs: Setup SOL surfaces for user-provided geometry shaders

2014-08-14 Thread Iago Toral Quiroga
From: Samuel Iglesias Gonsalvez sigles...@igalia.com

Update gen6_gs_binding_table and gen6_sol_surface to use user-provided
geometry program information when present. This is necessary to implement
transform feedback support.

Signed-off-by: Samuel Iglesias Gonsalvez sigles...@igalia.com
---
 src/mesa/drivers/dri/i965/brw_context.h |   2 +-
 src/mesa/drivers/dri/i965/gen6_sol.c| 119 ++--
 2 files changed, 82 insertions(+), 39 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_context.h 
b/src/mesa/drivers/dri/i965/brw_context.h
index 3418b76..82f32af 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -914,7 +914,7 @@ struct brw_stage_state
uint32_t push_const_offset; /* Offset in the batchbuffer */
int push_const_size; /* in 256-bit register increments */
 
-   /* Binding table: pointers to SURFACE_STATE entries. */
+   /** Binding table: pointers to SURFACE_STATE entries. */
uint32_t bind_bo_offset;
uint32_t surf_offset[BRW_MAX_SURFACES];
 
diff --git a/src/mesa/drivers/dri/i965/gen6_sol.c 
b/src/mesa/drivers/dri/i965/gen6_sol.c
index e1c1b3c..d21a010 100644
--- a/src/mesa/drivers/dri/i965/gen6_sol.c
+++ b/src/mesa/drivers/dri/i965/gen6_sol.c
@@ -41,13 +41,21 @@ gen6_update_sol_surfaces(struct brw_context *brw)
/* BRW_NEW_TRANSFORM_FEEDBACK */
struct gl_transform_feedback_object *xfb_obj =
   ctx-TransformFeedback.CurrentObject;
-   /* BRW_NEW_VERTEX_PROGRAM */
-   const struct gl_shader_program *shaderprog =
-  ctx-_Shader-CurrentProgram[MESA_SHADER_VERTEX];
-   const struct gl_transform_feedback_info *linked_xfb_info =
-  shaderprog-LinkedTransformFeedback;
+   const struct gl_shader_program *shaderprog;
+   const struct gl_transform_feedback_info *linked_xfb_info;
int i;
 
+   if (brw-geometry_program) {
+  /* BRW_NEW_GEOMETRY_PROGRAM */
+  shaderprog =
+ ctx-_Shader-CurrentProgram[MESA_SHADER_GEOMETRY];
+   } else {
+  /* BRW_NEW_VERTEX_PROGRAM */
+  shaderprog =
+ ctx-_Shader-CurrentProgram[MESA_SHADER_VERTEX];
+   }
+   linked_xfb_info = shaderprog-LinkedTransformFeedback;
+
for (i = 0; i  BRW_MAX_SOL_BINDINGS; ++i) {
   const int surf_index = SURF_INDEX_GEN6_SOL_BINDING(i);
   if (_mesa_is_xfb_active_and_unpaused(ctx) 
@@ -56,12 +64,24 @@ gen6_update_sol_surfaces(struct brw_context *brw)
  unsigned buffer_offset =
 xfb_obj-Offset[buffer] / 4 +
 linked_xfb_info-Outputs[i].DstOffset;
- brw_update_sol_surface(
-brw, xfb_obj-Buffers[buffer], brw-ff_gs.surf_offset[surf_index],
-linked_xfb_info-Outputs[i].NumComponents,
-linked_xfb_info-BufferStride[buffer], buffer_offset);
+ if (brw-geometry_program) {
+brw_update_sol_surface(
+   brw, xfb_obj-Buffers[buffer],
+   brw-gs.base.surf_offset[surf_index],
+   linked_xfb_info-Outputs[i].NumComponents,
+   linked_xfb_info-BufferStride[buffer], buffer_offset);
+ } else {
+brw_update_sol_surface(
+   brw, xfb_obj-Buffers[buffer],
+   brw-ff_gs.surf_offset[surf_index],
+   linked_xfb_info-Outputs[i].NumComponents,
+   linked_xfb_info-BufferStride[buffer], buffer_offset);
+ }
   } else {
- brw-ff_gs.surf_offset[surf_index] = 0;
+ if (!brw-geometry_program)
+brw-ff_gs.surf_offset[surf_index] = 0;
+ else
+brw-gs.base.surf_offset[surf_index] = 0;
   }
}
 
@@ -73,6 +93,7 @@ const struct brw_tracked_state gen6_sol_surface = {
   .mesa = 0,
   .brw = (BRW_NEW_BATCH |
   BRW_NEW_VERTEX_PROGRAM |
+  BRW_NEW_GEOMETRY_PROGRAM |
   BRW_NEW_TRANSFORM_FEEDBACK),
   .cache = 0
},
@@ -86,38 +107,50 @@ const struct brw_tracked_state gen6_sol_surface = {
 static void
 brw_gs_upload_binding_table(struct brw_context *brw)
 {
-   struct gl_context *ctx = brw-ctx;
-   /* BRW_NEW_VERTEX_PROGRAM */
-   const struct gl_shader_program *shaderprog =
-  ctx-_Shader-CurrentProgram[MESA_SHADER_VERTEX];
-   bool has_surfaces = false;
uint32_t *bind;
 
-   if (shaderprog) {
-  const struct gl_transform_feedback_info *linked_xfb_info =
-shaderprog-LinkedTransformFeedback;
-  /* Currently we only ever upload surfaces for SOL. */
-  has_surfaces = linked_xfb_info-NumOutputs != 0;
-   }
+   if (!brw-geometry_program) {
+  struct gl_context *ctx = brw-ctx;
+  /* BRW_NEW_VERTEX_PROGRAM */
+  const struct gl_shader_program *shaderprog =
+ ctx-_Shader-CurrentProgram[MESA_SHADER_VERTEX];
+  bool has_surfaces = false;
+
+  if (shaderprog) {
+ const struct gl_transform_feedback_info *linked_xfb_info =
+shaderprog-LinkedTransformFeedback;
+ /* Currently we only ever upload surfaces for SOL. */
+ has_surfaces =