summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_opengl/gl_shader_disk_cache.h
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2019-01-14 03:29:24 +0100
committerReinUsesLisp <reinuseslisp@airmail.cc>2019-02-07 02:20:57 +0100
commitb1efceec898b66ed1e940d887d376c5139272764 (patch)
tree2a8a03f5b730f4b5dac61f33c806e2e1be66c6ce /src/video_core/renderer_opengl/gl_shader_disk_cache.h
parentgl_shader_disk_cache: Add ShaderDiskCacheOpenGL class and helpers (diff)
downloadyuzu-b1efceec898b66ed1e940d887d376c5139272764.tar
yuzu-b1efceec898b66ed1e940d887d376c5139272764.tar.gz
yuzu-b1efceec898b66ed1e940d887d376c5139272764.tar.bz2
yuzu-b1efceec898b66ed1e940d887d376c5139272764.tar.lz
yuzu-b1efceec898b66ed1e940d887d376c5139272764.tar.xz
yuzu-b1efceec898b66ed1e940d887d376c5139272764.tar.zst
yuzu-b1efceec898b66ed1e940d887d376c5139272764.zip
Diffstat (limited to '')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_disk_cache.h102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_disk_cache.h b/src/video_core/renderer_opengl/gl_shader_disk_cache.h
index 690c92cae..d4449c132 100644
--- a/src/video_core/renderer_opengl/gl_shader_disk_cache.h
+++ b/src/video_core/renderer_opengl/gl_shader_disk_cache.h
@@ -4,12 +4,18 @@
#pragma once
+#include <set>
#include <string>
#include <tuple>
+#include <vector>
+#include <glad/glad.h>
+
+#include "common/assert.h"
#include "common/common_types.h"
#include "common/file_util.h"
#include "video_core/engines/maxwell_3d.h"
+#include "video_core/renderer_opengl/gl_shader_gen.h"
namespace OpenGL {
@@ -40,9 +46,102 @@ public:
}
};
+class ShaderDiskCacheRaw {
+public:
+ explicit ShaderDiskCacheRaw(FileUtil::IOFile& file);
+
+ explicit ShaderDiskCacheRaw(u64 unique_identifier, Maxwell::ShaderProgram program_type,
+ u32 program_code_size, u32 program_code_size_b,
+ ProgramCode program_code, ProgramCode program_code_b)
+ : unique_identifier{unique_identifier}, program_type{program_type},
+ program_code_size{program_code_size}, program_code_size_b{program_code_size_b},
+ program_code{std::move(program_code)}, program_code_b{std::move(program_code_b)} {}
+
+ void Save(FileUtil::IOFile& file) const;
+
+ u64 GetUniqueIdentifier() const {
+ return unique_identifier;
+ }
+
+ bool HasProgramA() const {
+ return program_type == Maxwell::ShaderProgram::VertexA;
+ }
+
+ Maxwell::ShaderProgram GetProgramType() const {
+ return program_type;
+ }
+
+ Maxwell::ShaderStage GetProgramStage() const {
+ switch (program_type) {
+ case Maxwell::ShaderProgram::VertexA:
+ case Maxwell::ShaderProgram::VertexB:
+ return Maxwell::ShaderStage::Vertex;
+ case Maxwell::ShaderProgram::TesselationControl:
+ return Maxwell::ShaderStage::TesselationControl;
+ case Maxwell::ShaderProgram::TesselationEval:
+ return Maxwell::ShaderStage::TesselationEval;
+ case Maxwell::ShaderProgram::Geometry:
+ return Maxwell::ShaderStage::Geometry;
+ case Maxwell::ShaderProgram::Fragment:
+ return Maxwell::ShaderStage::Fragment;
+ }
+ UNREACHABLE();
+ }
+
+ const ProgramCode& GetProgramCode() const {
+ return program_code;
+ }
+
+ const ProgramCode& GetProgramCodeB() const {
+ return program_code_b;
+ }
+
+private:
+ u64 unique_identifier{};
+ Maxwell::ShaderProgram program_type{};
+ u32 program_code_size{};
+ u32 program_code_size_b{};
+
+ ProgramCode program_code;
+ ProgramCode program_code_b;
+};
+
+struct ShaderDiskCacheUsage {
+private:
+ auto Tie() const {
+ return std::tie(unique_identifier, bindings, primitive);
+ }
+
+public:
+ u64 unique_identifier{};
+ BaseBindings bindings;
+ GLenum primitive{};
+
+ bool operator<(const ShaderDiskCacheUsage& rhs) const {
+ return Tie() < rhs.Tie();
+ }
+
+ bool operator==(const ShaderDiskCacheUsage& rhs) const {
+ return Tie() == rhs.Tie();
+ }
+
+ bool operator!=(const ShaderDiskCacheUsage& rhs) const {
+ return !this->operator==(rhs);
+ }
+};
+
class ShaderDiskCacheOpenGL {
public:
+ /// Saves a raw dump to the transferable file. Checks for collisions.
+ void SaveRaw(const ShaderDiskCacheRaw& entry);
+
+ /// Saves shader usage to the transferable file. Does not check for collisions.
+ void SaveUsage(const ShaderDiskCacheUsage& usage);
+
private:
+ /// Opens current game's transferable file and write it's header if it doesn't exist
+ FileUtil::IOFile AppendTransferableFile() const;
+
/// Create shader disk cache directories. Returns true on success.
bool EnsureDirectories() const;
@@ -60,6 +159,9 @@ private:
/// Get user's shader directory path
std::string GetBaseDir() const;
+
+ // Stored transferable shaders
+ std::map<u64, std::set<ShaderDiskCacheUsage>> transferable;
};
} // namespace OpenGL \ No newline at end of file