summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-05-30 02:57:42 -0300
committerGravatar ameerj2021-07-22 21:51:34 -0400
commita7e9756671be5bb99566277709e5becdea774f34 (patch)
tree060a277d1150fb671c0365fb51490584939993b9 /src
parentshader: Always initialize up reference in structure control flow (diff)
downloadyuzu-a7e9756671be5bb99566277709e5becdea774f34.tar.gz
yuzu-a7e9756671be5bb99566277709e5becdea774f34.tar.xz
yuzu-a7e9756671be5bb99566277709e5becdea774f34.zip
buffer_cache: Mark uniform buffers as dirty if any enable bit changes
Diffstat (limited to 'src')
-rw-r--r--src/video_core/buffer_cache/buffer_cache.h10
-rw-r--r--src/video_core/renderer_opengl/gl_graphics_pipeline.cpp4
-rw-r--r--src/video_core/renderer_opengl/gl_graphics_pipeline.h1
-rw-r--r--src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp6
-rw-r--r--src/video_core/renderer_vulkan/vk_graphics_pipeline.h3
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
672template <class P> 672template <class P>
673void BufferCache<P>::SetEnabledUniformBuffers(size_t stage, u32 enabled) { 673void 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
682template <class P> 682template <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;