diff options
| author | 2019-01-15 16:28:42 -0300 | |
|---|---|---|
| committer | 2019-02-06 22:23:40 -0300 | |
| commit | 7fefec585c805fa09951da11890bb90afb8a42a9 (patch) | |
| tree | 739d06767d869ff1f0678aa20cb076a465521744 /src | |
| parent | gl_shader_disk_cache: Guard reads and writes against failure (diff) | |
| download | yuzu-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.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 5 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 7 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_cache.cpp | 3 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_cache.h | 6 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_disk_cache.cpp | 14 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_disk_cache.h | 13 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 6 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.h | 8 | ||||
| -rw-r--r-- | src/video_core/video_core.cpp | 5 | ||||
| -rw-r--r-- | src/video_core/video_core.h | 7 |
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 | ||
| 103 | RasterizerOpenGL::RasterizerOpenGL(Core::Frontend::EmuWindow& window, ScreenInfo& info) | 103 | RasterizerOpenGL::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 | ||
| 36 | namespace Core { | ||
| 37 | class System; | ||
| 38 | } | ||
| 39 | |||
| 36 | namespace Core::Frontend { | 40 | namespace Core::Frontend { |
| 37 | class EmuWindow; | 41 | class EmuWindow; |
| 38 | } | 42 | } |
| @@ -45,7 +49,8 @@ struct FramebufferCacheKey; | |||
| 45 | 49 | ||
| 46 | class RasterizerOpenGL : public VideoCore::RasterizerInterface { | 50 | class RasterizerOpenGL : public VideoCore::RasterizerInterface { |
| 47 | public: | 51 | public: |
| 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 | ||
| 345 | ShaderCacheOpenGL::ShaderCacheOpenGL(RasterizerOpenGL& rasterizer) : RasterizerCache{rasterizer} {} | 345 | ShaderCacheOpenGL::ShaderCacheOpenGL(RasterizerOpenGL& rasterizer, Core::System& system) |
| 346 | : RasterizerCache{rasterizer}, disk_cache{system} {} | ||
| 346 | 347 | ||
| 347 | void ShaderCacheOpenGL::LoadDiskCache() { | 348 | void 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 | ||
| 23 | namespace Core { | ||
| 24 | class System; | ||
| 25 | } // namespace Core | ||
| 26 | |||
| 23 | namespace OpenGL { | 27 | namespace OpenGL { |
| 24 | 28 | ||
| 25 | class CachedShader; | 29 | class CachedShader; |
| @@ -107,7 +111,7 @@ private: | |||
| 107 | 111 | ||
| 108 | class ShaderCacheOpenGL final : public RasterizerCache<Shader> { | 112 | class ShaderCacheOpenGL final : public RasterizerCache<Shader> { |
| 109 | public: | 113 | public: |
| 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); | |||
| 43 | static_assert(sizeof(ShaderDiskCacheUsage) == 24); | 43 | static_assert(sizeof(ShaderDiskCacheUsage) == 24); |
| 44 | 44 | ||
| 45 | namespace { | 45 | namespace { |
| 46 | std::string GetTitleID() { | ||
| 47 | return fmt::format("{:016X}", Core::CurrentProcess()->GetTitleID()); | ||
| 48 | } | ||
| 49 | 46 | ||
| 50 | ShaderCacheVersionHash GetShaderCacheVersionHash() { | 47 | ShaderCacheVersionHash 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 | ||
| 87 | ShaderDiskCacheRaw::ShaderDiskCacheRaw(u64 unique_identifier, Maxwell::ShaderProgram program_type, | 85 | ShaderDiskCacheRaw::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 | ||
| 138 | ShaderDiskCacheOpenGL::ShaderDiskCacheOpenGL(Core::System& system) : system{system} {} | ||
| 139 | |||
| 140 | std::optional<std::pair<std::vector<ShaderDiskCacheRaw>, std::vector<ShaderDiskCacheUsage>>> | 140 | std::optional<std::pair<std::vector<ShaderDiskCacheRaw>, std::vector<ShaderDiskCacheUsage>>> |
| 141 | ShaderDiskCacheOpenGL::LoadTransferable() { | 141 | ShaderDiskCacheOpenGL::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 | ||
| 648 | std::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 | ||
| 21 | namespace Core { | ||
| 22 | class System; | ||
| 23 | } | ||
| 24 | |||
| 21 | namespace FileUtil { | 25 | namespace FileUtil { |
| 22 | class IOFile; | 26 | class IOFile; |
| 23 | } // namespace FileUtil | 27 | } |
| 24 | 28 | ||
| 25 | namespace OpenGL { | 29 | namespace OpenGL { |
| 26 | 30 | ||
| @@ -148,6 +152,8 @@ struct ShaderDiskCacheDump { | |||
| 148 | 152 | ||
| 149 | class ShaderDiskCacheOpenGL { | 153 | class ShaderDiskCacheOpenGL { |
| 150 | public: | 154 | public: |
| 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 | ||
| 101 | RendererOpenGL::RendererOpenGL(Core::Frontend::EmuWindow& window) | 101 | RendererOpenGL::RendererOpenGL(Core::Frontend::EmuWindow& window, Core::System& system) |
| 102 | : VideoCore::RendererBase{window} {} | 102 | : VideoCore::RendererBase{window}, system{system} {} |
| 103 | 103 | ||
| 104 | RendererOpenGL::~RendererOpenGL() = default; | 104 | RendererOpenGL::~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 | ||
| 256 | void RendererOpenGL::ConfigureFramebufferTexture(TextureInfo& texture, | 256 | void 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 | ||
| 15 | namespace Core { | ||
| 16 | class System; | ||
| 17 | } | ||
| 18 | |||
| 15 | namespace Core::Frontend { | 19 | namespace Core::Frontend { |
| 16 | class EmuWindow; | 20 | class EmuWindow; |
| 17 | } | 21 | } |
| @@ -41,7 +45,7 @@ struct ScreenInfo { | |||
| 41 | 45 | ||
| 42 | class RendererOpenGL : public VideoCore::RendererBase { | 46 | class RendererOpenGL : public VideoCore::RendererBase { |
| 43 | public: | 47 | public: |
| 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 | ||
| 12 | namespace VideoCore { | 12 | namespace VideoCore { |
| 13 | 13 | ||
| 14 | std::unique_ptr<RendererBase> CreateRenderer(Core::Frontend::EmuWindow& emu_window) { | 14 | std::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 | ||
| 18 | u16 GetResolutionScaleFactor(const RendererBase& renderer) { | 19 | u16 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 | ||
| 9 | namespace Core { | ||
| 10 | class System; | ||
| 11 | } | ||
| 12 | |||
| 9 | namespace Core::Frontend { | 13 | namespace Core::Frontend { |
| 10 | class EmuWindow; | 14 | class 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 | */ |
| 23 | std::unique_ptr<RendererBase> CreateRenderer(Core::Frontend::EmuWindow& emu_window); | 27 | std::unique_ptr<RendererBase> CreateRenderer(Core::Frontend::EmuWindow& emu_window, |
| 28 | Core::System& system); | ||
| 24 | 29 | ||
| 25 | u16 GetResolutionScaleFactor(const RendererBase& renderer); | 30 | u16 GetResolutionScaleFactor(const RendererBase& renderer); |
| 26 | 31 | ||