diff --git a/docs/features.txt b/docs/features.txt index 0b5845ccaec..e4378f0f45d 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -521,7 +521,7 @@ Khronos extensions that are not part of any Vulkan version: VK_KHR_get_surface_capabilities2 DONE (anv, lvp, nvk, pvr, radv, tu, v3dv, vn) VK_KHR_global_priority DONE (anv, radv, tu) VK_KHR_incremental_present DONE (anv, hasvk, lvp, nvk, radv, tu, v3dv, vn) - VK_KHR_index_type_uint8 DONE (anv, nvk, radv, tu, v3dv) + VK_KHR_index_type_uint8 DONE (anv, nvk, pvr, radv, tu, v3dv) VK_KHR_line_rasterization DONE (anv, nvk, radv, tu, v3dv) VK_KHR_load_store_op_none DONE (anv, nvk, radv, tu, v3dv) VK_KHR_maintenance5 DONE (anv, lvp, nvk, radv, tu) @@ -592,7 +592,7 @@ Khronos extensions that are not part of any Vulkan version: VK_EXT_image_drm_format_modifier DONE (anv, hasvk, radv/gfx9+, tu, v3dv, vn) VK_EXT_image_sliced_view_of_3d DONE (anv, nvk, radv/gfx10+) VK_EXT_image_view_min_lod DONE (anv, hasvk, nvk, radv, tu, vn) - VK_EXT_index_type_uint8 DONE (anv, hasvk, nvk, lvp, panvk, radv/gfx8+, tu, v3dv, vn) + VK_EXT_index_type_uint8 DONE (anv, hasvk, nvk, lvp, panvk, pvr, radv/gfx8+, tu, v3dv, vn) VK_EXT_line_rasterization DONE (anv, hasvk, nvk, lvp, radv, tu, v3dv, vn) VK_EXT_load_store_op_none DONE (anv, nvk, radv, tu, v3dv, vn) VK_EXT_memory_budget DONE (anv, hasvk, lvp, nvk, pvr, radv, tu, v3dv, vn) diff --git a/src/imagination/vulkan/pvr_cmd_buffer.c b/src/imagination/vulkan/pvr_cmd_buffer.c index 482cfc9f2f1..f3e3a560b08 100644 --- a/src/imagination/vulkan/pvr_cmd_buffer.c +++ b/src/imagination/vulkan/pvr_cmd_buffer.c @@ -2689,7 +2689,8 @@ void pvr_CmdBindIndexBuffer(VkCommandBuffer commandBuffer, assert(offset < index_buffer->vk.size); assert(indexType == VK_INDEX_TYPE_UINT32 || - indexType == VK_INDEX_TYPE_UINT16); + indexType == VK_INDEX_TYPE_UINT16 || + indexType == VK_INDEX_TYPE_UINT8_KHR); PVR_CHECK_COMMAND_BUFFER_BUILDING_STATE(cmd_buffer); @@ -6184,22 +6185,8 @@ static void pvr_emit_dirty_vdm_state(struct pvr_cmd_buffer *const cmd_buffer, if (header.cut_index_present) { pvr_csb_emit (csb, VDMCTRL_VDM_STATE1, state1) { - switch (state->index_buffer_binding.type) { - case VK_INDEX_TYPE_UINT32: - /* FIXME: Defines for these? These seem to come from the Vulkan - * spec. for VkPipelineInputAssemblyStateCreateInfo - * primitiveRestartEnable. - */ - state1.cut_index = 0xFFFFFFFF; - break; - - case VK_INDEX_TYPE_UINT16: - state1.cut_index = 0xFFFF; - break; - - default: - unreachable("Invalid index type"); - } + state1.cut_index = + vk_index_to_restart(state->index_buffer_binding.type); } } @@ -6683,20 +6670,9 @@ static void pvr_emit_vdm_index_list(struct pvr_cmd_buffer *cmd_buffer, list_hdr.index_offset_present = true; if (state->draw_state.draw_indexed) { - switch (state->index_buffer_binding.type) { - case VK_INDEX_TYPE_UINT32: - list_hdr.index_size = PVRX(VDMCTRL_INDEX_SIZE_B32); - index_stride = 4; - break; - - case VK_INDEX_TYPE_UINT16: - list_hdr.index_size = PVRX(VDMCTRL_INDEX_SIZE_B16); - index_stride = 2; - break; - - default: - unreachable("Invalid index type"); - } + list_hdr.index_size = + pvr_vdmctrl_index_size_from_type(state->index_buffer_binding.type); + index_stride = vk_index_type_to_bytes(state->index_buffer_binding.type); index_buffer_addr = PVR_DEV_ADDR_OFFSET( state->index_buffer_binding.buffer->dev_addr, diff --git a/src/imagination/vulkan/pvr_csb_enum_helpers.h b/src/imagination/vulkan/pvr_csb_enum_helpers.h index 893dcbee6d3..366de6d8f2d 100644 --- a/src/imagination/vulkan/pvr_csb_enum_helpers.h +++ b/src/imagination/vulkan/pvr_csb_enum_helpers.h @@ -247,4 +247,19 @@ pvr_vdmctrl_index_size_nr_bytes(enum PVRX(VDMCTRL_INDEX_SIZE) index_size) } } +static enum PVRX(VDMCTRL_INDEX_SIZE) + pvr_vdmctrl_index_size_from_type(VkIndexType type) +{ + switch (type) { + case VK_INDEX_TYPE_UINT32: + return PVRX(VDMCTRL_INDEX_SIZE_B32); + case VK_INDEX_TYPE_UINT16: + return PVRX(VDMCTRL_INDEX_SIZE_B16); + case VK_INDEX_TYPE_UINT8_KHR: + return PVRX(VDMCTRL_INDEX_SIZE_B8); + default: + unreachable("Invalid index type"); + } +} + #endif /* PVR_CSB_ENUM_HELPERS_H */ diff --git a/src/imagination/vulkan/pvr_device.c b/src/imagination/vulkan/pvr_device.c index 832e651ba07..7c029ddca2d 100644 --- a/src/imagination/vulkan/pvr_device.c +++ b/src/imagination/vulkan/pvr_device.c @@ -183,12 +183,14 @@ static void pvr_physical_device_get_supported_extensions( .KHR_external_semaphore_fd = PVR_USE_WSI_PLATFORM, .KHR_get_memory_requirements2 = true, .KHR_image_format_list = true, + .KHR_index_type_uint8 = true, .KHR_shader_expect_assume = true, .KHR_swapchain = PVR_USE_WSI_PLATFORM, .KHR_timeline_semaphore = true, .KHR_uniform_buffer_standard_layout = true, .EXT_external_memory_dma_buf = true, .EXT_host_query_reset = true, + .EXT_index_type_uint8 = true, .EXT_memory_budget = true, .EXT_private_data = true, .EXT_scalar_block_layout = true, @@ -259,6 +261,9 @@ static void pvr_physical_device_get_supported_features( .variableMultisampleRate = false, .inheritedQueries = false, + /* VK_KHR_index_type_uint8 */ + .indexTypeUint8 = true, + /* Vulkan 1.2 / VK_KHR_timeline_semaphore */ .timelineSemaphore = true,