Merge pull request #1999 from ReinUsesLisp/dirty-shader
gl_shader_cache: Use dirty flags for shaders
This commit is contained in:
		
						commit
						23ebd4920e
					
				@ -135,6 +135,14 @@ void Maxwell3D::CallMethod(const GPU::MethodCall& method_call) {
 | 
			
		||||
 | 
			
		||||
    if (regs.reg_array[method_call.method] != method_call.argument) {
 | 
			
		||||
        regs.reg_array[method_call.method] = method_call.argument;
 | 
			
		||||
        // Shader
 | 
			
		||||
        constexpr u32 shader_registers_count =
 | 
			
		||||
            sizeof(regs.shader_config[0]) * Regs::MaxShaderProgram / sizeof(u32);
 | 
			
		||||
        if (method_call.method >= MAXWELL3D_REG_INDEX(shader_config[0]) &&
 | 
			
		||||
            method_call.method < MAXWELL3D_REG_INDEX(shader_config[0]) + shader_registers_count) {
 | 
			
		||||
            dirty_flags.shaders = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Vertex format
 | 
			
		||||
        if (method_call.method >= MAXWELL3D_REG_INDEX(vertex_attrib_format) &&
 | 
			
		||||
            method_call.method <
 | 
			
		||||
 | 
			
		||||
@ -1089,10 +1089,13 @@ public:
 | 
			
		||||
    MemoryManager& memory_manager;
 | 
			
		||||
 | 
			
		||||
    struct DirtyFlags {
 | 
			
		||||
        bool shaders = true;
 | 
			
		||||
 | 
			
		||||
        bool vertex_attrib_format = true;
 | 
			
		||||
        u32 vertex_array = 0xFFFFFFFF;
 | 
			
		||||
 | 
			
		||||
        void OnMemoryWrite() {
 | 
			
		||||
            shaders = true;
 | 
			
		||||
            vertex_array = 0xFFFFFFFF;
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
@ -293,7 +293,7 @@ DrawParameters RasterizerOpenGL::SetupDraw() {
 | 
			
		||||
 | 
			
		||||
void RasterizerOpenGL::SetupShaders(GLenum primitive_mode) {
 | 
			
		||||
    MICROPROFILE_SCOPE(OpenGL_Shader);
 | 
			
		||||
    const auto& gpu = Core::System::GetInstance().GPU().Maxwell3D();
 | 
			
		||||
    auto& gpu = Core::System::GetInstance().GPU().Maxwell3D();
 | 
			
		||||
 | 
			
		||||
    // Next available bindpoints to use when uploading the const buffers and textures to the GLSL
 | 
			
		||||
    // shaders. The constbuffer bindpoint starts after the shader stage configuration bind points.
 | 
			
		||||
@ -376,6 +376,8 @@ void RasterizerOpenGL::SetupShaders(GLenum primitive_mode) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    SyncClipEnabled(clip_distances);
 | 
			
		||||
 | 
			
		||||
    gpu.dirty_flags.shaders = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RasterizerOpenGL::SetupCachedFramebuffer(const FramebufferCacheKey& fbkey,
 | 
			
		||||
 | 
			
		||||
@ -188,6 +188,10 @@ void CachedShader::CalculateProperties() {
 | 
			
		||||
ShaderCacheOpenGL::ShaderCacheOpenGL(RasterizerOpenGL& rasterizer) : RasterizerCache{rasterizer} {}
 | 
			
		||||
 | 
			
		||||
Shader ShaderCacheOpenGL::GetStageProgram(Maxwell::ShaderProgram program) {
 | 
			
		||||
    if (!Core::System::GetInstance().GPU().Maxwell3D().dirty_flags.shaders) {
 | 
			
		||||
        return last_shaders[static_cast<u32>(program)];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const VAddr program_addr{GetShaderAddress(program)};
 | 
			
		||||
 | 
			
		||||
    // Look up shader in the cache based on address
 | 
			
		||||
@ -199,7 +203,7 @@ Shader ShaderCacheOpenGL::GetStageProgram(Maxwell::ShaderProgram program) {
 | 
			
		||||
        Register(shader);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return shader;
 | 
			
		||||
    return last_shaders[static_cast<u32>(program)] = shader;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace OpenGL
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <array>
 | 
			
		||||
#include <map>
 | 
			
		||||
#include <memory>
 | 
			
		||||
 | 
			
		||||
@ -115,6 +116,9 @@ public:
 | 
			
		||||
 | 
			
		||||
    /// Gets the current specified shader stage program
 | 
			
		||||
    Shader GetStageProgram(Maxwell::ShaderProgram program);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    std::array<Shader, Maxwell::MaxShaderProgram> last_shaders;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace OpenGL
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user