summaryrefslogtreecommitdiffstats
path: root/src/video_core
diff options
context:
space:
mode:
authorRodrigo Locatti <reinuseslisp@airmail.cc>2020-06-18 09:59:48 +0200
committerGitHub <noreply@github.com>2020-06-18 09:59:48 +0200
commitedb2114bac99ee6bab82adad9aef1c8e1aacda9a (patch)
tree7284dc7a11aa026aa898db2a9831d9cb6ee37dd9 /src/video_core
parentMerge pull request #4100 from MerryMage/no-a32-interp (diff)
parentgl_device: Reserve at least 4 image bindings for fragment stage (diff)
downloadyuzu-edb2114bac99ee6bab82adad9aef1c8e1aacda9a.tar
yuzu-edb2114bac99ee6bab82adad9aef1c8e1aacda9a.tar.gz
yuzu-edb2114bac99ee6bab82adad9aef1c8e1aacda9a.tar.bz2
yuzu-edb2114bac99ee6bab82adad9aef1c8e1aacda9a.tar.lz
yuzu-edb2114bac99ee6bab82adad9aef1c8e1aacda9a.tar.xz
yuzu-edb2114bac99ee6bab82adad9aef1c8e1aacda9a.tar.zst
yuzu-edb2114bac99ee6bab82adad9aef1c8e1aacda9a.zip
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/renderer_opengl/gl_device.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/video_core/renderer_opengl/gl_device.cpp b/src/video_core/renderer_opengl/gl_device.cpp
index e245e27ec..b31d604e4 100644
--- a/src/video_core/renderer_opengl/gl_device.cpp
+++ b/src/video_core/renderer_opengl/gl_device.cpp
@@ -123,16 +123,24 @@ std::array<Device::BaseBindings, Tegra::Engines::MaxShaderTypes> BuildBaseBindin
u32 num_images = GetInteger<u32>(GL_MAX_IMAGE_UNITS);
u32 base_images = 0;
- // Reserve more image bindings on fragment and vertex stages.
+ // GL_MAX_IMAGE_UNITS is guaranteed by the spec to have a minimum value of 8.
+ // Due to the limitation of GL_MAX_IMAGE_UNITS, reserve at least 4 image bindings on the
+ // fragment stage, and at least 1 for the rest of the stages.
+ // So far games are observed to use 1 image binding on vertex and 4 on fragment stages.
+
+ // Reserve at least 4 image bindings on the fragment stage.
bindings[4].image =
- Extract(base_images, num_images, num_images / NumStages + 2, LimitImages[4]);
- bindings[0].image =
- Extract(base_images, num_images, num_images / NumStages + 1, LimitImages[0]);
+ Extract(base_images, num_images, std::max(4U, num_images / NumStages), LimitImages[4]);
+
+ // This is guaranteed to be at least 1.
+ const u32 total_extracted_images = num_images / (NumStages - 1);
// Reserve the other image bindings.
- const u32 total_extracted_images = num_images / (NumStages - 2);
- for (std::size_t i = 2; i < NumStages; ++i) {
+ for (std::size_t i = 0; i < NumStages; ++i) {
const std::size_t stage = stage_swizzle[i];
+ if (stage == 4) {
+ continue;
+ }
bindings[stage].image =
Extract(base_images, num_images, total_extracted_images, LimitImages[stage]);
}