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: 36ee2fd61c
"anv: Implement the basic form of VK_EXT_transform_feedback"
Signed-off-by: Danylo Piliaiev <danylo.piliaiev@globallogic.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
parent
b7a93cbded
commit
64d3b148fe
|
@ -1211,13 +1211,30 @@ emit_3dstate_streamout(struct anv_pipeline *pipeline,
|
||||||
hole_dwords -= 4;
|
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 +
|
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)) {
|
so_decl[stream][decls[stream]++] = (struct GENX(SO_DECL)) {
|
||||||
.OutputBufferSlot = buffer,
|
.OutputBufferSlot = buffer,
|
||||||
.RegisterIndex = vue_map->varying_to_slot[output->location],
|
.RegisterIndex = vue_map->varying_to_slot[varying],
|
||||||
.ComponentMask = output->component_mask,
|
.ComponentMask = component_mask,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue