i965 gen6: Implement transform feedback pause/resume functionality.
authorPaul Berry <stereotype441@gmail.com>
Wed, 21 Dec 2011 19:04:21 +0000 (11:04 -0800)
committerPaul Berry <stereotype441@gmail.com>
Fri, 23 Dec 2011 17:43:18 +0000 (09:43 -0800)
Although i965 gen6 does not yet support ARB_transform_feedback2 or
NV_transform_feedback2, it needs to support pause/resume functionality
so that meta-ops will work correctly.

Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_draw.c
src/mesa/drivers/dri/i965/brw_gs.c
src/mesa/drivers/dri/i965/gen6_sol.c

index 082bb9aa24a4251d5b9eff200cfc8b8dc6009824..93f27d72cf5393c2143c56b25c7dae1eb5ceee98 100644 (file)
@@ -389,7 +389,8 @@ brw_update_primitive_count(struct brw_context *brw,
 {
    uint32_t count = count_tessellated_primitives(prim);
    brw->sol.primitives_generated += count;
-   if (brw->intel.ctx.TransformFeedback.CurrentObject->Active) {
+   if (brw->intel.ctx.TransformFeedback.CurrentObject->Active &&
+       !brw->intel.ctx.TransformFeedback.CurrentObject->Paused) {
       /* Update brw->sol.svbi_0_max_index to reflect the amount by which the
        * hardware is going to increment SVBI 0 when this drawing operation
        * occurs.  This is necessary because the kernel does not (yet) save and
index 886bf98fb85a5e2a52d4a2fd3614f93e3b7d51f8..850d7b455fc89698006a6e1d7deb1e80cc8e911d 100644 (file)
@@ -183,7 +183,8 @@ static void populate_key( struct brw_context *brw,
    } else if (intel->gen == 6) {
       /* On Gen6, GS is used for transform feedback. */
       /* _NEW_TRANSFORM_FEEDBACK */
-      if (ctx->TransformFeedback.CurrentObject->Active) {
+      if (ctx->TransformFeedback.CurrentObject->Active &&
+          !ctx->TransformFeedback.CurrentObject->Paused) {
          const struct gl_shader_program *shaderprog =
             ctx->Shader.CurrentVertexProgram;
          const struct gl_transform_feedback_info *linked_xfb_info =
index 5d11481cb033cbbe9e56ffe7356efe84dcf76473..32f56d30311a70a890d221467c27feb52938a1ec 100644 (file)
@@ -47,7 +47,8 @@ gen6_update_sol_surfaces(struct brw_context *brw)
 
    for (i = 0; i < BRW_MAX_SOL_BINDINGS; ++i) {
       const int surf_index = SURF_INDEX_SOL_BINDING(i);
-      if (xfb_obj->Active && i < linked_xfb_info->NumOutputs) {
+      if (xfb_obj->Active && !xfb_obj->Paused &&
+          i < linked_xfb_info->NumOutputs) {
          unsigned buffer = linked_xfb_info->Outputs[i].OutputBuffer;
          unsigned buffer_offset =
             xfb_obj->Offset[buffer] / 4 +