intel/compiler: handle gl_Viewport and gl_Layer in FS URB setup

Reviewed-by: Caio Oliveira <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16493>
This commit is contained in:
Marcin Ślusarz
2022-02-25 16:35:26 +01:00
committed by Marge Bot
parent 040062df41
commit 65ff6932dc

View File

@@ -1796,8 +1796,36 @@ calculate_urb_setup(const struct intel_device_info *devinfo,
* into real HW registers.
*/
if (nir->info.per_primitive_inputs) {
uint64_t per_prim_inputs_read =
nir->info.inputs_read & nir->info.per_primitive_inputs;
/* In Mesh, VIEWPORT and LAYER slots are always at the beginning,
* because they come from MUE Primitive Header, not Per-Primitive Attributes.
*/
const uint64_t primitive_header_bits = VARYING_BIT_VIEWPORT |
VARYING_BIT_LAYER;
if (per_prim_inputs_read & primitive_header_bits) {
/* Layer and Viewport live in the same 4-dwords slot (layer
* is dword 1, and viewport is dword 2).
*/
if (per_prim_inputs_read & VARYING_BIT_LAYER)
prog_data->urb_setup[VARYING_SLOT_LAYER] = 0;
if (per_prim_inputs_read & VARYING_BIT_VIEWPORT)
prog_data->urb_setup[VARYING_SLOT_VIEWPORT] = 0;
/* 3DSTATE_SBE_MESH.Per[Primitive|Vertex]URBEntryOutputRead[Offset|Length]
* are in full GRFs (8 dwords) and MUE Primitive Header is 8 dwords,
* so next per-primitive attribute must be placed in slot 2 (each slot
* is 4 dwords long).
*/
urb_next = 2;
per_prim_inputs_read &= ~primitive_header_bits;
}
for (unsigned i = 0; i < VARYING_SLOT_MAX; i++) {
if (nir->info.per_primitive_inputs & BITFIELD64_BIT(i)) {
if (per_prim_inputs_read & BITFIELD64_BIT(i)) {
prog_data->urb_setup[i] = urb_next++;
}
}