Răsfoiți Sursa

gl_graphics_program: Fix texture buffer bindings

ReinUsesLisp 5 ani în urmă
părinte
comite
80884e3270
1 a modificat fișierele cu 35 adăugiri și 24 ștergeri
  1. 35 24
      src/video_core/renderer_opengl/gl_graphics_program.cpp

+ 35 - 24
src/video_core/renderer_opengl/gl_graphics_program.cpp

@@ -2,6 +2,7 @@
 // Licensed under GPLv2 or any later version
 // Refer to the license.txt file included.
 
+#include <algorithm>
 #include <cstring>
 
 #include "common/cityhash.h"
@@ -14,12 +15,24 @@
 namespace OpenGL {
 namespace {
 using Shader::ImageBufferDescriptor;
+using Shader::ImageDescriptor;
+using Shader::TextureBufferDescriptor;
+using Shader::TextureDescriptor;
 using Tegra::Texture::TexturePair;
 using VideoCommon::ImageId;
 
 constexpr u32 MAX_TEXTURES = 64;
 constexpr u32 MAX_IMAGES = 8;
 
+template <typename Range>
+u32 AccumulateCount(Range&& range) {
+    u32 num{};
+    for (const auto& desc : range) {
+        num += desc.count;
+    }
+    return num;
+}
+
 /// Translates hardware transform feedback indices
 /// @param location Hardware location
 /// @return Pair of ARB_transform_feedback3 token stream first and third arguments
@@ -77,30 +90,25 @@ GraphicsProgram::GraphicsProgram(TextureCache& texture_cache_, BufferCache& buff
     }
     u32 num_textures{};
     u32 num_images{};
-    for (size_t stage = 0; stage < base_uniform_bindings.size() - 1; ++stage) {
+    for (size_t stage = 0; stage < base_uniform_bindings.size(); ++stage) {
         const auto& info{stage_infos[stage]};
-        base_uniform_bindings[stage + 1] = base_uniform_bindings[stage];
-        base_storage_bindings[stage + 1] = base_storage_bindings[stage];
-        for (const auto& desc : info.constant_buffer_descriptors) {
-            base_uniform_bindings[stage + 1] += desc.count;
-        }
-        for (const auto& desc : info.storage_buffers_descriptors) {
-            base_storage_bindings[stage + 1] += desc.count;
-        }
-        for (const auto& desc : info.texture_buffer_descriptors) {
-            num_texture_buffers[stage] += desc.count;
-            num_textures += desc.count;
-        }
-        for (const auto& desc : info.image_buffer_descriptors) {
-            num_image_buffers[stage] += desc.count;
-            num_images += desc.count;
-        }
-        for (const auto& desc : info.texture_descriptors) {
-            num_textures += desc.count;
-        }
-        for (const auto& desc : info.image_descriptors) {
-            num_images += desc.count;
+        if (stage < 4) {
+            base_uniform_bindings[stage + 1] = base_uniform_bindings[stage];
+            base_storage_bindings[stage + 1] = base_storage_bindings[stage];
+
+            base_uniform_bindings[stage + 1] += AccumulateCount(info.constant_buffer_descriptors);
+            base_storage_bindings[stage + 1] += AccumulateCount(info.storage_buffers_descriptors);
         }
+        const u32 num_tex_buffer_bindings{AccumulateCount(info.texture_buffer_descriptors)};
+        num_texture_buffers[stage] += num_tex_buffer_bindings;
+        num_textures += num_tex_buffer_bindings;
+
+        const u32 num_img_buffers_bindings{AccumulateCount(info.image_buffer_descriptors)};
+        num_image_buffers[stage] += num_img_buffers_bindings;
+        num_images += num_img_buffers_bindings;
+
+        num_textures += AccumulateCount(info.texture_descriptors);
+        num_images += AccumulateCount(info.image_descriptors);
     }
     ASSERT(num_textures <= MAX_TEXTURES);
     ASSERT(num_images <= MAX_IMAGES);
@@ -151,8 +159,8 @@ void GraphicsProgram::Configure(bool is_indexed) {
             const u32 index_offset{index << desc.size_shift};
             const u32 offset{desc.cbuf_offset + index_offset};
             const GPUVAddr addr{cbufs[desc.cbuf_index].address + offset};
-            if constexpr (std::is_same_v<decltype(desc), const Shader::TextureDescriptor&> ||
-                          std::is_same_v<decltype(desc), const Shader::TextureBufferDescriptor&>) {
+            if constexpr (std::is_same_v<decltype(desc), const TextureDescriptor&> ||
+                          std::is_same_v<decltype(desc), const TextureBufferDescriptor&>) {
                 if (desc.has_secondary) {
                     ASSERT(cbufs[desc.secondary_cbuf_index].enabled);
                     const u32 second_offset{desc.secondary_cbuf_offset + index_offset};
@@ -297,6 +305,9 @@ void GraphicsProgram::Configure(bool is_indexed) {
         texture_binding += num_texture_buffers[stage];
         image_binding += num_image_buffers[stage];
 
+        views_it += num_texture_buffers[stage];
+        views_it += num_image_buffers[stage];
+
         const auto& info{stage_infos[stage]};
         for (const auto& desc : info.texture_descriptors) {
             for (u32 index = 0; index < desc.count; ++index) {