summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-07-25 22:27:16 -0300
committerGravatar Fernando Sahmkow2021-11-16 22:11:28 +0100
commit6f3a41abe2caa617ae540fb7e4a3c4a092478963 (patch)
tree27a9a2fc200b38db0502a0e2a26b2b7cb062b8a3 /src
parentspirv: Implement rescaling patching (diff)
downloadyuzu-6f3a41abe2caa617ae540fb7e4a3c4a092478963.tar.gz
yuzu-6f3a41abe2caa617ae540fb7e4a3c4a092478963.tar.xz
yuzu-6f3a41abe2caa617ae540fb7e4a3c4a092478963.zip
opengl: Use Shader::NumDescriptors when possible
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_compute_pipeline.cpp19
-rw-r--r--src/video_core/renderer_opengl/gl_graphics_pipeline.cpp32
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.cpp15
3 files changed, 20 insertions, 46 deletions
diff --git a/src/video_core/renderer_opengl/gl_compute_pipeline.cpp b/src/video_core/renderer_opengl/gl_compute_pipeline.cpp
index aa1cc592f..19c8ca7b2 100644
--- a/src/video_core/renderer_opengl/gl_compute_pipeline.cpp
+++ b/src/video_core/renderer_opengl/gl_compute_pipeline.cpp
@@ -19,15 +19,6 @@ using VideoCommon::ImageId;
19constexpr u32 MAX_TEXTURES = 64; 19constexpr u32 MAX_TEXTURES = 64;
20constexpr u32 MAX_IMAGES = 16; 20constexpr u32 MAX_IMAGES = 16;
21 21
22template <typename Range>
23u32 AccumulateCount(const Range& range) {
24 u32 num{};
25 for (const auto& desc : range) {
26 num += desc.count;
27 }
28 return num;
29}
30
31size_t ComputePipelineKey::Hash() const noexcept { 22size_t ComputePipelineKey::Hash() const noexcept {
32 return static_cast<size_t>( 23 return static_cast<size_t>(
33 Common::CityHash64(reinterpret_cast<const char*>(this), sizeof *this)); 24 Common::CityHash64(reinterpret_cast<const char*>(this), sizeof *this));
@@ -58,17 +49,17 @@ ComputePipeline::ComputePipeline(const Device& device, TextureCache& texture_cac
58 std::copy_n(info.constant_buffer_used_sizes.begin(), uniform_buffer_sizes.size(), 49 std::copy_n(info.constant_buffer_used_sizes.begin(), uniform_buffer_sizes.size(),
59 uniform_buffer_sizes.begin()); 50 uniform_buffer_sizes.begin());
60 51
61 num_texture_buffers = AccumulateCount(info.texture_buffer_descriptors); 52 num_texture_buffers = Shader::NumDescriptors(info.texture_buffer_descriptors);
62 num_image_buffers = AccumulateCount(info.image_buffer_descriptors); 53 num_image_buffers = Shader::NumDescriptors(info.image_buffer_descriptors);
63 54
64 const u32 num_textures{num_texture_buffers + AccumulateCount(info.texture_descriptors)}; 55 const u32 num_textures{num_texture_buffers + Shader::NumDescriptors(info.texture_descriptors)};
65 ASSERT(num_textures <= MAX_TEXTURES); 56 ASSERT(num_textures <= MAX_TEXTURES);
66 57
67 const u32 num_images{num_image_buffers + AccumulateCount(info.image_descriptors)}; 58 const u32 num_images{num_image_buffers + Shader::NumDescriptors(info.image_descriptors)};
68 ASSERT(num_images <= MAX_IMAGES); 59 ASSERT(num_images <= MAX_IMAGES);
69 60
70 const bool is_glasm{assembly_program.handle != 0}; 61 const bool is_glasm{assembly_program.handle != 0};
71 const u32 num_storage_buffers{AccumulateCount(info.storage_buffers_descriptors)}; 62 const u32 num_storage_buffers{Shader::NumDescriptors(info.storage_buffers_descriptors)};
72 use_storage_buffers = 63 use_storage_buffers =
73 !is_glasm || num_storage_buffers < device.GetMaxGLASMStorageBufferBlocks(); 64 !is_glasm || num_storage_buffers < device.GetMaxGLASMStorageBufferBlocks();
74 writes_global_memory = !use_storage_buffers && 65 writes_global_memory = !use_storage_buffers &&
diff --git a/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp b/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp
index bccb37a58..43ab5c03b 100644
--- a/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp
+++ b/src/video_core/renderer_opengl/gl_graphics_pipeline.cpp
@@ -27,6 +27,7 @@ namespace OpenGL {
27namespace { 27namespace {
28using Shader::ImageBufferDescriptor; 28using Shader::ImageBufferDescriptor;
29using Shader::ImageDescriptor; 29using Shader::ImageDescriptor;
30using Shader::NumDescriptors;
30using Shader::TextureBufferDescriptor; 31using Shader::TextureBufferDescriptor;
31using Shader::TextureDescriptor; 32using Shader::TextureDescriptor;
32using Tegra::Texture::TexturePair; 33using Tegra::Texture::TexturePair;
@@ -35,15 +36,6 @@ using VideoCommon::ImageId;
35constexpr u32 MAX_TEXTURES = 64; 36constexpr u32 MAX_TEXTURES = 64;
36constexpr u32 MAX_IMAGES = 8; 37constexpr u32 MAX_IMAGES = 8;
37 38
38template <typename Range>
39u32 AccumulateCount(const Range& range) {
40 u32 num{};
41 for (const auto& desc : range) {
42 num += desc.count;
43 }
44 return num;
45}
46
47GLenum Stage(size_t stage_index) { 39GLenum Stage(size_t stage_index) {
48 switch (stage_index) { 40 switch (stage_index) {
49 case 0: 41 case 0:
@@ -204,23 +196,23 @@ GraphicsPipeline::GraphicsPipeline(
204 base_uniform_bindings[stage + 1] = base_uniform_bindings[stage]; 196 base_uniform_bindings[stage + 1] = base_uniform_bindings[stage];
205 base_storage_bindings[stage + 1] = base_storage_bindings[stage]; 197 base_storage_bindings[stage + 1] = base_storage_bindings[stage];
206 198
207 base_uniform_bindings[stage + 1] += AccumulateCount(info.constant_buffer_descriptors); 199 base_uniform_bindings[stage + 1] += NumDescriptors(info.constant_buffer_descriptors);
208 base_storage_bindings[stage + 1] += AccumulateCount(info.storage_buffers_descriptors); 200 base_storage_bindings[stage + 1] += NumDescriptors(info.storage_buffers_descriptors);
209 } 201 }
210 enabled_uniform_buffer_masks[stage] = info.constant_buffer_mask; 202 enabled_uniform_buffer_masks[stage] = info.constant_buffer_mask;
211 std::ranges::copy(info.constant_buffer_used_sizes, uniform_buffer_sizes[stage].begin()); 203 std::ranges::copy(info.constant_buffer_used_sizes, uniform_buffer_sizes[stage].begin());
212 204
213 const u32 num_tex_buffer_bindings{AccumulateCount(info.texture_buffer_descriptors)}; 205 const u32 num_tex_buffer_bindings{NumDescriptors(info.texture_buffer_descriptors)};
214 num_texture_buffers[stage] += num_tex_buffer_bindings; 206 num_texture_buffers[stage] += num_tex_buffer_bindings;
215 num_textures += num_tex_buffer_bindings; 207 num_textures += num_tex_buffer_bindings;
216 208
217 const u32 num_img_buffers_bindings{AccumulateCount(info.image_buffer_descriptors)}; 209 const u32 num_img_buffers_bindings{NumDescriptors(info.image_buffer_descriptors)};
218 num_image_buffers[stage] += num_img_buffers_bindings; 210 num_image_buffers[stage] += num_img_buffers_bindings;
219 num_images += num_img_buffers_bindings; 211 num_images += num_img_buffers_bindings;
220 212
221 num_textures += AccumulateCount(info.texture_descriptors); 213 num_textures += NumDescriptors(info.texture_descriptors);
222 num_images += AccumulateCount(info.image_descriptors); 214 num_images += NumDescriptors(info.image_descriptors);
223 num_storage_buffers += AccumulateCount(info.storage_buffers_descriptors); 215 num_storage_buffers += NumDescriptors(info.storage_buffers_descriptors);
224 216
225 writes_global_memory |= std::ranges::any_of( 217 writes_global_memory |= std::ranges::any_of(
226 info.storage_buffers_descriptors, [](const auto& desc) { return desc.is_written; }); 218 info.storage_buffers_descriptors, [](const auto& desc) { return desc.is_written; });
@@ -423,13 +415,9 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) {
423 add_buffer(desc); 415 add_buffer(desc);
424 } 416 }
425 } 417 }
426 for (const auto& desc : info.texture_descriptors) { 418 texture_buffer_index += Shader::NumDescriptors(info.texture_descriptors);
427 texture_buffer_index += desc.count;
428 }
429 if constexpr (Spec::has_images) { 419 if constexpr (Spec::has_images) {
430 for (const auto& desc : info.image_descriptors) { 420 texture_buffer_index += Shader::NumDescriptors(info.image_descriptors);
431 texture_buffer_index += desc.count;
432 }
433 } 421 }
434 }}; 422 }};
435 if constexpr (Spec::enabled_stages[0]) { 423 if constexpr (Spec::enabled_stages[0]) {
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp
index 02682bd76..42ef67628 100644
--- a/src/video_core/renderer_opengl/gl_shader_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp
@@ -426,16 +426,14 @@ std::unique_ptr<GraphicsPipeline> ShaderCache::CreateGraphicsPipeline(
426 // Normal path 426 // Normal path
427 programs[index] = TranslateProgram(pools.inst, pools.block, env, cfg, host_info); 427 programs[index] = TranslateProgram(pools.inst, pools.block, env, cfg, host_info);
428 428
429 for (const auto& desc : programs[index].info.storage_buffers_descriptors) { 429 total_storage_buffers +=
430 total_storage_buffers += desc.count; 430 Shader::NumDescriptors(programs[index].info.storage_buffers_descriptors);
431 }
432 } else { 431 } else {
433 // VertexB path when VertexA is present. 432 // VertexB path when VertexA is present.
434 auto& program_va{programs[0]}; 433 auto& program_va{programs[0]};
435 auto program_vb{TranslateProgram(pools.inst, pools.block, env, cfg, host_info)}; 434 auto program_vb{TranslateProgram(pools.inst, pools.block, env, cfg, host_info)};
436 for (const auto& desc : program_vb.info.storage_buffers_descriptors) { 435 total_storage_buffers +=
437 total_storage_buffers += desc.count; 436 Shader::NumDescriptors(program_vb.info.storage_buffers_descriptors);
438 }
439 programs[index] = MergeDualVertexPrograms(program_va, program_vb, env); 437 programs[index] = MergeDualVertexPrograms(program_va, program_vb, env);
440 } 438 }
441 } 439 }
@@ -510,10 +508,7 @@ std::unique_ptr<ComputePipeline> ShaderCache::CreateComputePipeline(
510 Shader::Maxwell::Flow::CFG cfg{env, pools.flow_block, env.StartAddress()}; 508 Shader::Maxwell::Flow::CFG cfg{env, pools.flow_block, env.StartAddress()};
511 auto program{TranslateProgram(pools.inst, pools.block, env, cfg, host_info)}; 509 auto program{TranslateProgram(pools.inst, pools.block, env, cfg, host_info)};
512 510
513 u32 num_storage_buffers{}; 511 const u32 num_storage_buffers{Shader::NumDescriptors(program.info.storage_buffers_descriptors)};
514 for (const auto& desc : program.info.storage_buffers_descriptors) {
515 num_storage_buffers += desc.count;
516 }
517 Shader::RuntimeInfo info; 512 Shader::RuntimeInfo info;
518 info.glasm_use_storage_buffers = num_storage_buffers <= device.GetMaxGLASMStorageBufferBlocks(); 513 info.glasm_use_storage_buffers = num_storage_buffers <= device.GetMaxGLASMStorageBufferBlocks();
519 514