diff options
author | Danylo Piliaiev <[email protected]> | 2019-02-01 12:21:38 +0200 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2019-02-04 15:30:43 +0000 |
commit | 64d3b148fe71453c296ba9525f49ffe728171582 (patch) | |
tree | 79cd3b9600802a0f75ae91db2504a062e2e30147 /src/intel/vulkan | |
parent | b7a93cbdede05af6bf5cad0a67d1a6045c52369f (diff) |
anv: Fix VK_EXT_transform_feedback working with varyings packed in PSIZ
Transform feedback did not set correct SO_DECL.ComponentMask for
varyings packed in VARYING_SLOT_PSIZ:
gl_Layer - VARYING_SLOT_LAYER in VARYING_SLOT_PSIZ.y
gl_ViewportIndex - VARYING_SLOT_VIEWPORT in VARYING_SLOT_PSIZ.z
gl_PointSize - VARYING_SLOT_PSIZ in VARYING_SLOT_PSIZ.w
Fixes: 36ee2fd61c8f94 "anv: Implement the basic form of VK_EXT_transform_feedback"
Signed-off-by: Danylo Piliaiev <[email protected]>
Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/intel/vulkan')
-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, }; } |