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;
} 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 =
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 */
+ /* _NEW_RASTERIZER_DISCARD */
if (ctx->RasterDiscard) {
key->need_gs_prog = true;
key->rasterizer_discard = true;
.dirty = {
.mesa = (_NEW_LIGHT |
_NEW_TRANSFORM |
- _NEW_TRANSFORM_FEEDBACK),
+ _NEW_TRANSFORM_FEEDBACK |
+ _NEW_RASTERIZER_DISCARD),
.brw = BRW_NEW_PRIMITIVE,
.cache = CACHE_NEW_VS_PROG
},