diff options
| author | 2021-07-25 22:27:16 -0300 | |
|---|---|---|
| committer | 2021-11-16 22:11:28 +0100 | |
| commit | 6f3a41abe2caa617ae540fb7e4a3c4a092478963 (patch) | |
| tree | 27a9a2fc200b38db0502a0e2a26b2b7cb062b8a3 /src | |
| parent | spirv: Implement rescaling patching (diff) | |
| download | yuzu-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.cpp | 19 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_graphics_pipeline.cpp | 32 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_cache.cpp | 15 |
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; | |||
| 19 | constexpr u32 MAX_TEXTURES = 64; | 19 | constexpr u32 MAX_TEXTURES = 64; |
| 20 | constexpr u32 MAX_IMAGES = 16; | 20 | constexpr u32 MAX_IMAGES = 16; |
| 21 | 21 | ||
| 22 | template <typename Range> | ||
| 23 | u32 AccumulateCount(const Range& range) { | ||
| 24 | u32 num{}; | ||
| 25 | for (const auto& desc : range) { | ||
| 26 | num += desc.count; | ||
| 27 | } | ||
| 28 | return num; | ||
| 29 | } | ||
| 30 | |||
| 31 | size_t ComputePipelineKey::Hash() const noexcept { | 22 | size_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 { | |||
| 27 | namespace { | 27 | namespace { |
| 28 | using Shader::ImageBufferDescriptor; | 28 | using Shader::ImageBufferDescriptor; |
| 29 | using Shader::ImageDescriptor; | 29 | using Shader::ImageDescriptor; |
| 30 | using Shader::NumDescriptors; | ||
| 30 | using Shader::TextureBufferDescriptor; | 31 | using Shader::TextureBufferDescriptor; |
| 31 | using Shader::TextureDescriptor; | 32 | using Shader::TextureDescriptor; |
| 32 | using Tegra::Texture::TexturePair; | 33 | using Tegra::Texture::TexturePair; |
| @@ -35,15 +36,6 @@ using VideoCommon::ImageId; | |||
| 35 | constexpr u32 MAX_TEXTURES = 64; | 36 | constexpr u32 MAX_TEXTURES = 64; |
| 36 | constexpr u32 MAX_IMAGES = 8; | 37 | constexpr u32 MAX_IMAGES = 8; |
| 37 | 38 | ||
| 38 | template <typename Range> | ||
| 39 | u32 AccumulateCount(const Range& range) { | ||
| 40 | u32 num{}; | ||
| 41 | for (const auto& desc : range) { | ||
| 42 | num += desc.count; | ||
| 43 | } | ||
| 44 | return num; | ||
| 45 | } | ||
| 46 | |||
| 47 | GLenum Stage(size_t stage_index) { | 39 | GLenum 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 | ||