diff options
| author | 2021-05-23 21:24:24 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:33 -0400 | |
| commit | 80884e32701e1e93fded045be4c235ff143d6ea0 (patch) | |
| tree | 227a5fc0e4fda615fb75450f3df6f37852696dd1 /src | |
| parent | glasm: Implement global memory fallbacks (diff) | |
| download | yuzu-80884e32701e1e93fded045be4c235ff143d6ea0.tar.gz yuzu-80884e32701e1e93fded045be4c235ff143d6ea0.tar.xz yuzu-80884e32701e1e93fded045be4c235ff143d6ea0.zip | |
gl_graphics_program: Fix texture buffer bindings
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_graphics_program.cpp | 59 |
1 files changed, 35 insertions, 24 deletions
diff --git a/src/video_core/renderer_opengl/gl_graphics_program.cpp b/src/video_core/renderer_opengl/gl_graphics_program.cpp index 9677a3ed6..7c3d23f85 100644 --- a/src/video_core/renderer_opengl/gl_graphics_program.cpp +++ b/src/video_core/renderer_opengl/gl_graphics_program.cpp | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include <algorithm> | ||
| 5 | #include <cstring> | 6 | #include <cstring> |
| 6 | 7 | ||
| 7 | #include "common/cityhash.h" | 8 | #include "common/cityhash.h" |
| @@ -14,12 +15,24 @@ | |||
| 14 | namespace OpenGL { | 15 | namespace OpenGL { |
| 15 | namespace { | 16 | namespace { |
| 16 | using Shader::ImageBufferDescriptor; | 17 | using Shader::ImageBufferDescriptor; |
| 18 | using Shader::ImageDescriptor; | ||
| 19 | using Shader::TextureBufferDescriptor; | ||
| 20 | using Shader::TextureDescriptor; | ||
| 17 | using Tegra::Texture::TexturePair; | 21 | using Tegra::Texture::TexturePair; |
| 18 | using VideoCommon::ImageId; | 22 | using VideoCommon::ImageId; |
| 19 | 23 | ||
| 20 | constexpr u32 MAX_TEXTURES = 64; | 24 | constexpr u32 MAX_TEXTURES = 64; |
| 21 | constexpr u32 MAX_IMAGES = 8; | 25 | constexpr u32 MAX_IMAGES = 8; |
| 22 | 26 | ||
| 27 | template <typename Range> | ||
| 28 | u32 AccumulateCount(Range&& range) { | ||
| 29 | u32 num{}; | ||
| 30 | for (const auto& desc : range) { | ||
| 31 | num += desc.count; | ||
| 32 | } | ||
| 33 | return num; | ||
| 34 | } | ||
| 35 | |||
| 23 | /// Translates hardware transform feedback indices | 36 | /// Translates hardware transform feedback indices |
| 24 | /// @param location Hardware location | 37 | /// @param location Hardware location |
| 25 | /// @return Pair of ARB_transform_feedback3 token stream first and third arguments | 38 | /// @return Pair of ARB_transform_feedback3 token stream first and third arguments |
| @@ -77,30 +90,25 @@ GraphicsProgram::GraphicsProgram(TextureCache& texture_cache_, BufferCache& buff | |||
| 77 | } | 90 | } |
| 78 | u32 num_textures{}; | 91 | u32 num_textures{}; |
| 79 | u32 num_images{}; | 92 | u32 num_images{}; |
| 80 | for (size_t stage = 0; stage < base_uniform_bindings.size() - 1; ++stage) { | 93 | for (size_t stage = 0; stage < base_uniform_bindings.size(); ++stage) { |
| 81 | const auto& info{stage_infos[stage]}; | 94 | const auto& info{stage_infos[stage]}; |
| 82 | base_uniform_bindings[stage + 1] = base_uniform_bindings[stage]; | 95 | if (stage < 4) { |
| 83 | base_storage_bindings[stage + 1] = base_storage_bindings[stage]; | 96 | base_uniform_bindings[stage + 1] = base_uniform_bindings[stage]; |
| 84 | for (const auto& desc : info.constant_buffer_descriptors) { | 97 | base_storage_bindings[stage + 1] = base_storage_bindings[stage]; |
| 85 | base_uniform_bindings[stage + 1] += desc.count; | 98 | |
| 86 | } | 99 | base_uniform_bindings[stage + 1] += AccumulateCount(info.constant_buffer_descriptors); |
| 87 | for (const auto& desc : info.storage_buffers_descriptors) { | 100 | base_storage_bindings[stage + 1] += AccumulateCount(info.storage_buffers_descriptors); |
| 88 | base_storage_bindings[stage + 1] += desc.count; | ||
| 89 | } | ||
| 90 | for (const auto& desc : info.texture_buffer_descriptors) { | ||
| 91 | num_texture_buffers[stage] += desc.count; | ||
| 92 | num_textures += desc.count; | ||
| 93 | } | ||
| 94 | for (const auto& desc : info.image_buffer_descriptors) { | ||
| 95 | num_image_buffers[stage] += desc.count; | ||
| 96 | num_images += desc.count; | ||
| 97 | } | ||
| 98 | for (const auto& desc : info.texture_descriptors) { | ||
| 99 | num_textures += desc.count; | ||
| 100 | } | ||
| 101 | for (const auto& desc : info.image_descriptors) { | ||
| 102 | num_images += desc.count; | ||
| 103 | } | 101 | } |
| 102 | const u32 num_tex_buffer_bindings{AccumulateCount(info.texture_buffer_descriptors)}; | ||
| 103 | num_texture_buffers[stage] += num_tex_buffer_bindings; | ||
| 104 | num_textures += num_tex_buffer_bindings; | ||
| 105 | |||
| 106 | const u32 num_img_buffers_bindings{AccumulateCount(info.image_buffer_descriptors)}; | ||
| 107 | num_image_buffers[stage] += num_img_buffers_bindings; | ||
| 108 | num_images += num_img_buffers_bindings; | ||
| 109 | |||
| 110 | num_textures += AccumulateCount(info.texture_descriptors); | ||
| 111 | num_images += AccumulateCount(info.image_descriptors); | ||
| 104 | } | 112 | } |
| 105 | ASSERT(num_textures <= MAX_TEXTURES); | 113 | ASSERT(num_textures <= MAX_TEXTURES); |
| 106 | ASSERT(num_images <= MAX_IMAGES); | 114 | ASSERT(num_images <= MAX_IMAGES); |
| @@ -151,8 +159,8 @@ void GraphicsProgram::Configure(bool is_indexed) { | |||
| 151 | const u32 index_offset{index << desc.size_shift}; | 159 | const u32 index_offset{index << desc.size_shift}; |
| 152 | const u32 offset{desc.cbuf_offset + index_offset}; | 160 | const u32 offset{desc.cbuf_offset + index_offset}; |
| 153 | const GPUVAddr addr{cbufs[desc.cbuf_index].address + offset}; | 161 | const GPUVAddr addr{cbufs[desc.cbuf_index].address + offset}; |
| 154 | if constexpr (std::is_same_v<decltype(desc), const Shader::TextureDescriptor&> || | 162 | if constexpr (std::is_same_v<decltype(desc), const TextureDescriptor&> || |
| 155 | std::is_same_v<decltype(desc), const Shader::TextureBufferDescriptor&>) { | 163 | std::is_same_v<decltype(desc), const TextureBufferDescriptor&>) { |
| 156 | if (desc.has_secondary) { | 164 | if (desc.has_secondary) { |
| 157 | ASSERT(cbufs[desc.secondary_cbuf_index].enabled); | 165 | ASSERT(cbufs[desc.secondary_cbuf_index].enabled); |
| 158 | const u32 second_offset{desc.secondary_cbuf_offset + index_offset}; | 166 | const u32 second_offset{desc.secondary_cbuf_offset + index_offset}; |
| @@ -297,6 +305,9 @@ void GraphicsProgram::Configure(bool is_indexed) { | |||
| 297 | texture_binding += num_texture_buffers[stage]; | 305 | texture_binding += num_texture_buffers[stage]; |
| 298 | image_binding += num_image_buffers[stage]; | 306 | image_binding += num_image_buffers[stage]; |
| 299 | 307 | ||
| 308 | views_it += num_texture_buffers[stage]; | ||
| 309 | views_it += num_image_buffers[stage]; | ||
| 310 | |||
| 300 | const auto& info{stage_infos[stage]}; | 311 | const auto& info{stage_infos[stage]}; |
| 301 | for (const auto& desc : info.texture_descriptors) { | 312 | for (const auto& desc : info.texture_descriptors) { |
| 302 | for (u32 index = 0; index < desc.count; ++index) { | 313 | for (u32 index = 0; index < desc.count; ++index) { |