From bd0f9283f82580b33cc7a31462e3e0bc3a7fff31 Mon Sep 17 00:00:00 2001 From: Ella-0 Date: Thu, 2 Sep 2021 10:30:52 +0000 Subject: [PATCH] v3dv: Implement VK_EXT_vertex_attribute_divisor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Alejandro PiƱeiro Part-of: --- docs/features.txt | 2 +- src/broadcom/vulkan/v3dv_device.c | 15 +++++++++++++++ src/broadcom/vulkan/v3dv_pipeline.c | 10 ++++++++-- src/broadcom/vulkan/v3dvx_pipeline.c | 12 +++++++++++- src/broadcom/vulkan/v3dvx_private.h | 4 ++-- 5 files changed, 37 insertions(+), 6 deletions(-) diff --git a/docs/features.txt b/docs/features.txt index f32d6d70042..47bca66f02d 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -553,7 +553,7 @@ Khronos extensions that are not part of any Vulkan version: VK_EXT_subgroup_size_control DONE (anv, radv) VK_EXT_texel_buffer_alignment DONE (anv, radv) VK_EXT_transform_feedback DONE (anv, lvp, radv, tu, vn) - VK_EXT_vertex_attribute_divisor DONE (anv, radv, lvp, tu) + VK_EXT_vertex_attribute_divisor DONE (anv, radv, lvp, tu, v3dv) VK_EXT_vertex_input_dynamic_state DONE (lvp) VK_EXT_ycbcr_image_arrays DONE (anv, radv) VK_ANDROID_external_memory_android_hardware_buffer DONE (anv, radv) diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 7cff947d70e..11a35a84d7c 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -148,6 +148,7 @@ get_device_extensions(const struct v3dv_physical_device *device, .EXT_pipeline_creation_feedback = true, .EXT_private_data = true, .EXT_provoking_vertex = true, + .EXT_vertex_attribute_divisor = true, }; } @@ -1125,6 +1126,14 @@ v3dv_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: { + VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *features = + (void *) ext; + features->vertexAttributeInstanceRateDivisor = true; + features->vertexAttributeInstanceRateZeroDivisor = false; + break; + } + /* Vulkan 1.1 */ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { VkPhysicalDeviceVulkan11Features *features = @@ -1433,6 +1442,12 @@ v3dv_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice, props->transformFeedbackPreservesTriangleFanProvokingVertex = false; break; } + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: { + VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *props = + (VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *)ext; + props->maxVertexAttribDivisor = 0xffff; + break; + } case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES: { VkPhysicalDeviceIDProperties *id_props = (VkPhysicalDeviceIDProperties *)ext; diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index ddd8fbfacce..44962c50508 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -3002,8 +3002,14 @@ pipeline_init(struct v3dv_pipeline *pipeline, return result; } - v3dv_X(device, pipeline_pack_compile_state)(pipeline, - pCreateInfo->pVertexInputState); + const VkPipelineVertexInputStateCreateInfo *vi_info = + pCreateInfo->pVertexInputState; + + const VkPipelineVertexInputDivisorStateCreateInfoEXT *vd_info = + vk_find_struct_const(vi_info->pNext, + PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT); + + v3dv_X(device, pipeline_pack_compile_state)(pipeline, vi_info, vd_info); if (pipeline_has_integer_vertex_attrib(pipeline)) { pipeline->default_attribute_values = diff --git a/src/broadcom/vulkan/v3dvx_pipeline.c b/src/broadcom/vulkan/v3dvx_pipeline.c index 04002311775..8623a453701 100644 --- a/src/broadcom/vulkan/v3dvx_pipeline.c +++ b/src/broadcom/vulkan/v3dvx_pipeline.c @@ -599,7 +599,8 @@ pack_shader_state_attribute_record(struct v3dv_pipeline *pipeline, void v3dX(pipeline_pack_compile_state)(struct v3dv_pipeline *pipeline, - const VkPipelineVertexInputStateCreateInfo *vi_info) + const VkPipelineVertexInputStateCreateInfo *vi_info, + const VkPipelineVertexInputDivisorStateCreateInfoEXT *vd_info) { pack_shader_state_record(pipeline); pack_vcm_cache_size(pipeline); @@ -613,6 +614,15 @@ v3dX(pipeline_pack_compile_state)(struct v3dv_pipeline *pipeline, pipeline->vb[desc->binding].instance_divisor = desc->inputRate; } + if (vd_info) { + for (uint32_t i = 0; i < vd_info->vertexBindingDivisorCount; i++) { + const VkVertexInputBindingDivisorDescriptionEXT *desc = + &vd_info->pVertexBindingDivisors[i]; + + pipeline->vb[desc->binding].instance_divisor = desc->divisor; + } + } + pipeline->va_count = 0; struct v3d_vs_prog_data *prog_data_vs = pipeline->shared_data->variants[BROADCOM_SHADER_VERTEX]->prog_data.vs; diff --git a/src/broadcom/vulkan/v3dvx_private.h b/src/broadcom/vulkan/v3dvx_private.h index 18e7a1af869..ab134225a3a 100644 --- a/src/broadcom/vulkan/v3dvx_private.h +++ b/src/broadcom/vulkan/v3dvx_private.h @@ -298,8 +298,8 @@ v3dX(pipeline_pack_state)(struct v3dv_pipeline *pipeline, const VkPipelineMultisampleStateCreateInfo *ms_info); void v3dX(pipeline_pack_compile_state)(struct v3dv_pipeline *pipeline, - const VkPipelineVertexInputStateCreateInfo *vi_info); - + const VkPipelineVertexInputStateCreateInfo *vi_info, + const VkPipelineVertexInputDivisorStateCreateInfoEXT *vd_info); /* Used at v3dv_queue */ void v3dX(job_emit_noop)(struct v3dv_job *job);