diff options
-rw-r--r-- | src/intel/vulkan/genX_pipeline.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c index d2142ae42c2..2a7044a425e 100644 --- a/src/intel/vulkan/genX_pipeline.c +++ b/src/intel/vulkan/genX_pipeline.c @@ -1211,13 +1211,30 @@ emit_3dstate_streamout(struct anv_pipeline *pipeline, hole_dwords -= 4; } + int varying = output->location; + uint8_t component_mask = output->component_mask; + /* VARYING_SLOT_PSIZ contains three scalar fields packed together: + * - VARYING_SLOT_LAYER in VARYING_SLOT_PSIZ.y + * - VARYING_SLOT_VIEWPORT in VARYING_SLOT_PSIZ.z + * - VARYING_SLOT_PSIZ in VARYING_SLOT_PSIZ.w + */ + if (varying == VARYING_SLOT_LAYER) { + varying = VARYING_SLOT_PSIZ; + component_mask = 1 << 1; // SO_DECL_COMPMASK_Y + } else if (varying == VARYING_SLOT_VIEWPORT) { + varying = VARYING_SLOT_PSIZ; + component_mask = 1 << 2; // SO_DECL_COMPMASK_Z + } else if (varying == VARYING_SLOT_PSIZ) { + component_mask = 1 << 3; // SO_DECL_COMPMASK_W + } + next_offset[buffer] = output->offset + - __builtin_popcount(output->component_mask) * 4; + __builtin_popcount(component_mask) * 4; so_decl[stream][decls[stream]++] = (struct GENX(SO_DECL)) { .OutputBufferSlot = buffer, - .RegisterIndex = vue_map->varying_to_slot[output->location], - .ComponentMask = output->component_mask, + .RegisterIndex = vue_map->varying_to_slot[varying], + .ComponentMask = component_mask, }; } |