summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-11-19 23:55:17 -0300
committerGravatar ReinUsesLisp2019-11-25 16:15:22 -0300
commit410d44ce0577dd81fd1debda0fd14b0011238f10 (patch)
tree9b09205f0596df10e38a9f1c175ff2d2343ecea5
parentMerge pull request #3160 from DarkLordZach/opt-ea-clang-fmt (diff)
downloadyuzu-410d44ce0577dd81fd1debda0fd14b0011238f10.tar.gz
yuzu-410d44ce0577dd81fd1debda0fd14b0011238f10.tar.xz
yuzu-410d44ce0577dd81fd1debda0fd14b0011238f10.zip
gl_device: Deduce indexing bug from device instead of heuristic
The heuristic to detect AMD's driver was not working properly since it also included Intel. Instead of using heuristics to detect it, compare the GL_VENDOR string.
-rw-r--r--src/video_core/renderer_opengl/gl_device.cpp49
-rw-r--r--src/video_core/renderer_opengl/gl_device.h1
2 files changed, 2 insertions, 48 deletions
diff --git a/src/video_core/renderer_opengl/gl_device.cpp b/src/video_core/renderer_opengl/gl_device.cpp
index a95bd4b2c..413d8546b 100644
--- a/src/video_core/renderer_opengl/gl_device.cpp
+++ b/src/video_core/renderer_opengl/gl_device.cpp
@@ -137,6 +137,7 @@ Device::Device() : base_bindings{BuildBaseBindings()} {
137 const std::vector extensions = GetExtensions(); 137 const std::vector extensions = GetExtensions();
138 138
139 const bool is_nvidia = vendor == "NVIDIA Corporation"; 139 const bool is_nvidia = vendor == "NVIDIA Corporation";
140 const bool is_amd = vendor == "ATI Technologies Inc.";
140 const bool is_intel = vendor == "Intel"; 141 const bool is_intel = vendor == "Intel";
141 142
142 uniform_buffer_alignment = GetInteger<std::size_t>(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT); 143 uniform_buffer_alignment = GetInteger<std::size_t>(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT);
@@ -149,7 +150,7 @@ Device::Device() : base_bindings{BuildBaseBindings()} {
149 has_vertex_viewport_layer = GLAD_GL_ARB_shader_viewport_layer_array; 150 has_vertex_viewport_layer = GLAD_GL_ARB_shader_viewport_layer_array;
150 has_image_load_formatted = HasExtension(extensions, "GL_EXT_shader_image_load_formatted"); 151 has_image_load_formatted = HasExtension(extensions, "GL_EXT_shader_image_load_formatted");
151 has_variable_aoffi = TestVariableAoffi(); 152 has_variable_aoffi = TestVariableAoffi();
152 has_component_indexing_bug = TestComponentIndexingBug(); 153 has_component_indexing_bug = is_amd;
153 has_precise_bug = TestPreciseBug(); 154 has_precise_bug = TestPreciseBug();
154 has_broken_compute = is_intel; 155 has_broken_compute = is_intel;
155 has_fast_buffer_sub_data = is_nvidia; 156 has_fast_buffer_sub_data = is_nvidia;
@@ -184,52 +185,6 @@ void main() {
184})"); 185})");
185} 186}
186 187
187bool Device::TestComponentIndexingBug() {
188 const GLchar* COMPONENT_TEST = R"(#version 430 core
189layout (std430, binding = 0) buffer OutputBuffer {
190 uint output_value;
191};
192layout (std140, binding = 0) uniform InputBuffer {
193 uvec4 input_value[4096];
194};
195layout (location = 0) uniform uint idx;
196void main() {
197 output_value = input_value[idx >> 2][idx & 3];
198})";
199 const GLuint shader{glCreateShaderProgramv(GL_VERTEX_SHADER, 1, &COMPONENT_TEST)};
200 SCOPE_EXIT({ glDeleteProgram(shader); });
201 glUseProgram(shader);
202
203 OGLVertexArray vao;
204 vao.Create();
205 glBindVertexArray(vao.handle);
206
207 constexpr std::array<GLuint, 8> values{0, 0, 0, 0, 0x1236327, 0x985482, 0x872753, 0x2378432};
208 OGLBuffer ubo;
209 ubo.Create();
210 glNamedBufferData(ubo.handle, sizeof(values), values.data(), GL_STATIC_DRAW);
211 glBindBufferBase(GL_UNIFORM_BUFFER, 0, ubo.handle);
212
213 OGLBuffer ssbo;
214 ssbo.Create();
215 glNamedBufferStorage(ssbo.handle, sizeof(GLuint), nullptr, GL_CLIENT_STORAGE_BIT);
216
217 for (GLuint index = 4; index < 8; ++index) {
218 glInvalidateBufferData(ssbo.handle);
219 glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, ssbo.handle);
220
221 glProgramUniform1ui(shader, 0, index);
222 glDrawArrays(GL_POINTS, 0, 1);
223
224 GLuint result;
225 glGetNamedBufferSubData(ssbo.handle, 0, sizeof(result), &result);
226 if (result != values.at(index)) {
227 return true;
228 }
229 }
230 return false;
231}
232
233bool Device::TestPreciseBug() { 188bool Device::TestPreciseBug() {
234 return !TestProgram(R"(#version 430 core 189 return !TestProgram(R"(#version 430 core
235in vec3 coords; 190in vec3 coords;
diff --git a/src/video_core/renderer_opengl/gl_device.h b/src/video_core/renderer_opengl/gl_device.h
index 5433815b9..d73b099d0 100644
--- a/src/video_core/renderer_opengl/gl_device.h
+++ b/src/video_core/renderer_opengl/gl_device.h
@@ -86,7 +86,6 @@ public:
86 86
87private: 87private:
88 static bool TestVariableAoffi(); 88 static bool TestVariableAoffi();
89 static bool TestComponentIndexingBug();
90 static bool TestPreciseBug(); 89 static bool TestPreciseBug();
91 90
92 std::array<BaseBindings, Tegra::Engines::MaxShaderTypes> base_bindings; 91 std::array<BaseBindings, Tegra::Engines::MaxShaderTypes> base_bindings;