intel/compiler: add primitive rate output support
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Caio Oliveira <caio.oliveira@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13739>
This commit is contained in:
parent
cebf284ac1
commit
0cd93c59ef
|
@ -1981,7 +1981,7 @@ static inline int
|
|||
brw_compute_first_urb_slot_required(uint64_t inputs_read,
|
||||
const struct brw_vue_map *prev_stage_vue_map)
|
||||
{
|
||||
if ((inputs_read & (VARYING_BIT_LAYER | VARYING_BIT_VIEWPORT)) == 0) {
|
||||
if ((inputs_read & (VARYING_BIT_LAYER | VARYING_BIT_VIEWPORT | VARYING_BIT_PRIMITIVE_SHADING_RATE)) == 0) {
|
||||
for (int i = 0; i < prev_stage_vue_map->num_slots; i++) {
|
||||
int varying = prev_stage_vue_map->slot_to_varying[i];
|
||||
if (varying > 0 && (inputs_read & BITFIELD64_BIT(varying)) != 0)
|
||||
|
|
|
@ -763,7 +763,7 @@ fs_visitor::emit_urb_writes(const fs_reg &gs_vertex_count)
|
|||
const struct brw_vs_prog_key *vs_key =
|
||||
(const struct brw_vs_prog_key *) this->key;
|
||||
const GLbitfield64 psiz_mask =
|
||||
VARYING_BIT_LAYER | VARYING_BIT_VIEWPORT | VARYING_BIT_PSIZ;
|
||||
VARYING_BIT_LAYER | VARYING_BIT_VIEWPORT | VARYING_BIT_PSIZ | VARYING_BIT_PRIMITIVE_SHADING_RATE;
|
||||
const struct brw_vue_map *vue_map = &vue_prog_data->vue_map;
|
||||
bool flush;
|
||||
fs_reg sources[8];
|
||||
|
@ -844,7 +844,18 @@ fs_visitor::emit_urb_writes(const fs_reg &gs_vertex_count)
|
|||
fs_reg zero(VGRF, alloc.allocate(1), BRW_REGISTER_TYPE_UD);
|
||||
bld.MOV(zero, brw_imm_ud(0u));
|
||||
|
||||
sources[length++] = zero;
|
||||
if (vue_map->slots_valid & VARYING_BIT_PRIMITIVE_SHADING_RATE &&
|
||||
this->outputs[VARYING_SLOT_PRIMITIVE_SHADING_RATE].file != BAD_FILE) {
|
||||
sources[length++] = this->outputs[VARYING_SLOT_PRIMITIVE_SHADING_RATE];
|
||||
} else if (devinfo->has_coarse_pixel_primitive_and_cb) {
|
||||
uint32_t one_fp16 = 0x3C00;
|
||||
fs_reg one_by_one_fp16(VGRF, alloc.allocate(1), BRW_REGISTER_TYPE_UD);
|
||||
bld.MOV(one_by_one_fp16, brw_imm_ud((one_fp16 << 16) | one_fp16));
|
||||
sources[length++] = one_by_one_fp16;
|
||||
} else {
|
||||
sources[length++] = zero;
|
||||
}
|
||||
|
||||
if (vue_map->slots_valid & VARYING_BIT_LAYER)
|
||||
sources[length++] = this->outputs[VARYING_SLOT_LAYER];
|
||||
else
|
||||
|
|
|
@ -86,10 +86,11 @@ brw_compute_vue_map(const struct intel_device_info *devinfo,
|
|||
vue_map->slots_valid = slots_valid;
|
||||
vue_map->separate = separate;
|
||||
|
||||
/* gl_Layer and gl_ViewportIndex don't get their own varying slots -- they
|
||||
* are stored in the first VUE slot (VARYING_SLOT_PSIZ).
|
||||
/* gl_Layer, gl_ViewportIndex & gl_PrimitiveShadingRateEXT don't get their
|
||||
* own varying slots -- they are stored in the first VUE slot
|
||||
* (VARYING_SLOT_PSIZ).
|
||||
*/
|
||||
slots_valid &= ~(VARYING_BIT_LAYER | VARYING_BIT_VIEWPORT);
|
||||
slots_valid &= ~(VARYING_BIT_LAYER | VARYING_BIT_VIEWPORT | VARYING_BIT_PRIMITIVE_SHADING_RATE);
|
||||
|
||||
/* Make sure that the values we store in vue_map->varying_to_slot and
|
||||
* vue_map->slot_to_varying won't overflow the signed chars that are used
|
||||
|
@ -126,7 +127,7 @@ brw_compute_vue_map(const struct intel_device_info *devinfo,
|
|||
assign_vue_slot(vue_map, VARYING_SLOT_POS, slot++);
|
||||
} else {
|
||||
/* There are 8 or 16 DWs (D0-D15) in VUE header on Sandybridge:
|
||||
* dword 0-3 of the header is indices, point width, clip flags.
|
||||
* dword 0-3 of the header is shading rate, indices, point width, clip flags.
|
||||
* dword 4-7 is the 4D space position
|
||||
* dword 8-15 of the vertex header is the user clip distance if
|
||||
* enabled.
|
||||
|
|
Loading…
Reference in New Issue