mesa: add/update comments in _mesa_copy_buffer_subdata()
[mesa.git] / src / mesa / drivers / dri / i965 / brw_gs.c
index ee3f94ca613e7b1cdfda47f6f293c6add0127c9e..f9c4f6aa0141dc69875dabf16494bd89bb48b3b5 100644 (file)
@@ -154,6 +154,13 @@ static void compile_gs_prog( struct brw_context *brw,
 static void populate_key( struct brw_context *brw,
                          struct brw_gs_prog_key *key )
 {
+   static const unsigned swizzle_for_offset[4] = {
+      BRW_SWIZZLE4(0, 1, 2, 3),
+      BRW_SWIZZLE4(1, 2, 3, 3),
+      BRW_SWIZZLE4(2, 3, 3, 3),
+      BRW_SWIZZLE4(3, 3, 3, 3)
+   };
+
    struct gl_context *ctx = &brw->intel.ctx;
    struct intel_context *intel = &brw->intel;
 
@@ -183,7 +190,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 =
@@ -206,11 +214,13 @@ static void populate_key( struct brw_context *brw,
          for (i = 0; i < key->num_transform_feedback_bindings; ++i) {
             key->transform_feedback_bindings[i] =
                linked_xfb_info->Outputs[i].OutputRegister;
+            key->transform_feedback_swizzles[i] =
+               swizzle_for_offset[linked_xfb_info->Outputs[i].ComponentOffset];
          }
       }
       /* On Gen6, GS is also used for rasterizer discard. */
-      /* _NEW_TRANSFORM_FEEDBACK */
-      if (ctx->TransformFeedback.RasterDiscard) {
+      /* _NEW_RASTERIZER_DISCARD */
+      if (ctx->RasterDiscard) {
          key->need_gs_prog = true;
          key->rasterizer_discard = true;
       }
@@ -258,7 +268,8 @@ const struct brw_tracked_state brw_gs_prog = {
    .dirty = {
       .mesa  = (_NEW_LIGHT |
                 _NEW_TRANSFORM |
-                _NEW_TRANSFORM_FEEDBACK),
+                _NEW_TRANSFORM_FEEDBACK |
+                _NEW_RASTERIZER_DISCARD),
       .brw   = BRW_NEW_PRIMITIVE,
       .cache = CACHE_NEW_VS_PROG
    },