summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_opengl/gl_shader_cache.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/renderer_opengl/gl_shader_cache.h')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.h77
1 files changed, 50 insertions, 27 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.h b/src/video_core/renderer_opengl/gl_shader_cache.h
index de195cc5d..6bd7c9cf1 100644
--- a/src/video_core/renderer_opengl/gl_shader_cache.h
+++ b/src/video_core/renderer_opengl/gl_shader_cache.h
@@ -8,9 +8,10 @@
#include <atomic>
#include <bitset>
#include <memory>
-#include <set>
+#include <string>
#include <tuple>
#include <unordered_map>
+#include <unordered_set>
#include <vector>
#include <glad/glad.h>
@@ -20,6 +21,8 @@
#include "video_core/renderer_opengl/gl_resource_manager.h"
#include "video_core/renderer_opengl/gl_shader_decompiler.h"
#include "video_core/renderer_opengl/gl_shader_disk_cache.h"
+#include "video_core/shader/const_buffer_locker.h"
+#include "video_core/shader/shader_ir.h"
namespace Core {
class System;
@@ -40,11 +43,19 @@ using Shader = std::shared_ptr<CachedShader>;
using CachedProgram = std::shared_ptr<OGLProgram>;
using Maxwell = Tegra::Engines::Maxwell3D::Regs;
using PrecompiledPrograms = std::unordered_map<ShaderDiskCacheUsage, CachedProgram>;
-using PrecompiledShaders = std::unordered_map<u64, GLShader::ProgramResult>;
+using PrecompiledVariants = std::vector<PrecompiledPrograms::iterator>;
+
+struct UnspecializedShader {
+ GLShader::ShaderEntries entries;
+ ProgramType program_type;
+ ProgramCode code;
+ ProgramCode code_b;
+};
struct ShaderParameters {
+ Core::System& system;
ShaderDiskCacheOpenGL& disk_cache;
- const PrecompiledPrograms& precompiled_programs;
+ const PrecompiledVariants* precompiled_variants;
const Device& device;
VAddr cpu_addr;
u8* host_ptr;
@@ -55,23 +66,18 @@ class CachedShader final : public RasterizerCacheObject {
public:
static Shader CreateStageFromMemory(const ShaderParameters& params,
Maxwell::ShaderProgram program_type,
- ProgramCode&& program_code, ProgramCode&& program_code_b);
-
- static Shader CreateStageFromCache(const ShaderParameters& params,
- Maxwell::ShaderProgram program_type,
- GLShader::ProgramResult result);
+ ProgramCode program_code, ProgramCode program_code_b);
+ static Shader CreateKernelFromMemory(const ShaderParameters& params, ProgramCode code);
- static Shader CreateKernelFromMemory(const ShaderParameters& params, ProgramCode&& code);
-
- static Shader CreateKernelFromCache(const ShaderParameters& params,
- GLShader::ProgramResult result);
+ static Shader CreateFromCache(const ShaderParameters& params,
+ const UnspecializedShader& unspecialized);
VAddr GetCpuAddr() const override {
return cpu_addr;
}
std::size_t GetSizeInBytes() const override {
- return shader_length;
+ return program_code.size() * sizeof(u64);
}
/// Gets the shader entries for the shader
@@ -83,24 +89,36 @@ public:
std::tuple<GLuint, BaseBindings> GetProgramHandle(const ProgramVariant& variant);
private:
+ struct LockerVariant {
+ std::unique_ptr<VideoCommon::Shader::ConstBufferLocker> locker;
+ std::unordered_map<ProgramVariant, CachedProgram> programs;
+ };
+
explicit CachedShader(const ShaderParameters& params, ProgramType program_type,
- GLShader::ProgramResult result);
+ GLShader::ShaderEntries entries, ProgramCode program_code,
+ ProgramCode program_code_b);
- CachedProgram TryLoadProgram(const ProgramVariant& variant) const;
+ void UpdateVariant();
- ShaderDiskCacheUsage GetUsage(const ProgramVariant& variant) const;
+ ShaderDiskCacheUsage GetUsage(const ProgramVariant& variant,
+ const VideoCommon::Shader::ConstBufferLocker& locker) const;
+
+ Core::System& system;
+ ShaderDiskCacheOpenGL& disk_cache;
+ const Device& device;
VAddr cpu_addr{};
+
u64 unique_identifier{};
ProgramType program_type{};
- ShaderDiskCacheOpenGL& disk_cache;
- const PrecompiledPrograms& precompiled_programs;
GLShader::ShaderEntries entries;
- std::string code;
- std::size_t shader_length{};
- std::unordered_map<ProgramVariant, CachedProgram> programs;
+ ProgramCode program_code;
+ ProgramCode program_code_b;
+
+ LockerVariant* curr_variant = nullptr;
+ std::vector<std::unique_ptr<LockerVariant>> locker_variants;
};
class ShaderCacheOpenGL final : public RasterizerCache<Shader> {
@@ -123,21 +141,26 @@ protected:
void FlushObjectInner(const Shader& object) override {}
private:
- std::unordered_map<u64, UnspecializedShader> GenerateUnspecializedShaders(
- const std::atomic_bool& stop_loading, const VideoCore::DiskResourceLoadCallback& callback,
- const std::vector<ShaderDiskCacheRaw>& raws,
- const std::unordered_map<u64, ShaderDiskCacheDecompiled>& decompiled);
+ bool GenerateUnspecializedShaders(const std::atomic_bool& stop_loading,
+ const VideoCore::DiskResourceLoadCallback& callback,
+ const std::vector<ShaderDiskCacheRaw>& raws);
CachedProgram GeneratePrecompiledProgram(const ShaderDiskCacheDump& dump,
- const std::set<GLenum>& supported_formats);
+ const std::unordered_set<GLenum>& supported_formats);
+
+ const PrecompiledVariants* GetPrecompiledVariants(u64 unique_identifier) const;
Core::System& system;
Core::Frontend::EmuWindow& emu_window;
const Device& device;
+
ShaderDiskCacheOpenGL disk_cache;
- PrecompiledShaders precompiled_shaders;
PrecompiledPrograms precompiled_programs;
+ std::unordered_map<u64, PrecompiledVariants> precompiled_variants;
+
+ std::unordered_map<u64, UnspecializedShader> unspecialized_shaders;
+
std::array<Shader, Maxwell::MaxShaderProgram> last_shaders;
};