diff options
5 files changed, 17 insertions, 7 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 6c92e4c30..d6b9eb99f 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h | |||
| @@ -142,7 +142,7 @@ public: | |||
| 142 | 142 | ||
| 143 | void BindHostComputeBuffers(); | 143 | void BindHostComputeBuffers(); |
| 144 | 144 | ||
| 145 | void SetEnabledUniformBuffers(size_t stage, u32 enabled); | 145 | void SetEnabledUniformBuffers(const std::array<u32, NUM_STAGES>& mask); |
| 146 | 146 | ||
| 147 | void SetEnabledComputeUniformBuffers(u32 enabled); | 147 | void SetEnabledComputeUniformBuffers(u32 enabled); |
| 148 | 148 | ||
| @@ -670,13 +670,13 @@ void BufferCache<P>::BindHostComputeBuffers() { | |||
| 670 | } | 670 | } |
| 671 | 671 | ||
| 672 | template <class P> | 672 | template <class P> |
| 673 | void BufferCache<P>::SetEnabledUniformBuffers(size_t stage, u32 enabled) { | 673 | void BufferCache<P>::SetEnabledUniformBuffers(const std::array<u32, NUM_STAGES>& mask) { |
| 674 | if constexpr (HAS_PERSISTENT_UNIFORM_BUFFER_BINDINGS) { | 674 | if constexpr (HAS_PERSISTENT_UNIFORM_BUFFER_BINDINGS) { |
| 675 | if (enabled_uniform_buffers[stage] != enabled) { | 675 | if (enabled_uniform_buffers != mask) { |
| 676 | dirty_uniform_buffers[stage] = ~u32{0}; | 676 | dirty_uniform_buffers.fill(~u32{0}); |
| 677 | } | 677 | } |
| 678 | } | 678 | } |
| 679 | enabled_uniform_buffers[stage] = enabled; | 679 | enabled_uniform_buffers = mask; |
| 680 | } | 680 | } |
| 681 | 681 | ||
| 682 | template <class P> | 682 | template <class P> |
diff --git a/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp b/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp index 38ec88b13..976897067 100644 --- a/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp +++ b/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp | |||
| @@ -100,6 +100,8 @@ GraphicsPipeline::GraphicsPipeline(const Device& device, TextureCache& texture_c | |||
| 100 | base_uniform_bindings[stage + 1] += AccumulateCount(info.constant_buffer_descriptors); | 100 | base_uniform_bindings[stage + 1] += AccumulateCount(info.constant_buffer_descriptors); |
| 101 | base_storage_bindings[stage + 1] += AccumulateCount(info.storage_buffers_descriptors); | 101 | base_storage_bindings[stage + 1] += AccumulateCount(info.storage_buffers_descriptors); |
| 102 | } | 102 | } |
| 103 | enabled_uniform_buffers[stage] = info.constant_buffer_mask; | ||
| 104 | |||
| 103 | const u32 num_tex_buffer_bindings{AccumulateCount(info.texture_buffer_descriptors)}; | 105 | const u32 num_tex_buffer_bindings{AccumulateCount(info.texture_buffer_descriptors)}; |
| 104 | num_texture_buffers[stage] += num_tex_buffer_bindings; | 106 | num_texture_buffers[stage] += num_tex_buffer_bindings; |
| 105 | num_textures += num_tex_buffer_bindings; | 107 | num_textures += num_tex_buffer_bindings; |
| @@ -145,6 +147,7 @@ void GraphicsPipeline::Configure(bool is_indexed) { | |||
| 145 | 147 | ||
| 146 | texture_cache.SynchronizeGraphicsDescriptors(); | 148 | texture_cache.SynchronizeGraphicsDescriptors(); |
| 147 | 149 | ||
| 150 | buffer_cache.SetEnabledUniformBuffers(enabled_uniform_buffers); | ||
| 148 | buffer_cache.runtime.SetBaseUniformBindings(base_uniform_bindings); | 151 | buffer_cache.runtime.SetBaseUniformBindings(base_uniform_bindings); |
| 149 | buffer_cache.runtime.SetBaseStorageBindings(base_storage_bindings); | 152 | buffer_cache.runtime.SetBaseStorageBindings(base_storage_bindings); |
| 150 | buffer_cache.runtime.SetEnableStorageBuffers(use_storage_buffers); | 153 | buffer_cache.runtime.SetEnableStorageBuffers(use_storage_buffers); |
| @@ -153,7 +156,6 @@ void GraphicsPipeline::Configure(bool is_indexed) { | |||
| 153 | const bool via_header_index{regs.sampler_index == Maxwell::SamplerIndex::ViaHeaderIndex}; | 156 | const bool via_header_index{regs.sampler_index == Maxwell::SamplerIndex::ViaHeaderIndex}; |
| 154 | const auto config_stage{[&](size_t stage) { | 157 | const auto config_stage{[&](size_t stage) { |
| 155 | const Shader::Info& info{stage_infos[stage]}; | 158 | const Shader::Info& info{stage_infos[stage]}; |
| 156 | buffer_cache.SetEnabledUniformBuffers(stage, info.constant_buffer_mask); | ||
| 157 | buffer_cache.UnbindGraphicsStorageBuffers(stage); | 159 | buffer_cache.UnbindGraphicsStorageBuffers(stage); |
| 158 | if constexpr (Spec::has_storage_buffers) { | 160 | if constexpr (Spec::has_storage_buffers) { |
| 159 | size_t ssbo_index{}; | 161 | size_t ssbo_index{}; |
diff --git a/src/video_core/renderer_opengl/gl_graphics_pipeline.h b/src/video_core/renderer_opengl/gl_graphics_pipeline.h index c1113e180..bf33ce604 100644 --- a/src/video_core/renderer_opengl/gl_graphics_pipeline.h +++ b/src/video_core/renderer_opengl/gl_graphics_pipeline.h | |||
| @@ -99,6 +99,7 @@ private: | |||
| 99 | u32 enabled_stages_mask{}; | 99 | u32 enabled_stages_mask{}; |
| 100 | 100 | ||
| 101 | std::array<Shader::Info, 5> stage_infos{}; | 101 | std::array<Shader::Info, 5> stage_infos{}; |
| 102 | std::array<u32, 5> enabled_uniform_buffers{}; | ||
| 102 | std::array<u32, 5> base_uniform_bindings{}; | 103 | std::array<u32, 5> base_uniform_bindings{}; |
| 103 | std::array<u32, 5> base_storage_bindings{}; | 104 | std::array<u32, 5> base_storage_bindings{}; |
| 104 | std::array<u32, 5> num_texture_buffers{}; | 105 | std::array<u32, 5> num_texture_buffers{}; |
diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index e5f54a84f..dfe6e6a80 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp | |||
| @@ -218,6 +218,9 @@ GraphicsPipeline::GraphicsPipeline(Tegra::Engines::Maxwell3D& maxwell3d_, | |||
| 218 | update_descriptor_queue{update_descriptor_queue_}, spv_modules{std::move(stages)} { | 218 | update_descriptor_queue{update_descriptor_queue_}, spv_modules{std::move(stages)} { |
| 219 | std::ranges::transform(infos, stage_infos.begin(), | 219 | std::ranges::transform(infos, stage_infos.begin(), |
| 220 | [](const Shader::Info* info) { return info ? *info : Shader::Info{}; }); | 220 | [](const Shader::Info* info) { return info ? *info : Shader::Info{}; }); |
| 221 | std::ranges::transform(infos, enabled_uniform_buffers.begin(), [](const Shader::Info* info) { | ||
| 222 | return info ? info->constant_buffer_mask : 0; | ||
| 223 | }); | ||
| 221 | 224 | ||
| 222 | auto func{[this, &render_pass_cache, &descriptor_pool] { | 225 | auto func{[this, &render_pass_cache, &descriptor_pool] { |
| 223 | DescriptorLayoutBuilder builder{MakeBuilder(device, stage_infos)}; | 226 | DescriptorLayoutBuilder builder{MakeBuilder(device, stage_infos)}; |
| @@ -259,11 +262,12 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) { | |||
| 259 | 262 | ||
| 260 | texture_cache.SynchronizeGraphicsDescriptors(); | 263 | texture_cache.SynchronizeGraphicsDescriptors(); |
| 261 | 264 | ||
| 265 | buffer_cache.SetEnabledUniformBuffers(enabled_uniform_buffers); | ||
| 266 | |||
| 262 | const auto& regs{maxwell3d.regs}; | 267 | const auto& regs{maxwell3d.regs}; |
| 263 | const bool via_header_index{regs.sampler_index == Maxwell::SamplerIndex::ViaHeaderIndex}; | 268 | const bool via_header_index{regs.sampler_index == Maxwell::SamplerIndex::ViaHeaderIndex}; |
| 264 | const auto config_stage{[&](size_t stage) LAMBDA_FORCEINLINE { | 269 | const auto config_stage{[&](size_t stage) LAMBDA_FORCEINLINE { |
| 265 | const Shader::Info& info{stage_infos[stage]}; | 270 | const Shader::Info& info{stage_infos[stage]}; |
| 266 | buffer_cache.SetEnabledUniformBuffers(stage, info.constant_buffer_mask); | ||
| 267 | buffer_cache.UnbindGraphicsStorageBuffers(stage); | 271 | buffer_cache.UnbindGraphicsStorageBuffers(stage); |
| 268 | if constexpr (Spec::has_storage_buffers) { | 272 | if constexpr (Spec::has_storage_buffers) { |
| 269 | size_t ssbo_index{}; | 273 | size_t ssbo_index{}; |
diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h index e362d13c5..4068a0edc 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.h +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.h | |||
| @@ -128,7 +128,10 @@ private: | |||
| 128 | std::vector<GraphicsPipeline*> transitions; | 128 | std::vector<GraphicsPipeline*> transitions; |
| 129 | 129 | ||
| 130 | std::array<vk::ShaderModule, NUM_STAGES> spv_modules; | 130 | std::array<vk::ShaderModule, NUM_STAGES> spv_modules; |
| 131 | |||
| 131 | std::array<Shader::Info, NUM_STAGES> stage_infos; | 132 | std::array<Shader::Info, NUM_STAGES> stage_infos; |
| 133 | std::array<u32, 5> enabled_uniform_buffers{}; | ||
| 134 | |||
| 132 | vk::DescriptorSetLayout descriptor_set_layout; | 135 | vk::DescriptorSetLayout descriptor_set_layout; |
| 133 | DescriptorAllocator descriptor_allocator; | 136 | DescriptorAllocator descriptor_allocator; |
| 134 | vk::PipelineLayout pipeline_layout; | 137 | vk::PipelineLayout pipeline_layout; |