mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-11-04 12:34:39 +08:00 
			
		
		
		
	Fix validation errors on less compatible Intel GPU
This commit is contained in:
		
							parent
							
								
									339a37f8cb
								
							
						
					
					
						commit
						f6868ae4dd
					
				@ -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.
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user