pvr: Implement VK_KHR_index_type_uint8
This commit will also add a helper function to simplify the code Signed-off-by: Vlad Schiller <vlad-radu.schiller@imgtec.com> Reviewed-by: Frank Binns <frank.binns@imgtec.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28361>
This commit is contained in:
@@ -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)
|
||||
|
@@ -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,
|
||||
|
@@ -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 */
|
||||
|
@@ -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,
|
||||
|
||||
|
Reference in New Issue
Block a user