From 372c3dcfdb85e9479ef2beee75538cb68b2070b9 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Mon, 29 Jul 2019 10:50:56 +0200 Subject: [PATCH] radv: implement VK_EXT_index_type_uint8 Natively supported on VI+. Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen --- src/amd/vulkan/radv_cmd_buffer.c | 60 +++++++++++++++++++++++++++++++++++---- src/amd/vulkan/radv_device.c | 6 ++++ src/amd/vulkan/radv_extensions.py | 1 + 3 files changed, 61 insertions(+), 6 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index d9783e6..e0ea47b 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -2541,6 +2541,21 @@ struct radv_draw_info { uint64_t strmout_buffer_offset; }; +static uint32_t +radv_get_primitive_reset_index(struct radv_cmd_buffer *cmd_buffer) +{ + switch (cmd_buffer->state.index_type) { + case V_028A7C_VGT_INDEX_8: + return 0xffu; + case V_028A7C_VGT_INDEX_16: + return 0xffffu; + case V_028A7C_VGT_INDEX_32: + return 0xffffffffu; + default: + unreachable("invalid index type"); + } +} + static void si_emit_ia_multi_vgt_param(struct radv_cmd_buffer *cmd_buffer, bool instanced_draw, bool indirect_draw, @@ -2612,7 +2627,7 @@ radv_emit_draw_registers(struct radv_cmd_buffer *cmd_buffer, if (primitive_reset_en) { uint32_t primitive_reset_index = - state->index_type ? 0xffffffffu : 0xffffu; + radv_get_primitive_reset_index(cmd_buffer); if (primitive_reset_index != state->last_primitive_reset_index) { radeon_set_context_reg(cs, @@ -3233,6 +3248,36 @@ void radv_CmdBindVertexBuffers( cmd_buffer->state.dirty |= RADV_CMD_DIRTY_VERTEX_BUFFER; } +static uint32_t +vk_to_index_type(VkIndexType type) +{ + switch (type) { + case VK_INDEX_TYPE_UINT8_EXT: + return V_028A7C_VGT_INDEX_8; + case VK_INDEX_TYPE_UINT16: + return V_028A7C_VGT_INDEX_16; + case VK_INDEX_TYPE_UINT32: + return V_028A7C_VGT_INDEX_32; + default: + unreachable("invalid index type"); + } +} + +static uint32_t +radv_get_vgt_index_size(uint32_t type) +{ + switch (type) { + case V_028A7C_VGT_INDEX_8: + return 1; + case V_028A7C_VGT_INDEX_16: + return 2; + case V_028A7C_VGT_INDEX_32: + return 4; + default: + unreachable("invalid index type"); + } +} + void radv_CmdBindIndexBuffer( VkCommandBuffer commandBuffer, VkBuffer buffer, @@ -3251,12 +3296,12 @@ void radv_CmdBindIndexBuffer( cmd_buffer->state.index_buffer = index_buffer; cmd_buffer->state.index_offset = offset; - cmd_buffer->state.index_type = indexType; /* vk matches hw */ + cmd_buffer->state.index_type = vk_to_index_type(indexType); cmd_buffer->state.index_va = radv_buffer_get_va(index_buffer->bo); cmd_buffer->state.index_va += index_buffer->offset + offset; - int index_size_shift = cmd_buffer->state.index_type ? 2 : 1; - cmd_buffer->state.max_index_count = (index_buffer->size - offset) >> index_size_shift; + int index_size = radv_get_vgt_index_size(indexType); + cmd_buffer->state.max_index_count = (index_buffer->size - offset) / index_size; cmd_buffer->state.dirty |= RADV_CMD_DIRTY_INDEX_BUFFER; radv_cs_add_buffer(cmd_buffer->device->ws, cmd_buffer->cs, index_buffer->bo); } @@ -4275,7 +4320,7 @@ radv_emit_draw_packets(struct radv_cmd_buffer *cmd_buffer, } if (info->indexed) { - int index_size = state->index_type ? 4 : 2; + int index_size = radv_get_vgt_index_size(state->index_type); uint64_t index_va; index_va = state->index_va; @@ -4354,8 +4399,11 @@ static bool radv_need_late_scissor_emission(struct radv_cmd_buffer *cmd_buffer, if (cmd_buffer->state.dirty & used_states) return true; + uint32_t primitive_reset_index = + radv_get_primitive_reset_index(cmd_buffer); + if (info->indexed && state->pipeline->graphics.prim_restart_enable && - (state->index_type ? 0xffffffffu : 0xffffu) != state->last_primitive_reset_index) + primitive_reset_index != state->last_primitive_reset_index) return true; return false; diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 9ba100d..65e3ccf 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -987,6 +987,12 @@ void radv_GetPhysicalDeviceFeatures2( features->uniformBufferStandardLayout = true; break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: { + VkPhysicalDeviceIndexTypeUint8FeaturesEXT *features = + (VkPhysicalDeviceIndexTypeUint8FeaturesEXT *)ext; + features->indexTypeUint8 = pdevice->rad_info.chip_class >= GFX8; + break; + } default: break; } diff --git a/src/amd/vulkan/radv_extensions.py b/src/amd/vulkan/radv_extensions.py index 8e1d61d..ec3735c 100644 --- a/src/amd/vulkan/radv_extensions.py +++ b/src/amd/vulkan/radv_extensions.py @@ -115,6 +115,7 @@ EXTENSIONS = [ Extension('VK_EXT_external_memory_host', 1, 'device->rad_info.has_userptr'), Extension('VK_EXT_global_priority', 1, 'device->rad_info.has_ctx_priority'), Extension('VK_EXT_host_query_reset', 1, True), + Extension('VK_EXT_index_type_uint8', 1, 'device->rad_info.chip_class >= GFX8'), Extension('VK_EXT_inline_uniform_block', 1, True), Extension('VK_EXT_memory_budget', 1, True), Extension('VK_EXT_memory_priority', 1, True), -- 2.7.4