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