summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-01-15 16:28:42 -0300
committerGravatar ReinUsesLisp2019-02-06 22:23:40 -0300
commit7fefec585c805fa09951da11890bb90afb8a42a9 (patch)
tree739d06767d869ff1f0678aa20cb076a465521744 /src
parentgl_shader_disk_cache: Guard reads and writes against failure (diff)
downloadyuzu-7fefec585c805fa09951da11890bb90afb8a42a9.tar.gz
yuzu-7fefec585c805fa09951da11890bb90afb8a42a9.tar.xz
yuzu-7fefec585c805fa09951da11890bb90afb8a42a9.zip
gl_shader_disk_cache: Pass core system as argument and guard against games without title ids
Diffstat (limited to 'src')
-rw-r--r--src/core/core.cpp2
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp5
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h7
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.cpp3
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.h6
-rw-r--r--src/video_core/renderer_opengl/gl_shader_disk_cache.cpp14
-rw-r--r--src/video_core/renderer_opengl/gl_shader_disk_cache.h13
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp6
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.h8
-rw-r--r--src/video_core/video_core.cpp5
-rw-r--r--src/video_core/video_core.h7
11 files changed, 58 insertions, 18 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp
index c8d7c442a..1d71312aa 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -123,7 +123,7 @@ struct System::Impl {
123 Service::Init(service_manager, *virtual_filesystem); 123 Service::Init(service_manager, *virtual_filesystem);
124 GDBStub::Init(); 124 GDBStub::Init();
125 125
126 renderer = VideoCore::CreateRenderer(emu_window); 126 renderer = VideoCore::CreateRenderer(emu_window, system);
127 if (!renderer->Init()) { 127 if (!renderer->Init()) {
128 return ResultStatus::ErrorVideoCore; 128 return ResultStatus::ErrorVideoCore;
129 } 129 }
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 48e003fa1..94a5058de 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -100,8 +100,9 @@ struct FramebufferCacheKey {
100 } 100 }
101}; 101};
102 102
103RasterizerOpenGL::RasterizerOpenGL(Core::Frontend::EmuWindow& window, ScreenInfo& info) 103RasterizerOpenGL::RasterizerOpenGL(Core::Frontend::EmuWindow& window, Core::System& system,
104 : res_cache{*this}, shader_cache{*this}, emu_window{window}, screen_info{info}, 104 ScreenInfo& info)
105 : res_cache{*this}, shader_cache{*this, system}, emu_window{window}, screen_info{info},
105 buffer_cache(*this, STREAM_BUFFER_SIZE), global_cache{*this} { 106 buffer_cache(*this, STREAM_BUFFER_SIZE), global_cache{*this} {
106 // Create sampler objects 107 // Create sampler objects
107 for (std::size_t i = 0; i < texture_samplers.size(); ++i) { 108 for (std::size_t i = 0; i < texture_samplers.size(); ++i) {
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index ed7091f18..ebabf80d1 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -33,6 +33,10 @@
33#include "video_core/renderer_opengl/gl_state.h" 33#include "video_core/renderer_opengl/gl_state.h"
34#include "video_core/renderer_opengl/gl_stream_buffer.h" 34#include "video_core/renderer_opengl/gl_stream_buffer.h"
35 35
36namespace Core {
37class System;
38}
39
36namespace Core::Frontend { 40namespace Core::Frontend {
37class EmuWindow; 41class EmuWindow;
38} 42}
@@ -45,7 +49,8 @@ struct FramebufferCacheKey;
45 49
46class RasterizerOpenGL : public VideoCore::RasterizerInterface { 50class RasterizerOpenGL : public VideoCore::RasterizerInterface {
47public: 51public:
48 explicit RasterizerOpenGL(Core::Frontend::EmuWindow& renderer, ScreenInfo& info); 52 explicit RasterizerOpenGL(Core::Frontend::EmuWindow& window, Core::System& system,
53 ScreenInfo& info);
49 ~RasterizerOpenGL() override; 54 ~RasterizerOpenGL() override;
50 55
51 void DrawArrays() override; 56 void DrawArrays() override;
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp
index 6acfd1649..b2b5c2aa5 100644
--- a/src/video_core/renderer_opengl/gl_shader_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp
@@ -342,7 +342,8 @@ ShaderDiskCacheUsage CachedShader::GetUsage(GLenum primitive_mode,
342 return {unique_identifier, base_bindings, primitive_mode}; 342 return {unique_identifier, base_bindings, primitive_mode};
343} 343}
344 344
345ShaderCacheOpenGL::ShaderCacheOpenGL(RasterizerOpenGL& rasterizer) : RasterizerCache{rasterizer} {} 345ShaderCacheOpenGL::ShaderCacheOpenGL(RasterizerOpenGL& rasterizer, Core::System& system)
346 : RasterizerCache{rasterizer}, disk_cache{system} {}
346 347
347void ShaderCacheOpenGL::LoadDiskCache() { 348void ShaderCacheOpenGL::LoadDiskCache() {
348 const auto transferable = disk_cache.LoadTransferable(); 349 const auto transferable = disk_cache.LoadTransferable();
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.h b/src/video_core/renderer_opengl/gl_shader_cache.h
index c6a621ae3..6914127c3 100644
--- a/src/video_core/renderer_opengl/gl_shader_cache.h
+++ b/src/video_core/renderer_opengl/gl_shader_cache.h
@@ -20,6 +20,10 @@
20#include "video_core/renderer_opengl/gl_shader_disk_cache.h" 20#include "video_core/renderer_opengl/gl_shader_disk_cache.h"
21#include "video_core/renderer_opengl/gl_shader_gen.h" 21#include "video_core/renderer_opengl/gl_shader_gen.h"
22 22
23namespace Core {
24class System;
25} // namespace Core
26
23namespace OpenGL { 27namespace OpenGL {
24 28
25class CachedShader; 29class CachedShader;
@@ -107,7 +111,7 @@ private:
107 111
108class ShaderCacheOpenGL final : public RasterizerCache<Shader> { 112class ShaderCacheOpenGL final : public RasterizerCache<Shader> {
109public: 113public:
110 explicit ShaderCacheOpenGL(RasterizerOpenGL& rasterizer); 114 explicit ShaderCacheOpenGL(RasterizerOpenGL& rasterizer, Core::System& system);
111 115
112 /// Loads disk cache for the current game 116 /// Loads disk cache for the current game
113 void LoadDiskCache(); 117 void LoadDiskCache();
diff --git a/src/video_core/renderer_opengl/gl_shader_disk_cache.cpp b/src/video_core/renderer_opengl/gl_shader_disk_cache.cpp
index f8bdb7779..d88fff388 100644
--- a/src/video_core/renderer_opengl/gl_shader_disk_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_disk_cache.cpp
@@ -43,9 +43,6 @@ static_assert(sizeof(BaseBindings) == 12);
43static_assert(sizeof(ShaderDiskCacheUsage) == 24); 43static_assert(sizeof(ShaderDiskCacheUsage) == 24);
44 44
45namespace { 45namespace {
46std::string GetTitleID() {
47 return fmt::format("{:016X}", Core::CurrentProcess()->GetTitleID());
48}
49 46
50ShaderCacheVersionHash GetShaderCacheVersionHash() { 47ShaderCacheVersionHash GetShaderCacheVersionHash() {
51 ShaderCacheVersionHash hash{}; 48 ShaderCacheVersionHash hash{};
@@ -82,6 +79,7 @@ std::vector<u8> DecompressData(const std::vector<u8>& compressed, std::size_t un
82 } 79 }
83 return uncompressed; 80 return uncompressed;
84} 81}
82
85} // namespace 83} // namespace
86 84
87ShaderDiskCacheRaw::ShaderDiskCacheRaw(u64 unique_identifier, Maxwell::ShaderProgram program_type, 85ShaderDiskCacheRaw::ShaderDiskCacheRaw(u64 unique_identifier, Maxwell::ShaderProgram program_type,
@@ -137,9 +135,13 @@ bool ShaderDiskCacheRaw::Save(FileUtil::IOFile& file) const {
137 return true; 135 return true;
138} 136}
139 137
138ShaderDiskCacheOpenGL::ShaderDiskCacheOpenGL(Core::System& system) : system{system} {}
139
140std::optional<std::pair<std::vector<ShaderDiskCacheRaw>, std::vector<ShaderDiskCacheUsage>>> 140std::optional<std::pair<std::vector<ShaderDiskCacheRaw>, std::vector<ShaderDiskCacheUsage>>>
141ShaderDiskCacheOpenGL::LoadTransferable() { 141ShaderDiskCacheOpenGL::LoadTransferable() {
142 if (!Settings::values.use_disk_shader_cache) 142 // Skip games without title id
143 const bool has_title_id = system.CurrentProcess()->GetTitleID() != 0;
144 if (!Settings::values.use_disk_shader_cache || !has_title_id)
143 return {}; 145 return {};
144 tried_to_load = true; 146 tried_to_load = true;
145 147
@@ -643,4 +645,8 @@ std::string ShaderDiskCacheOpenGL::GetBaseDir() const {
643 return FileUtil::GetUserPath(FileUtil::UserPath::ShaderDir) + DIR_SEP "opengl"; 645 return FileUtil::GetUserPath(FileUtil::UserPath::ShaderDir) + DIR_SEP "opengl";
644} 646}
645 647
648std::string ShaderDiskCacheOpenGL::GetTitleID() const {
649 return fmt::format("{:016X}", system.CurrentProcess()->GetTitleID());
650}
651
646} // namespace OpenGL \ No newline at end of file 652} // namespace OpenGL \ No newline at end of file
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 ddcd4cf51..061c4f204 100644
--- a/src/video_core/renderer_opengl/gl_shader_disk_cache.h
+++ b/src/video_core/renderer_opengl/gl_shader_disk_cache.h
@@ -18,9 +18,13 @@
18#include "video_core/engines/maxwell_3d.h" 18#include "video_core/engines/maxwell_3d.h"
19#include "video_core/renderer_opengl/gl_shader_gen.h" 19#include "video_core/renderer_opengl/gl_shader_gen.h"
20 20
21namespace Core {
22class System;
23}
24
21namespace FileUtil { 25namespace FileUtil {
22class IOFile; 26class IOFile;
23} // namespace FileUtil 27}
24 28
25namespace OpenGL { 29namespace OpenGL {
26 30
@@ -148,6 +152,8 @@ struct ShaderDiskCacheDump {
148 152
149class ShaderDiskCacheOpenGL { 153class ShaderDiskCacheOpenGL {
150public: 154public:
155 explicit ShaderDiskCacheOpenGL(Core::System& system);
156
151 /// Loads transferable cache. If file has a old version or on failure, it deletes the file. 157 /// Loads transferable cache. If file has a old version or on failure, it deletes the file.
152 std::optional<std::pair<std::vector<ShaderDiskCacheRaw>, std::vector<ShaderDiskCacheUsage>>> 158 std::optional<std::pair<std::vector<ShaderDiskCacheRaw>, std::vector<ShaderDiskCacheUsage>>>
153 LoadTransferable(); 159 LoadTransferable();
@@ -217,6 +223,11 @@ private:
217 /// Get user's shader directory path 223 /// Get user's shader directory path
218 std::string GetBaseDir() const; 224 std::string GetBaseDir() const;
219 225
226 /// Get current game's title id
227 std::string GetTitleID() const;
228
229 // Copre system
230 Core::System& system;
220 // Stored transferable shaders 231 // Stored transferable shaders
221 std::map<u64, std::set<ShaderDiskCacheUsage>> transferable; 232 std::map<u64, std::set<ShaderDiskCacheUsage>> transferable;
222 // The cache has been loaded at boot 233 // The cache has been loaded at boot
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp
index 5b09c38ea..6476a9e1a 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.cpp
+++ b/src/video_core/renderer_opengl/renderer_opengl.cpp
@@ -98,8 +98,8 @@ static std::array<GLfloat, 3 * 2> MakeOrthographicMatrix(const float width, cons
98 return matrix; 98 return matrix;
99} 99}
100 100
101RendererOpenGL::RendererOpenGL(Core::Frontend::EmuWindow& window) 101RendererOpenGL::RendererOpenGL(Core::Frontend::EmuWindow& window, Core::System& system)
102 : VideoCore::RendererBase{window} {} 102 : VideoCore::RendererBase{window}, system{system} {}
103 103
104RendererOpenGL::~RendererOpenGL() = default; 104RendererOpenGL::~RendererOpenGL() = default;
105 105
@@ -250,7 +250,7 @@ void RendererOpenGL::CreateRasterizer() {
250 } 250 }
251 // Initialize sRGB Usage 251 // Initialize sRGB Usage
252 OpenGLState::ClearsRGBUsed(); 252 OpenGLState::ClearsRGBUsed();
253 rasterizer = std::make_unique<RasterizerOpenGL>(render_window, screen_info); 253 rasterizer = std::make_unique<RasterizerOpenGL>(render_window, system, screen_info);
254} 254}
255 255
256void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture, 256void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture,
diff --git a/src/video_core/renderer_opengl/renderer_opengl.h b/src/video_core/renderer_opengl/renderer_opengl.h
index 1665018db..7e13e566b 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.h
+++ b/src/video_core/renderer_opengl/renderer_opengl.h
@@ -12,6 +12,10 @@
12#include "video_core/renderer_opengl/gl_resource_manager.h" 12#include "video_core/renderer_opengl/gl_resource_manager.h"
13#include "video_core/renderer_opengl/gl_state.h" 13#include "video_core/renderer_opengl/gl_state.h"
14 14
15namespace Core {
16class System;
17}
18
15namespace Core::Frontend { 19namespace Core::Frontend {
16class EmuWindow; 20class EmuWindow;
17} 21}
@@ -41,7 +45,7 @@ struct ScreenInfo {
41 45
42class RendererOpenGL : public VideoCore::RendererBase { 46class RendererOpenGL : public VideoCore::RendererBase {
43public: 47public:
44 explicit RendererOpenGL(Core::Frontend::EmuWindow& window); 48 explicit RendererOpenGL(Core::Frontend::EmuWindow& window, Core::System& system);
45 ~RendererOpenGL() override; 49 ~RendererOpenGL() override;
46 50
47 /// Swap buffers (render frame) 51 /// Swap buffers (render frame)
@@ -72,6 +76,8 @@ private:
72 void LoadColorToActiveGLTexture(u8 color_r, u8 color_g, u8 color_b, u8 color_a, 76 void LoadColorToActiveGLTexture(u8 color_r, u8 color_g, u8 color_b, u8 color_a,
73 const TextureInfo& texture); 77 const TextureInfo& texture);
74 78
79 Core::System& system;
80
75 OpenGLState state; 81 OpenGLState state;
76 82
77 // OpenGL object IDs 83 // OpenGL object IDs
diff --git a/src/video_core/video_core.cpp b/src/video_core/video_core.cpp
index 0b8ccdd44..cb82ecf3f 100644
--- a/src/video_core/video_core.cpp
+++ b/src/video_core/video_core.cpp
@@ -11,8 +11,9 @@
11 11
12namespace VideoCore { 12namespace VideoCore {
13 13
14std::unique_ptr<RendererBase> CreateRenderer(Core::Frontend::EmuWindow& emu_window) { 14std::unique_ptr<RendererBase> CreateRenderer(Core::Frontend::EmuWindow& emu_window,
15 return std::make_unique<OpenGL::RendererOpenGL>(emu_window); 15 Core::System& system) {
16 return std::make_unique<OpenGL::RendererOpenGL>(emu_window, system);
16} 17}
17 18
18u16 GetResolutionScaleFactor(const RendererBase& renderer) { 19u16 GetResolutionScaleFactor(const RendererBase& renderer) {
diff --git a/src/video_core/video_core.h b/src/video_core/video_core.h
index 5b373bcb1..3c583f195 100644
--- a/src/video_core/video_core.h
+++ b/src/video_core/video_core.h
@@ -6,6 +6,10 @@
6 6
7#include <memory> 7#include <memory>
8 8
9namespace Core {
10class System;
11}
12
9namespace Core::Frontend { 13namespace Core::Frontend {
10class EmuWindow; 14class EmuWindow;
11} 15}
@@ -20,7 +24,8 @@ class RendererBase;
20 * @note The returned renderer instance is simply allocated. Its Init() 24 * @note The returned renderer instance is simply allocated. Its Init()
21 * function still needs to be called to fully complete its setup. 25 * function still needs to be called to fully complete its setup.
22 */ 26 */
23std::unique_ptr<RendererBase> CreateRenderer(Core::Frontend::EmuWindow& emu_window); 27std::unique_ptr<RendererBase> CreateRenderer(Core::Frontend::EmuWindow& emu_window,
28 Core::System& system);
24 29
25u16 GetResolutionScaleFactor(const RendererBase& renderer); 30u16 GetResolutionScaleFactor(const RendererBase& renderer);
26 31