summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-05-23 21:24:24 -0300
committerGravatar ameerj2021-07-22 21:51:33 -0400
commit80884e32701e1e93fded045be4c235ff143d6ea0 (patch)
tree227a5fc0e4fda615fb75450f3df6f37852696dd1 /src
parentglasm: Implement global memory fallbacks (diff)
downloadyuzu-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.cpp59
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 @@
14namespace OpenGL { 15namespace OpenGL {
15namespace { 16namespace {
16using Shader::ImageBufferDescriptor; 17using Shader::ImageBufferDescriptor;
18using Shader::ImageDescriptor;
19using Shader::TextureBufferDescriptor;
20using Shader::TextureDescriptor;
17using Tegra::Texture::TexturePair; 21using Tegra::Texture::TexturePair;
18using VideoCommon::ImageId; 22using VideoCommon::ImageId;
19 23
20constexpr u32 MAX_TEXTURES = 64; 24constexpr u32 MAX_TEXTURES = 64;
21constexpr u32 MAX_IMAGES = 8; 25constexpr u32 MAX_IMAGES = 8;
22 26
27template <typename Range>
28u32 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) {