mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 04:38:03 +02:00
anv: implement VK_EXT_index_type_uint8
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
parent
0d3a532a33
commit
c6196f7025
4 changed files with 66 additions and 22 deletions
|
|
@ -1091,6 +1091,13 @@ void anv_GetPhysicalDeviceFeatures2(
|
|||
break;
|
||||
}
|
||||
|
||||
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: {
|
||||
VkPhysicalDeviceIndexTypeUint8FeaturesEXT *features =
|
||||
(VkPhysicalDeviceIndexTypeUint8FeaturesEXT *)ext;
|
||||
features->indexTypeUint8 = true;
|
||||
break;
|
||||
}
|
||||
|
||||
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: {
|
||||
VkPhysicalDeviceInlineUniformBlockFeaturesEXT *features =
|
||||
(VkPhysicalDeviceInlineUniformBlockFeaturesEXT *)ext;
|
||||
|
|
|
|||
|
|
@ -135,6 +135,7 @@ EXTENSIONS = [
|
|||
Extension('VK_EXT_global_priority', 1,
|
||||
'device->has_context_priority'),
|
||||
Extension('VK_EXT_host_query_reset', 1, True),
|
||||
Extension('VK_EXT_index_type_uint8', 1, True),
|
||||
Extension('VK_EXT_inline_uniform_block', 1, True),
|
||||
Extension('VK_EXT_memory_budget', 1, 'device->has_mem_available'),
|
||||
Extension('VK_EXT_pci_bus_info', 2, True),
|
||||
|
|
|
|||
|
|
@ -117,15 +117,33 @@ gen7_cmd_buffer_emit_scissor(struct anv_cmd_buffer *cmd_buffer)
|
|||
}
|
||||
#endif
|
||||
|
||||
static const uint32_t vk_to_gen_index_type[] = {
|
||||
[VK_INDEX_TYPE_UINT16] = INDEX_WORD,
|
||||
[VK_INDEX_TYPE_UINT32] = INDEX_DWORD,
|
||||
};
|
||||
static uint32_t vk_to_gen_index_type(VkIndexType type)
|
||||
{
|
||||
switch (type) {
|
||||
case VK_INDEX_TYPE_UINT8_EXT:
|
||||
return INDEX_BYTE;
|
||||
case VK_INDEX_TYPE_UINT16:
|
||||
return INDEX_WORD;
|
||||
case VK_INDEX_TYPE_UINT32:
|
||||
return INDEX_DWORD;
|
||||
default:
|
||||
unreachable("invalid index type");
|
||||
}
|
||||
}
|
||||
|
||||
static const uint32_t restart_index_for_type[] = {
|
||||
[VK_INDEX_TYPE_UINT16] = UINT16_MAX,
|
||||
[VK_INDEX_TYPE_UINT32] = UINT32_MAX,
|
||||
};
|
||||
static uint32_t restart_index_for_type(VkIndexType type)
|
||||
{
|
||||
switch (type) {
|
||||
case VK_INDEX_TYPE_UINT8_EXT:
|
||||
return UINT8_MAX;
|
||||
case VK_INDEX_TYPE_UINT16:
|
||||
return UINT16_MAX;
|
||||
case VK_INDEX_TYPE_UINT32:
|
||||
return UINT32_MAX;
|
||||
default:
|
||||
unreachable("invalid index type");
|
||||
}
|
||||
}
|
||||
|
||||
void genX(CmdBindIndexBuffer)(
|
||||
VkCommandBuffer commandBuffer,
|
||||
|
|
@ -138,9 +156,9 @@ void genX(CmdBindIndexBuffer)(
|
|||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_INDEX_BUFFER;
|
||||
if (GEN_IS_HASWELL)
|
||||
cmd_buffer->state.restart_index = restart_index_for_type[indexType];
|
||||
cmd_buffer->state.restart_index = restart_index_for_type(indexType);
|
||||
cmd_buffer->state.gfx.gen7.index_buffer = buffer;
|
||||
cmd_buffer->state.gfx.gen7.index_type = vk_to_gen_index_type[indexType];
|
||||
cmd_buffer->state.gfx.gen7.index_type = vk_to_gen_index_type(indexType);
|
||||
cmd_buffer->state.gfx.gen7.index_offset = offset;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -553,6 +553,34 @@ genX(cmd_buffer_flush_dynamic_state)(struct anv_cmd_buffer *cmd_buffer)
|
|||
cmd_buffer->state.gfx.dirty = 0;
|
||||
}
|
||||
|
||||
static uint32_t vk_to_gen_index_type(VkIndexType type)
|
||||
{
|
||||
switch (type) {
|
||||
case VK_INDEX_TYPE_UINT8_EXT:
|
||||
return INDEX_BYTE;
|
||||
case VK_INDEX_TYPE_UINT16:
|
||||
return INDEX_WORD;
|
||||
case VK_INDEX_TYPE_UINT32:
|
||||
return INDEX_DWORD;
|
||||
default:
|
||||
unreachable("invalid index type");
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t restart_index_for_type(VkIndexType type)
|
||||
{
|
||||
switch (type) {
|
||||
case VK_INDEX_TYPE_UINT8_EXT:
|
||||
return UINT8_MAX;
|
||||
case VK_INDEX_TYPE_UINT16:
|
||||
return UINT16_MAX;
|
||||
case VK_INDEX_TYPE_UINT32:
|
||||
return UINT32_MAX;
|
||||
default:
|
||||
unreachable("invalid index type");
|
||||
}
|
||||
}
|
||||
|
||||
void genX(CmdBindIndexBuffer)(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkBuffer _buffer,
|
||||
|
|
@ -562,20 +590,10 @@ void genX(CmdBindIndexBuffer)(
|
|||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
ANV_FROM_HANDLE(anv_buffer, buffer, _buffer);
|
||||
|
||||
static const uint32_t vk_to_gen_index_type[] = {
|
||||
[VK_INDEX_TYPE_UINT16] = INDEX_WORD,
|
||||
[VK_INDEX_TYPE_UINT32] = INDEX_DWORD,
|
||||
};
|
||||
|
||||
static const uint32_t restart_index_for_type[] = {
|
||||
[VK_INDEX_TYPE_UINT16] = UINT16_MAX,
|
||||
[VK_INDEX_TYPE_UINT32] = UINT32_MAX,
|
||||
};
|
||||
|
||||
cmd_buffer->state.restart_index = restart_index_for_type[indexType];
|
||||
cmd_buffer->state.restart_index = restart_index_for_type(indexType);
|
||||
|
||||
anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_INDEX_BUFFER), ib) {
|
||||
ib.IndexFormat = vk_to_gen_index_type[indexType];
|
||||
ib.IndexFormat = vk_to_gen_index_type(indexType);
|
||||
ib.MOCS = anv_mocs_for_bo(cmd_buffer->device,
|
||||
buffer->address.bo);
|
||||
ib.BufferStartingAddress = anv_address_add(buffer->address, offset);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue