nvk: Support base instance in instanced draw calls

Vulkan's gl_InstanceIndex is different than OpenGL gl_InstanceID.
For nvk, gl_InstanceIndex is lowered as gl_BaseInstance + gl_InstanceID in nir
code. This means we need to supply base instance to the vertex shader.
We load the value at mme draw time to a root constant, as it seems there
is no existing system value corresponding to this info.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
This commit is contained in:
George Ouzounoudis
2022-11-04 22:28:17 +02:00
committed by Marge Bot
parent b2a52982d1
commit 6f9319f60f
3 changed files with 25 additions and 3 deletions
+6
View File
@@ -21,6 +21,12 @@ struct nvk_push_descriptor_set;
/** Root descriptor table. This gets pushed to the GPU directly */
struct nvk_root_descriptor_table {
union {
struct {
uint32_t base_vertex;
uint32_t base_instance;
uint32_t draw_id;
uint32_t _pad[5];
} draw;
struct {
uint32_t block_size[3];
uint32_t grid_size[3];
+17 -1
View File
@@ -33,7 +33,7 @@ nvk_queue_init_context_draw_state(struct nvk_queue *queue)
{
struct nvk_device *dev = nvk_queue_device(queue);
uint32_t push_data[768];
uint32_t push_data[1024];
struct nv_push push;
nv_push_init(&push, push_data, ARRAY_SIZE(push_data));
struct nv_push *p = &push;
@@ -1433,6 +1433,14 @@ nvk_build_mme_draw(struct mme_builder *b, struct mme_value begin)
struct mme_value first_vertex = mme_load(b);
struct mme_value first_instance = mme_load(b);
// load base instance in root descriptor
const uint32_t base_instance_offset =
nvk_root_descriptor_offset(draw.base_instance);
mme_mthd(b, NV9097_LOAD_CONSTANT_BUFFER_OFFSET);
mme_emit(b, mme_imm(base_instance_offset));
mme_mthd(b, NV9097_LOAD_CONSTANT_BUFFER(0));
mme_emit(b, first_instance);
mme_mthd(b, NV9097_SET_GLOBAL_BASE_VERTEX_INDEX);
mme_emit(b, mme_zero());
@@ -1511,6 +1519,14 @@ nvk_mme_build_draw_indexed(struct mme_builder *b,
struct mme_value vertex_offset = mme_load(b);
struct mme_value first_instance = mme_load(b);
// load base instance in root descriptor
const uint32_t base_instance_offset =
nvk_root_descriptor_offset(draw.base_instance);
mme_mthd(b, NV9097_LOAD_CONSTANT_BUFFER_OFFSET);
mme_emit(b, mme_imm(base_instance_offset));
mme_mthd(b, NV9097_LOAD_CONSTANT_BUFFER(0));
mme_emit(b, first_instance);
mme_mthd(b, NV9097_SET_GLOBAL_BASE_VERTEX_INDEX);
mme_emit(b, vertex_offset);
+2 -2
View File
@@ -668,10 +668,10 @@ nvk_compile_nir(struct nvk_physical_device *device, nir_shader *nir,
info->bin.smemSize = shader->cp.smem_size;
info->dbgFlags = debug_get_num_option("NV50_PROG_DEBUG", 0);
info->optLevel = debug_get_num_option("NV50_PROG_OPTIMIZE", 3);
info->io.auxCBSlot = 15;
info->io.auxCBSlot = 1;
info->io.uboInfoBase = 0;
info->io.drawInfoBase = 0;
if (nir->info.stage == MESA_SHADER_COMPUTE) {
info->io.auxCBSlot = 1;
info->prop.cp.gridInfoBase = 0;
} else {
info->assignSlots = nvc0_program_assign_varying_slots;