mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	Merge pull request #1240 from degasus/optimizations
gl_shader_cache: Use an u32 for the binding point cache.
This commit is contained in:
		
						commit
						a1ef02c3e6
					
				@ -709,7 +709,7 @@ std::tuple<u8*, GLintptr, u32> RasterizerOpenGL::SetupConstBuffers(u8* buffer_pt
 | 
			
		||||
 | 
			
		||||
        // Now configure the bindpoint of the buffer inside the shader
 | 
			
		||||
        glUniformBlockBinding(shader->GetProgramHandle(),
 | 
			
		||||
                              shader->GetProgramResourceIndex(used_buffer.GetName()),
 | 
			
		||||
                              shader->GetProgramResourceIndex(used_buffer),
 | 
			
		||||
                              current_bindpoint + bindpoint);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -733,7 +733,7 @@ u32 RasterizerOpenGL::SetupTextures(Maxwell::ShaderStage stage, Shader& shader,
 | 
			
		||||
 | 
			
		||||
        // Bind the uniform to the sampler.
 | 
			
		||||
 | 
			
		||||
        glProgramUniform1i(shader->GetProgramHandle(), shader->GetUniformLocation(entry.GetName()),
 | 
			
		||||
        glProgramUniform1i(shader->GetProgramHandle(), shader->GetUniformLocation(entry),
 | 
			
		||||
                           current_bindpoint);
 | 
			
		||||
 | 
			
		||||
        const auto texture = maxwell3d.GetStageTexture(entry.GetStage(), entry.GetOffset());
 | 
			
		||||
 | 
			
		||||
@ -85,23 +85,23 @@ CachedShader::CachedShader(VAddr addr, Maxwell::ShaderProgram program_type)
 | 
			
		||||
    SetShaderUniformBlockBindings(program.handle);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GLuint CachedShader::GetProgramResourceIndex(const std::string& name) {
 | 
			
		||||
    auto search{resource_cache.find(name)};
 | 
			
		||||
GLuint CachedShader::GetProgramResourceIndex(const GLShader::ConstBufferEntry& buffer) {
 | 
			
		||||
    auto search{resource_cache.find(buffer.GetHash())};
 | 
			
		||||
    if (search == resource_cache.end()) {
 | 
			
		||||
        const GLuint index{
 | 
			
		||||
            glGetProgramResourceIndex(program.handle, GL_UNIFORM_BLOCK, name.c_str())};
 | 
			
		||||
        resource_cache[name] = index;
 | 
			
		||||
            glGetProgramResourceIndex(program.handle, GL_UNIFORM_BLOCK, buffer.GetName().c_str())};
 | 
			
		||||
        resource_cache[buffer.GetHash()] = index;
 | 
			
		||||
        return index;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return search->second;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GLint CachedShader::GetUniformLocation(const std::string& name) {
 | 
			
		||||
    auto search{uniform_cache.find(name)};
 | 
			
		||||
GLint CachedShader::GetUniformLocation(const GLShader::SamplerEntry& sampler) {
 | 
			
		||||
    auto search{uniform_cache.find(sampler.GetHash())};
 | 
			
		||||
    if (search == uniform_cache.end()) {
 | 
			
		||||
        const GLint index{glGetUniformLocation(program.handle, name.c_str())};
 | 
			
		||||
        uniform_cache[name] = index;
 | 
			
		||||
        const GLint index{glGetUniformLocation(program.handle, sampler.GetName().c_str())};
 | 
			
		||||
        uniform_cache[sampler.GetHash()] = index;
 | 
			
		||||
        return index;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,8 @@
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <map>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <unordered_map>
 | 
			
		||||
 | 
			
		||||
#include "common/common_types.h"
 | 
			
		||||
#include "video_core/rasterizer_cache.h"
 | 
			
		||||
@ -43,10 +43,10 @@ public:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Gets the GL program resource location for the specified resource, caching as needed
 | 
			
		||||
    GLuint GetProgramResourceIndex(const std::string& name);
 | 
			
		||||
    GLuint GetProgramResourceIndex(const GLShader::ConstBufferEntry& buffer);
 | 
			
		||||
 | 
			
		||||
    /// Gets the GL uniform location for the specified resource, caching as needed
 | 
			
		||||
    GLint GetUniformLocation(const std::string& name);
 | 
			
		||||
    GLint GetUniformLocation(const GLShader::SamplerEntry& sampler);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    VAddr addr;
 | 
			
		||||
@ -55,8 +55,8 @@ private:
 | 
			
		||||
    GLShader::ShaderEntries entries;
 | 
			
		||||
    OGLProgram program;
 | 
			
		||||
 | 
			
		||||
    std::unordered_map<std::string, GLuint> resource_cache;
 | 
			
		||||
    std::unordered_map<std::string, GLint> uniform_cache;
 | 
			
		||||
    std::map<u32, GLuint> resource_cache;
 | 
			
		||||
    std::map<u32, GLint> uniform_cache;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class ShaderCacheOpenGL final : public RasterizerCache<Shader> {
 | 
			
		||||
 | 
			
		||||
@ -53,6 +53,10 @@ public:
 | 
			
		||||
        return BufferBaseNames[static_cast<size_t>(stage)] + std::to_string(index);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    u32 GetHash() const {
 | 
			
		||||
        return (static_cast<u32>(stage) << 16) | index;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    static constexpr std::array<const char*, Maxwell::MaxShaderStage> BufferBaseNames = {
 | 
			
		||||
        "buffer_vs_c", "buffer_tessc_c", "buffer_tesse_c", "buffer_gs_c", "buffer_fs_c",
 | 
			
		||||
@ -89,6 +93,10 @@ public:
 | 
			
		||||
               std::to_string(sampler_index) + ']';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    u32 GetHash() const {
 | 
			
		||||
        return (static_cast<u32>(stage) << 16) | static_cast<u32>(sampler_index);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static std::string GetArrayName(Maxwell::ShaderStage stage) {
 | 
			
		||||
        return TextureSamplerNames[static_cast<size_t>(stage)];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user