diff options
| author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-01-15 16:28:42 -0300 | 
|---|---|---|
| committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-02-06 22:23:40 -0300 | 
| commit | 7fefec585c805fa09951da11890bb90afb8a42a9 (patch) | |
| tree | 739d06767d869ff1f0678aa20cb076a465521744 /src/video_core | |
| parent | 2bc6a699dc53baf55b0ccbb40750a40036ee184f (diff) | |
gl_shader_disk_cache: Pass core system as argument and guard against games without title ids
Diffstat (limited to 'src/video_core')
| -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 | 
10 files changed, 57 insertions, 17 deletions
| 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 {      }  }; -RasterizerOpenGL::RasterizerOpenGL(Core::Frontend::EmuWindow& window, ScreenInfo& info) -    : res_cache{*this}, shader_cache{*this}, emu_window{window}, screen_info{info}, +RasterizerOpenGL::RasterizerOpenGL(Core::Frontend::EmuWindow& window, Core::System& system, +                                   ScreenInfo& info) +    : res_cache{*this}, shader_cache{*this, system}, emu_window{window}, screen_info{info},        buffer_cache(*this, STREAM_BUFFER_SIZE), global_cache{*this} {      // Create sampler objects      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 @@  #include "video_core/renderer_opengl/gl_state.h"  #include "video_core/renderer_opengl/gl_stream_buffer.h" +namespace Core { +class System; +} +  namespace Core::Frontend {  class EmuWindow;  } @@ -45,7 +49,8 @@ struct FramebufferCacheKey;  class RasterizerOpenGL : public VideoCore::RasterizerInterface {  public: -    explicit RasterizerOpenGL(Core::Frontend::EmuWindow& renderer, ScreenInfo& info); +    explicit RasterizerOpenGL(Core::Frontend::EmuWindow& window, Core::System& system, +                              ScreenInfo& info);      ~RasterizerOpenGL() override;      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,      return {unique_identifier, base_bindings, primitive_mode};  } -ShaderCacheOpenGL::ShaderCacheOpenGL(RasterizerOpenGL& rasterizer) : RasterizerCache{rasterizer} {} +ShaderCacheOpenGL::ShaderCacheOpenGL(RasterizerOpenGL& rasterizer, Core::System& system) +    : RasterizerCache{rasterizer}, disk_cache{system} {}  void ShaderCacheOpenGL::LoadDiskCache() {      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 @@  #include "video_core/renderer_opengl/gl_shader_disk_cache.h"  #include "video_core/renderer_opengl/gl_shader_gen.h" +namespace Core { +class System; +} // namespace Core +  namespace OpenGL {  class CachedShader; @@ -107,7 +111,7 @@ private:  class ShaderCacheOpenGL final : public RasterizerCache<Shader> {  public: -    explicit ShaderCacheOpenGL(RasterizerOpenGL& rasterizer); +    explicit ShaderCacheOpenGL(RasterizerOpenGL& rasterizer, Core::System& system);      /// Loads disk cache for the current game      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);  static_assert(sizeof(ShaderDiskCacheUsage) == 24);  namespace { -std::string GetTitleID() { -    return fmt::format("{:016X}", Core::CurrentProcess()->GetTitleID()); -}  ShaderCacheVersionHash GetShaderCacheVersionHash() {      ShaderCacheVersionHash hash{}; @@ -82,6 +79,7 @@ std::vector<u8> DecompressData(const std::vector<u8>& compressed, std::size_t un      }      return uncompressed;  } +  } // namespace  ShaderDiskCacheRaw::ShaderDiskCacheRaw(u64 unique_identifier, Maxwell::ShaderProgram program_type, @@ -137,9 +135,13 @@ bool ShaderDiskCacheRaw::Save(FileUtil::IOFile& file) const {      return true;  } +ShaderDiskCacheOpenGL::ShaderDiskCacheOpenGL(Core::System& system) : system{system} {} +  std::optional<std::pair<std::vector<ShaderDiskCacheRaw>, std::vector<ShaderDiskCacheUsage>>>  ShaderDiskCacheOpenGL::LoadTransferable() { -    if (!Settings::values.use_disk_shader_cache) +    // Skip games without title id +    const bool has_title_id = system.CurrentProcess()->GetTitleID() != 0; +    if (!Settings::values.use_disk_shader_cache || !has_title_id)          return {};      tried_to_load = true; @@ -643,4 +645,8 @@ std::string ShaderDiskCacheOpenGL::GetBaseDir() const {      return FileUtil::GetUserPath(FileUtil::UserPath::ShaderDir) + DIR_SEP "opengl";  } +std::string ShaderDiskCacheOpenGL::GetTitleID() const { +    return fmt::format("{:016X}", system.CurrentProcess()->GetTitleID()); +} +  } // 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 @@  #include "video_core/engines/maxwell_3d.h"  #include "video_core/renderer_opengl/gl_shader_gen.h" +namespace Core { +class System; +} +  namespace FileUtil {  class IOFile; -} // namespace FileUtil +}  namespace OpenGL { @@ -148,6 +152,8 @@ struct ShaderDiskCacheDump {  class ShaderDiskCacheOpenGL {  public: +    explicit ShaderDiskCacheOpenGL(Core::System& system); +      /// Loads transferable cache. If file has a old version or on failure, it deletes the file.      std::optional<std::pair<std::vector<ShaderDiskCacheRaw>, std::vector<ShaderDiskCacheUsage>>>      LoadTransferable(); @@ -217,6 +223,11 @@ private:      /// Get user's shader directory path      std::string GetBaseDir() const; +    /// Get current game's title id +    std::string GetTitleID() const; + +    // Copre system +    Core::System& system;      // Stored transferable shaders      std::map<u64, std::set<ShaderDiskCacheUsage>> transferable;      // 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      return matrix;  } -RendererOpenGL::RendererOpenGL(Core::Frontend::EmuWindow& window) -    : VideoCore::RendererBase{window} {} +RendererOpenGL::RendererOpenGL(Core::Frontend::EmuWindow& window, Core::System& system) +    : VideoCore::RendererBase{window}, system{system} {}  RendererOpenGL::~RendererOpenGL() = default; @@ -250,7 +250,7 @@ void RendererOpenGL::CreateRasterizer() {      }      // Initialize sRGB Usage      OpenGLState::ClearsRGBUsed(); -    rasterizer = std::make_unique<RasterizerOpenGL>(render_window, screen_info); +    rasterizer = std::make_unique<RasterizerOpenGL>(render_window, system, screen_info);  }  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 @@  #include "video_core/renderer_opengl/gl_resource_manager.h"  #include "video_core/renderer_opengl/gl_state.h" +namespace Core { +class System; +} +  namespace Core::Frontend {  class EmuWindow;  } @@ -41,7 +45,7 @@ struct ScreenInfo {  class RendererOpenGL : public VideoCore::RendererBase {  public: -    explicit RendererOpenGL(Core::Frontend::EmuWindow& window); +    explicit RendererOpenGL(Core::Frontend::EmuWindow& window, Core::System& system);      ~RendererOpenGL() override;      /// Swap buffers (render frame) @@ -72,6 +76,8 @@ private:      void LoadColorToActiveGLTexture(u8 color_r, u8 color_g, u8 color_b, u8 color_a,                                      const TextureInfo& texture); +    Core::System& system; +      OpenGLState state;      // 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 @@  namespace VideoCore { -std::unique_ptr<RendererBase> CreateRenderer(Core::Frontend::EmuWindow& emu_window) { -    return std::make_unique<OpenGL::RendererOpenGL>(emu_window); +std::unique_ptr<RendererBase> CreateRenderer(Core::Frontend::EmuWindow& emu_window, +                                             Core::System& system) { +    return std::make_unique<OpenGL::RendererOpenGL>(emu_window, system);  }  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 @@  #include <memory> +namespace Core { +class System; +} +  namespace Core::Frontend {  class EmuWindow;  } @@ -20,7 +24,8 @@ class RendererBase;   * @note The returned renderer instance is simply allocated. Its Init()   *       function still needs to be called to fully complete its setup.   */ -std::unique_ptr<RendererBase> CreateRenderer(Core::Frontend::EmuWindow& emu_window); +std::unique_ptr<RendererBase> CreateRenderer(Core::Frontend::EmuWindow& emu_window, +                                             Core::System& system);  u16 GetResolutionScaleFactor(const RendererBase& renderer); | 
