nir: Offset vertex_id by first_vertex instead of base_vertex
base_vertex will be zero for non-indexed calls and in that case we need vertex_id to be offset by the ‘first’ parameter instead. That is what we get with first_vertex. This is true for both GL and Vulkan. The freedreno driver is also setting vertex_id_zero_based on nir_options. In order to avoid breakage this patch switches the relevant code to handle SYSTEM_VALUE_FIRST_VERTEX so that it can retain the same behavior. v2: change a3xx/fd3_emit.c and a4xx/fd4_emit.c from SYSTEM_VALUE_BASE_VERTEX to SYSTEM_VALUE_FIRST_VERTEX (Kenneth). Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Cc: Rob Clark <robdclark@gmail.com> Acked-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:

committed by
Ian Romanick

parent
c4f30a9100
commit
c366f422f0
@@ -115,7 +115,7 @@ convert_block(nir_block *block, nir_builder *b)
|
|||||||
if (b->shader->options->vertex_id_zero_based) {
|
if (b->shader->options->vertex_id_zero_based) {
|
||||||
sysval = nir_iadd(b,
|
sysval = nir_iadd(b,
|
||||||
nir_load_vertex_id_zero_base(b),
|
nir_load_vertex_id_zero_base(b),
|
||||||
nir_load_base_vertex(b));
|
nir_load_first_vertex(b));
|
||||||
} else {
|
} else {
|
||||||
sysval = nir_load_vertex_id(b);
|
sysval = nir_load_vertex_id(b);
|
||||||
}
|
}
|
||||||
|
@@ -374,7 +374,7 @@ fd3_emit_vertex_bufs(struct fd_ringbuffer *ring, struct fd3_emit *emit)
|
|||||||
continue;
|
continue;
|
||||||
if (vp->inputs[i].sysval) {
|
if (vp->inputs[i].sysval) {
|
||||||
switch(vp->inputs[i].slot) {
|
switch(vp->inputs[i].slot) {
|
||||||
case SYSTEM_VALUE_BASE_VERTEX:
|
case SYSTEM_VALUE_FIRST_VERTEX:
|
||||||
/* handled elsewhere */
|
/* handled elsewhere */
|
||||||
break;
|
break;
|
||||||
case SYSTEM_VALUE_VERTEX_ID_ZERO_BASE:
|
case SYSTEM_VALUE_VERTEX_ID_ZERO_BASE:
|
||||||
|
@@ -378,7 +378,7 @@ fd4_emit_vertex_bufs(struct fd_ringbuffer *ring, struct fd4_emit *emit)
|
|||||||
continue;
|
continue;
|
||||||
if (vp->inputs[i].sysval) {
|
if (vp->inputs[i].sysval) {
|
||||||
switch(vp->inputs[i].slot) {
|
switch(vp->inputs[i].slot) {
|
||||||
case SYSTEM_VALUE_BASE_VERTEX:
|
case SYSTEM_VALUE_FIRST_VERTEX:
|
||||||
/* handled elsewhere */
|
/* handled elsewhere */
|
||||||
break;
|
break;
|
||||||
case SYSTEM_VALUE_VERTEX_ID_ZERO_BASE:
|
case SYSTEM_VALUE_VERTEX_ID_ZERO_BASE:
|
||||||
|
@@ -2182,11 +2182,10 @@ emit_intrinsic(struct ir3_context *ctx, nir_intrinsic_instr *intr)
|
|||||||
ctx->ir->outputs[n] = src[i];
|
ctx->ir->outputs[n] = src[i];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case nir_intrinsic_load_base_vertex:
|
case nir_intrinsic_load_first_vertex:
|
||||||
if (!ctx->basevertex) {
|
if (!ctx->basevertex) {
|
||||||
ctx->basevertex = create_driver_param(ctx, IR3_DP_VTXID_BASE);
|
ctx->basevertex = create_driver_param(ctx, IR3_DP_VTXID_BASE);
|
||||||
add_sysval_input(ctx, SYSTEM_VALUE_BASE_VERTEX,
|
add_sysval_input(ctx, SYSTEM_VALUE_FIRST_VERTEX, ctx->basevertex);
|
||||||
ctx->basevertex);
|
|
||||||
}
|
}
|
||||||
dst[0] = ctx->basevertex;
|
dst[0] = ctx->basevertex;
|
||||||
break;
|
break;
|
||||||
|
@@ -2674,7 +2674,6 @@ void genX(CmdDraw)(
|
|||||||
genX(cmd_buffer_flush_state)(cmd_buffer);
|
genX(cmd_buffer_flush_state)(cmd_buffer);
|
||||||
|
|
||||||
if (vs_prog_data->uses_firstvertex ||
|
if (vs_prog_data->uses_firstvertex ||
|
||||||
vs_prog_data->uses_basevertex ||
|
|
||||||
vs_prog_data->uses_baseinstance)
|
vs_prog_data->uses_baseinstance)
|
||||||
emit_base_vertex_instance(cmd_buffer, firstVertex, firstInstance);
|
emit_base_vertex_instance(cmd_buffer, firstVertex, firstInstance);
|
||||||
if (vs_prog_data->uses_drawid)
|
if (vs_prog_data->uses_drawid)
|
||||||
@@ -2714,7 +2713,6 @@ void genX(CmdDrawIndexed)(
|
|||||||
genX(cmd_buffer_flush_state)(cmd_buffer);
|
genX(cmd_buffer_flush_state)(cmd_buffer);
|
||||||
|
|
||||||
if (vs_prog_data->uses_firstvertex ||
|
if (vs_prog_data->uses_firstvertex ||
|
||||||
vs_prog_data->uses_basevertex ||
|
|
||||||
vs_prog_data->uses_baseinstance)
|
vs_prog_data->uses_baseinstance)
|
||||||
emit_base_vertex_instance(cmd_buffer, vertexOffset, firstInstance);
|
emit_base_vertex_instance(cmd_buffer, vertexOffset, firstInstance);
|
||||||
if (vs_prog_data->uses_drawid)
|
if (vs_prog_data->uses_drawid)
|
||||||
@@ -2855,7 +2853,6 @@ void genX(CmdDrawIndirect)(
|
|||||||
uint32_t bo_offset = buffer->offset + offset;
|
uint32_t bo_offset = buffer->offset + offset;
|
||||||
|
|
||||||
if (vs_prog_data->uses_firstvertex ||
|
if (vs_prog_data->uses_firstvertex ||
|
||||||
vs_prog_data->uses_basevertex ||
|
|
||||||
vs_prog_data->uses_baseinstance)
|
vs_prog_data->uses_baseinstance)
|
||||||
emit_base_vertex_instance_bo(cmd_buffer, bo, bo_offset + 8);
|
emit_base_vertex_instance_bo(cmd_buffer, bo, bo_offset + 8);
|
||||||
if (vs_prog_data->uses_drawid)
|
if (vs_prog_data->uses_drawid)
|
||||||
@@ -2896,7 +2893,6 @@ void genX(CmdDrawIndexedIndirect)(
|
|||||||
|
|
||||||
/* TODO: We need to stomp base vertex to 0 somehow */
|
/* TODO: We need to stomp base vertex to 0 somehow */
|
||||||
if (vs_prog_data->uses_firstvertex ||
|
if (vs_prog_data->uses_firstvertex ||
|
||||||
vs_prog_data->uses_basevertex ||
|
|
||||||
vs_prog_data->uses_baseinstance)
|
vs_prog_data->uses_baseinstance)
|
||||||
emit_base_vertex_instance_bo(cmd_buffer, bo, bo_offset + 12);
|
emit_base_vertex_instance_bo(cmd_buffer, bo, bo_offset + 12);
|
||||||
if (vs_prog_data->uses_drawid)
|
if (vs_prog_data->uses_drawid)
|
||||||
|
@@ -97,7 +97,6 @@ emit_vertex_input(struct anv_pipeline *pipeline,
|
|||||||
const uint32_t elements_double = double_inputs_read >> VERT_ATTRIB_GENERIC0;
|
const uint32_t elements_double = double_inputs_read >> VERT_ATTRIB_GENERIC0;
|
||||||
const bool needs_svgs_elem = vs_prog_data->uses_vertexid ||
|
const bool needs_svgs_elem = vs_prog_data->uses_vertexid ||
|
||||||
vs_prog_data->uses_instanceid ||
|
vs_prog_data->uses_instanceid ||
|
||||||
vs_prog_data->uses_basevertex ||
|
|
||||||
vs_prog_data->uses_firstvertex ||
|
vs_prog_data->uses_firstvertex ||
|
||||||
vs_prog_data->uses_baseinstance;
|
vs_prog_data->uses_baseinstance;
|
||||||
|
|
||||||
@@ -178,8 +177,7 @@ emit_vertex_input(struct anv_pipeline *pipeline,
|
|||||||
* This means, that if we have BaseInstance, we need BaseVertex as
|
* This means, that if we have BaseInstance, we need BaseVertex as
|
||||||
* well. Just do all or nothing.
|
* well. Just do all or nothing.
|
||||||
*/
|
*/
|
||||||
uint32_t base_ctrl = (vs_prog_data->uses_basevertex ||
|
uint32_t base_ctrl = (vs_prog_data->uses_firstvertex ||
|
||||||
vs_prog_data->uses_firstvertex ||
|
|
||||||
vs_prog_data->uses_baseinstance) ?
|
vs_prog_data->uses_baseinstance) ?
|
||||||
VFCOMP_STORE_SRC : VFCOMP_STORE_0;
|
VFCOMP_STORE_SRC : VFCOMP_STORE_0;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user