Merge pull request #6688 from yzct12345/valid-intel-max
render_vulkan: Fix validation errors on less compatible Intel GPUs
This commit is contained in:
		| @@ -285,6 +285,9 @@ void BufferCacheRuntime::BindQuadArrayIndexBuffer(u32 first, u32 count) { | |||||||
|  |  | ||||||
| void BufferCacheRuntime::BindVertexBuffer(u32 index, VkBuffer buffer, u32 offset, u32 size, | void BufferCacheRuntime::BindVertexBuffer(u32 index, VkBuffer buffer, u32 offset, u32 size, | ||||||
|                                           u32 stride) { |                                           u32 stride) { | ||||||
|  |     if (index >= device.GetMaxVertexInputBindings()) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|     if (device.IsExtExtendedDynamicStateSupported()) { |     if (device.IsExtExtendedDynamicStateSupported()) { | ||||||
|         scheduler.Record([index, buffer, offset, size, stride](vk::CommandBuffer cmdbuf) { |         scheduler.Record([index, buffer, offset, size, stride](vk::CommandBuffer cmdbuf) { | ||||||
|             const VkDeviceSize vk_offset = buffer != VK_NULL_HANDLE ? offset : 0; |             const VkDeviceSize vk_offset = buffer != VK_NULL_HANDLE ? offset : 0; | ||||||
|   | |||||||
| @@ -529,7 +529,9 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { | |||||||
|     static_vector<VkVertexInputBindingDivisorDescriptionEXT, 32> vertex_binding_divisors; |     static_vector<VkVertexInputBindingDivisorDescriptionEXT, 32> vertex_binding_divisors; | ||||||
|     static_vector<VkVertexInputAttributeDescription, 32> vertex_attributes; |     static_vector<VkVertexInputAttributeDescription, 32> vertex_attributes; | ||||||
|     if (key.state.dynamic_vertex_input) { |     if (key.state.dynamic_vertex_input) { | ||||||
|         for (size_t index = 0; index < key.state.attributes.size(); ++index) { |         const size_t num_vertex_arrays = std::min( | ||||||
|  |             key.state.attributes.size(), static_cast<size_t>(device.GetMaxVertexInputBindings())); | ||||||
|  |         for (size_t index = 0; index < num_vertex_arrays; ++index) { | ||||||
|             const u32 type = key.state.DynamicAttributeType(index); |             const u32 type = key.state.DynamicAttributeType(index); | ||||||
|             if (!stage_infos[0].loads.Generic(index) || type == 0) { |             if (!stage_infos[0].loads.Generic(index) || type == 0) { | ||||||
|                 continue; |                 continue; | ||||||
| @@ -551,7 +553,9 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { | |||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|     } else { |     } else { | ||||||
|         for (size_t index = 0; index < Maxwell::NumVertexArrays; ++index) { |         const size_t num_vertex_arrays = std::min( | ||||||
|  |             Maxwell::NumVertexArrays, static_cast<size_t>(device.GetMaxVertexInputBindings())); | ||||||
|  |         for (size_t index = 0; index < num_vertex_arrays; ++index) { | ||||||
|             const bool instanced = key.state.binding_divisors[index] != 0; |             const bool instanced = key.state.binding_divisors[index] != 0; | ||||||
|             const auto rate = |             const auto rate = | ||||||
|                 instanced ? VK_VERTEX_INPUT_RATE_INSTANCE : VK_VERTEX_INPUT_RATE_VERTEX; |                 instanced ? VK_VERTEX_INPUT_RATE_INSTANCE : VK_VERTEX_INPUT_RATE_VERTEX; | ||||||
| @@ -580,6 +584,8 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { | |||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |     ASSERT(vertex_attributes.size() <= device.GetMaxVertexInputAttributes()); | ||||||
|  |  | ||||||
|     VkPipelineVertexInputStateCreateInfo vertex_input_ci{ |     VkPipelineVertexInputStateCreateInfo vertex_input_ci{ | ||||||
|         .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, |         .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, | ||||||
|         .pNext = nullptr, |         .pNext = nullptr, | ||||||
|   | |||||||
| @@ -341,6 +341,15 @@ PipelineCache::PipelineCache(RasterizerVulkan& rasterizer_, const Device& device | |||||||
|         .support_snorm_render_buffer = true, |         .support_snorm_render_buffer = true, | ||||||
|         .support_viewport_index_layer = device.IsExtShaderViewportIndexLayerSupported(), |         .support_viewport_index_layer = device.IsExtShaderViewportIndexLayerSupported(), | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|  |     if (device.GetMaxVertexInputAttributes() < Maxwell::NumVertexAttributes) { | ||||||
|  |         LOG_WARNING(Render_Vulkan, "maxVertexInputAttributes is too low: {} < {}", | ||||||
|  |                     device.GetMaxVertexInputAttributes(), Maxwell::NumVertexAttributes); | ||||||
|  |     } | ||||||
|  |     if (device.GetMaxVertexInputBindings() < Maxwell::NumVertexArrays) { | ||||||
|  |         LOG_WARNING(Render_Vulkan, "maxVertexInputBindings is too low: {} < {}", | ||||||
|  |                     device.GetMaxVertexInputBindings(), Maxwell::NumVertexArrays); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| PipelineCache::~PipelineCache() = default; | PipelineCache::~PipelineCache() = default; | ||||||
|   | |||||||
| @@ -1380,6 +1380,10 @@ void Device::SetupFeatures() { | |||||||
|     is_shader_storage_image_multisample = features.shaderStorageImageMultisample; |     is_shader_storage_image_multisample = features.shaderStorageImageMultisample; | ||||||
|     is_blit_depth_stencil_supported = TestDepthStencilBlits(); |     is_blit_depth_stencil_supported = TestDepthStencilBlits(); | ||||||
|     is_optimal_astc_supported = IsOptimalAstcSupported(features); |     is_optimal_astc_supported = IsOptimalAstcSupported(features); | ||||||
|  |  | ||||||
|  |     const VkPhysicalDeviceLimits& limits{properties.limits}; | ||||||
|  |     max_vertex_input_attributes = limits.maxVertexInputAttributes; | ||||||
|  |     max_vertex_input_bindings = limits.maxVertexInputBindings; | ||||||
| } | } | ||||||
|  |  | ||||||
| void Device::SetupProperties() { | void Device::SetupProperties() { | ||||||
|   | |||||||
| @@ -368,6 +368,14 @@ public: | |||||||
|         return must_emulate_bgr565; |         return must_emulate_bgr565; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     u32 GetMaxVertexInputAttributes() const { | ||||||
|  |         return max_vertex_input_attributes; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     u32 GetMaxVertexInputBindings() const { | ||||||
|  |         return max_vertex_input_bindings; | ||||||
|  |     } | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     /// Checks if the physical device is suitable. |     /// Checks if the physical device is suitable. | ||||||
|     void CheckSuitability(bool requires_swapchain) const; |     void CheckSuitability(bool requires_swapchain) const; | ||||||
| @@ -467,6 +475,8 @@ private: | |||||||
|     bool supports_d24_depth{};              ///< Supports D24 depth buffers. |     bool supports_d24_depth{};              ///< Supports D24 depth buffers. | ||||||
|     bool cant_blit_msaa{};                  ///< Does not support MSAA<->MSAA blitting. |     bool cant_blit_msaa{};                  ///< Does not support MSAA<->MSAA blitting. | ||||||
|     bool must_emulate_bgr565{};             ///< Emulates BGR565 by swizzling RGB565 format. |     bool must_emulate_bgr565{};             ///< Emulates BGR565 by swizzling RGB565 format. | ||||||
|  |     u32 max_vertex_input_attributes{};      ///< Max vertex input attributes in pipeline | ||||||
|  |     u32 max_vertex_input_bindings{};        ///< Max vertex input buffers in pipeline | ||||||
|  |  | ||||||
|     // Telemetry parameters |     // Telemetry parameters | ||||||
|     std::string vendor_name;                       ///< Device's driver name. |     std::string vendor_name;                       ///< Device's driver name. | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user