From b7acd1030d3d722d1a47b0f004d8fb0c6aa46572 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Mon, 15 Aug 2022 15:56:47 +1000 Subject: [PATCH] nvk: add indexed draw support. This passes the dEQP-VK.draw.renderpass.basic_draw.draw_indexed* tests for me on Turing Part-of: --- src/nouveau/vulkan/nvk_cmd_draw.c | 39 +++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/nouveau/vulkan/nvk_cmd_draw.c b/src/nouveau/vulkan/nvk_cmd_draw.c index 8bf193718e2..d1bbfcb78b5 100644 --- a/src/nouveau/vulkan/nvk_cmd_draw.c +++ b/src/nouveau/vulkan/nvk_cmd_draw.c @@ -1324,3 +1324,42 @@ nvk_CmdDraw(VkCommandBuffer commandBuffer, P_IMMD(p, NV9097, END, 0); } } + +VKAPI_ATTR void VKAPI_CALL +nvk_CmdDrawIndexed(VkCommandBuffer commandBuffer, + uint32_t indexCount, + uint32_t instanceCount, + uint32_t firstIndex, + int32_t vertexOffset, + uint32_t firstInstance) +{ + VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer); + const struct vk_dynamic_graphics_state *dyn = + &cmd->vk.dynamic_graphics_state; + struct nouveau_ws_push *p = cmd->push; + + nvk_flush_gfx_state(cmd); + + const uint32_t begin_op = + vk_to_nv9097_primitive_topology(dyn->ia.primitive_topology); + + P_IMMD(p, NV9097, SET_GLOBAL_BASE_VERTEX_INDEX, vertexOffset); + P_IMMD(p, NV9097, SET_VERTEX_ID_BASE, vertexOffset); + P_IMMD(p, NV9097, SET_GLOBAL_BASE_INSTANCE_INDEX, firstInstance); + + for (unsigned i = 0; i < instanceCount; i++) { + P_IMMD(p, NV9097, BEGIN, { + .op = begin_op, + .primitive_id = NV9097_BEGIN_PRIMITIVE_ID_FIRST, + .instance_id = (i == 0) ? NV9097_BEGIN_INSTANCE_ID_FIRST : + NV9097_BEGIN_INSTANCE_ID_SUBSEQUENT, + .split_mode = SPLIT_MODE_NORMAL_BEGIN_NORMAL_END, + }); + + P_MTHD(p, NV9097, SET_INDEX_BUFFER_F); + P_NV9097_SET_INDEX_BUFFER_F(p, firstIndex); + P_NV9097_DRAW_INDEX_BUFFER(p, indexCount); + + P_IMMD(p, NV9097, END, 0); + } +}