gl_shader_disk_cache: Pass core system as argument and guard against games without title ids
This commit is contained in:
		
							parent
							
								
									2bc6a699dc
								
							
						
					
					
						commit
						7fefec585c
					
				| @ -123,7 +123,7 @@ struct System::Impl { | ||||
|         Service::Init(service_manager, *virtual_filesystem); | ||||
|         GDBStub::Init(); | ||||
| 
 | ||||
|         renderer = VideoCore::CreateRenderer(emu_window); | ||||
|         renderer = VideoCore::CreateRenderer(emu_window, system); | ||||
|         if (!renderer->Init()) { | ||||
|             return ResultStatus::ErrorVideoCore; | ||||
|         } | ||||
|  | ||||
| @ -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) { | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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(); | ||||
|  | ||||
| @ -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(); | ||||
|  | ||||
| @ -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
 | ||||
| @ -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
 | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
| @ -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
 | ||||
|  | ||||
| @ -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) { | ||||
|  | ||||
| @ -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); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 ReinUsesLisp
						ReinUsesLisp