From 227dabc2664b886e621de03d9ba82073e2fd16aa Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Mon, 2 Jul 2018 12:57:44 -0700 Subject: [PATCH] anv: Implement VK_EXT_vertex_attribute_divisor Reviewed-by: Caio Marcelo de Oliveira Filho --- src/intel/vulkan/anv_device.c | 8 ++++++++ src/intel/vulkan/anv_extensions.py | 1 + src/intel/vulkan/anv_pipeline.c | 12 ++++++++++++ 3 files changed, 21 insertions(+) diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index a8b0bd2..04fd6a8 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -1140,6 +1140,14 @@ void anv_GetPhysicalDeviceProperties2( break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: { + VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *props = + (VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *)ext; + /* We have to restrict this a bit for multiview */ + props->maxVertexAttribDivisor = UINT32_MAX / 16; + break; + } + default: anv_debug_ignored_stype(ext->sType); break; diff --git a/src/intel/vulkan/anv_extensions.py b/src/intel/vulkan/anv_extensions.py index 13c06f3..418618d 100644 --- a/src/intel/vulkan/anv_extensions.py +++ b/src/intel/vulkan/anv_extensions.py @@ -122,6 +122,7 @@ EXTENSIONS = [ 'device->has_context_priority'), Extension('VK_EXT_shader_viewport_index_layer', 1, True), Extension('VK_EXT_shader_stencil_export', 1, 'device->info.gen >= 9'), + Extension('VK_EXT_vertex_attribute_divisor', 2, True), ] class VkVersion: diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index e8489e7..95a686f 100644 --- a/src/intel/vulkan/anv_pipeline.c +++ b/src/intel/vulkan/anv_pipeline.c @@ -33,6 +33,7 @@ #include "compiler/brw_nir.h" #include "anv_nir.h" #include "spirv/nir_spirv.h" +#include "vk_util.h" /* Needed for SWIZZLE macros */ #include "program/prog_instruction.h" @@ -1425,6 +1426,17 @@ anv_pipeline_init(struct anv_pipeline *pipeline, pipeline->vb[desc->binding].instance_divisor = 1; } + const VkPipelineVertexInputDivisorStateCreateInfoEXT *vi_div_state = + vk_find_struct_const(vi_info->pNext, + PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT); + if (vi_div_state) { + for (uint32_t i = 0; i < vi_div_state->vertexBindingDivisorCount; i++) { + const VkVertexInputBindingDivisorDescriptionEXT *desc = + &vi_div_state->pVertexBindingDivisors[i]; + + pipeline->vb[desc->binding].instance_divisor = desc->divisor; + } + } /* Our implementation of VK_KHR_multiview uses instancing to draw the * different views. If the client asks for instancing, we need to multiply -- 2.7.4