nir: Offset vertex_id by first_vertex instead of base_vertex
authorNeil Roberts <nroberts@igalia.com>
Thu, 25 Jan 2018 18:15:43 +0000 (19:15 +0100)
committerIan Romanick <ian.d.romanick@intel.com>
Thu, 19 Apr 2018 22:57:45 +0000 (15:57 -0700)
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>
src/compiler/nir/nir_lower_system_values.c
src/gallium/drivers/freedreno/a3xx/fd3_emit.c
src/gallium/drivers/freedreno/a4xx/fd4_emit.c
src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c
src/intel/vulkan/genX_cmd_buffer.c
src/intel/vulkan/genX_pipeline.c

index 40e0f85deeae1c3cc9108b3a4e00f996c25dec92..47709e9887b1a4799f75bb8a5e14f58dc210b88b 100644 (file)
@@ -115,7 +115,7 @@ convert_block(nir_block *block, nir_builder *b)
          if (b->shader->options->vertex_id_zero_based) {
             sysval = nir_iadd(b,
                               nir_load_vertex_id_zero_base(b),
-                              nir_load_base_vertex(b));
+                              nir_load_first_vertex(b));
          } else {
             sysval = nir_load_vertex_id(b);
          }
index b9e1af00e2c8404eca057563cac5e2b21e046d7a..3419ba86d46dde69e68ca080c952f888c13b422d 100644 (file)
@@ -374,7 +374,7 @@ fd3_emit_vertex_bufs(struct fd_ringbuffer *ring, struct fd3_emit *emit)
                        continue;
                if (vp->inputs[i].sysval) {
                        switch(vp->inputs[i].slot) {
-                       case SYSTEM_VALUE_BASE_VERTEX:
+                       case SYSTEM_VALUE_FIRST_VERTEX:
                                /* handled elsewhere */
                                break;
                        case SYSTEM_VALUE_VERTEX_ID_ZERO_BASE:
index 5fec2b6b08a471c8b6483bdf2e629ddbb8e50bf4..42268ceea71c65c72cbc620101bd664ffbe6115f 100644 (file)
@@ -378,7 +378,7 @@ fd4_emit_vertex_bufs(struct fd_ringbuffer *ring, struct fd4_emit *emit)
                        continue;
                if (vp->inputs[i].sysval) {
                        switch(vp->inputs[i].slot) {
-                       case SYSTEM_VALUE_BASE_VERTEX:
+                       case SYSTEM_VALUE_FIRST_VERTEX:
                                /* handled elsewhere */
                                break;
                        case SYSTEM_VALUE_VERTEX_ID_ZERO_BASE:
index 174141b7fecd80b440f784aa0bbdc6c532f5b835..356d1bc44ee17f304d13c2bc6ff6ae817bb7ac85 100644 (file)
@@ -2182,11 +2182,10 @@ emit_intrinsic(struct ir3_context *ctx, nir_intrinsic_instr *intr)
                        ctx->ir->outputs[n] = src[i];
                }
                break;
-       case nir_intrinsic_load_base_vertex:
+       case nir_intrinsic_load_first_vertex:
                if (!ctx->basevertex) {
                        ctx->basevertex = create_driver_param(ctx, IR3_DP_VTXID_BASE);
-                       add_sysval_input(ctx, SYSTEM_VALUE_BASE_VERTEX,
-                                       ctx->basevertex);
+                       add_sysval_input(ctx, SYSTEM_VALUE_FIRST_VERTEX, ctx->basevertex);
                }
                dst[0] = ctx->basevertex;
                break;
index be4e9a694262959eebe2454dae386990d83c959c..2882cf365064046a09565789c2059c70f821ec08 100644 (file)
@@ -2674,7 +2674,6 @@ void genX(CmdDraw)(
    genX(cmd_buffer_flush_state)(cmd_buffer);
 
    if (vs_prog_data->uses_firstvertex ||
-       vs_prog_data->uses_basevertex ||
        vs_prog_data->uses_baseinstance)
       emit_base_vertex_instance(cmd_buffer, firstVertex, firstInstance);
    if (vs_prog_data->uses_drawid)
@@ -2714,7 +2713,6 @@ void genX(CmdDrawIndexed)(
    genX(cmd_buffer_flush_state)(cmd_buffer);
 
    if (vs_prog_data->uses_firstvertex ||
-       vs_prog_data->uses_basevertex ||
        vs_prog_data->uses_baseinstance)
       emit_base_vertex_instance(cmd_buffer, vertexOffset, firstInstance);
    if (vs_prog_data->uses_drawid)
@@ -2855,7 +2853,6 @@ void genX(CmdDrawIndirect)(
       uint32_t bo_offset = buffer->offset + offset;
 
       if (vs_prog_data->uses_firstvertex ||
-          vs_prog_data->uses_basevertex ||
           vs_prog_data->uses_baseinstance)
          emit_base_vertex_instance_bo(cmd_buffer, bo, bo_offset + 8);
       if (vs_prog_data->uses_drawid)
@@ -2896,7 +2893,6 @@ void genX(CmdDrawIndexedIndirect)(
 
       /* TODO: We need to stomp base vertex to 0 somehow */
       if (vs_prog_data->uses_firstvertex ||
-          vs_prog_data->uses_basevertex ||
           vs_prog_data->uses_baseinstance)
          emit_base_vertex_instance_bo(cmd_buffer, bo, bo_offset + 12);
       if (vs_prog_data->uses_drawid)
index a473f42c7e1161c45ca912dfa21fdff965744bc9..d3af9304ba3c5ab0301213c467bee7850b9a4c95 100644 (file)
@@ -97,7 +97,6 @@ emit_vertex_input(struct anv_pipeline *pipeline,
    const uint32_t elements_double = double_inputs_read >> VERT_ATTRIB_GENERIC0;
    const bool needs_svgs_elem = vs_prog_data->uses_vertexid ||
                                 vs_prog_data->uses_instanceid ||
-                                vs_prog_data->uses_basevertex ||
                                 vs_prog_data->uses_firstvertex ||
                                 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
        * well.  Just do all or nothing.
        */
-      uint32_t base_ctrl = (vs_prog_data->uses_basevertex ||
-                            vs_prog_data->uses_firstvertex ||
+      uint32_t base_ctrl = (vs_prog_data->uses_firstvertex ||
                             vs_prog_data->uses_baseinstance) ?
                            VFCOMP_STORE_SRC : VFCOMP_STORE_0;