Merge pull request #3143 from ReinUsesLisp/indexing-bug
gl_device: Deduce indexing bug from device instead of heuristic
This commit is contained in:
commit
6df6caaf5f
|
@ -137,6 +137,7 @@ Device::Device() : base_bindings{BuildBaseBindings()} {
|
||||||
const std::vector extensions = GetExtensions();
|
const std::vector extensions = GetExtensions();
|
||||||
|
|
||||||
const bool is_nvidia = vendor == "NVIDIA Corporation";
|
const bool is_nvidia = vendor == "NVIDIA Corporation";
|
||||||
|
const bool is_amd = vendor == "ATI Technologies Inc.";
|
||||||
const bool is_intel = vendor == "Intel";
|
const bool is_intel = vendor == "Intel";
|
||||||
|
|
||||||
uniform_buffer_alignment = GetInteger<std::size_t>(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT);
|
uniform_buffer_alignment = GetInteger<std::size_t>(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT);
|
||||||
|
@ -149,7 +150,7 @@ Device::Device() : base_bindings{BuildBaseBindings()} {
|
||||||
has_vertex_viewport_layer = GLAD_GL_ARB_shader_viewport_layer_array;
|
has_vertex_viewport_layer = GLAD_GL_ARB_shader_viewport_layer_array;
|
||||||
has_image_load_formatted = HasExtension(extensions, "GL_EXT_shader_image_load_formatted");
|
has_image_load_formatted = HasExtension(extensions, "GL_EXT_shader_image_load_formatted");
|
||||||
has_variable_aoffi = TestVariableAoffi();
|
has_variable_aoffi = TestVariableAoffi();
|
||||||
has_component_indexing_bug = TestComponentIndexingBug();
|
has_component_indexing_bug = is_amd;
|
||||||
has_precise_bug = TestPreciseBug();
|
has_precise_bug = TestPreciseBug();
|
||||||
has_broken_compute = is_intel;
|
has_broken_compute = is_intel;
|
||||||
has_fast_buffer_sub_data = is_nvidia;
|
has_fast_buffer_sub_data = is_nvidia;
|
||||||
|
@ -184,52 +185,6 @@ void main() {
|
||||||
})");
|
})");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Device::TestComponentIndexingBug() {
|
|
||||||
const GLchar* COMPONENT_TEST = R"(#version 430 core
|
|
||||||
layout (std430, binding = 0) buffer OutputBuffer {
|
|
||||||
uint output_value;
|
|
||||||
};
|
|
||||||
layout (std140, binding = 0) uniform InputBuffer {
|
|
||||||
uvec4 input_value[4096];
|
|
||||||
};
|
|
||||||
layout (location = 0) uniform uint idx;
|
|
||||||
void main() {
|
|
||||||
output_value = input_value[idx >> 2][idx & 3];
|
|
||||||
})";
|
|
||||||
const GLuint shader{glCreateShaderProgramv(GL_VERTEX_SHADER, 1, &COMPONENT_TEST)};
|
|
||||||
SCOPE_EXIT({ glDeleteProgram(shader); });
|
|
||||||
glUseProgram(shader);
|
|
||||||
|
|
||||||
OGLVertexArray vao;
|
|
||||||
vao.Create();
|
|
||||||
glBindVertexArray(vao.handle);
|
|
||||||
|
|
||||||
constexpr std::array<GLuint, 8> values{0, 0, 0, 0, 0x1236327, 0x985482, 0x872753, 0x2378432};
|
|
||||||
OGLBuffer ubo;
|
|
||||||
ubo.Create();
|
|
||||||
glNamedBufferData(ubo.handle, sizeof(values), values.data(), GL_STATIC_DRAW);
|
|
||||||
glBindBufferBase(GL_UNIFORM_BUFFER, 0, ubo.handle);
|
|
||||||
|
|
||||||
OGLBuffer ssbo;
|
|
||||||
ssbo.Create();
|
|
||||||
glNamedBufferStorage(ssbo.handle, sizeof(GLuint), nullptr, GL_CLIENT_STORAGE_BIT);
|
|
||||||
|
|
||||||
for (GLuint index = 4; index < 8; ++index) {
|
|
||||||
glInvalidateBufferData(ssbo.handle);
|
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, ssbo.handle);
|
|
||||||
|
|
||||||
glProgramUniform1ui(shader, 0, index);
|
|
||||||
glDrawArrays(GL_POINTS, 0, 1);
|
|
||||||
|
|
||||||
GLuint result;
|
|
||||||
glGetNamedBufferSubData(ssbo.handle, 0, sizeof(result), &result);
|
|
||||||
if (result != values.at(index)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Device::TestPreciseBug() {
|
bool Device::TestPreciseBug() {
|
||||||
return !TestProgram(R"(#version 430 core
|
return !TestProgram(R"(#version 430 core
|
||||||
in vec3 coords;
|
in vec3 coords;
|
||||||
|
|
|
@ -86,7 +86,6 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static bool TestVariableAoffi();
|
static bool TestVariableAoffi();
|
||||||
static bool TestComponentIndexingBug();
|
|
||||||
static bool TestPreciseBug();
|
static bool TestPreciseBug();
|
||||||
|
|
||||||
std::array<BaseBindings, Tegra::Engines::MaxShaderTypes> base_bindings;
|
std::array<BaseBindings, Tegra::Engines::MaxShaderTypes> base_bindings;
|
||||||
|
|
Reference in New Issue