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;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user