From ee19db091fa707356a001dfd23ef10a00ef8a230 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 13 Dec 2022 16:53:53 +0100 Subject: [PATCH] Add accessor for UseFlags --- GPU/D3D11/DrawEngineD3D11.cpp | 2 +- GPU/D3D11/GPU_D3D11.cpp | 2 +- GPU/Directx9/GPU_DX9.cpp | 2 +- GPU/GLES/GPU_GLES.cpp | 4 ++-- GPU/GLES/ShaderManagerGLES.cpp | 6 +++--- GPU/GPUCommon.cpp | 4 ++-- GPU/GPUState.h | 18 +++++++++++++++--- GPU/Vulkan/GPU_Vulkan.cpp | 4 ++-- GPU/Vulkan/ShaderManagerVulkan.cpp | 6 +++--- UI/DevScreens.cpp | 2 +- 10 files changed, 31 insertions(+), 19 deletions(-) diff --git a/GPU/D3D11/DrawEngineD3D11.cpp b/GPU/D3D11/DrawEngineD3D11.cpp index 87b7d866b8..ce6c3cfec6 100644 --- a/GPU/D3D11/DrawEngineD3D11.cpp +++ b/GPU/D3D11/DrawEngineD3D11.cpp @@ -712,7 +712,7 @@ rotateVBO: uint8_t clearStencil = clearColor >> 24; draw_->Clear(clearFlag, clearColor, clearDepth, clearStencil); - if ((gstate_c.useFlags & GPU_USE_CLEAR_RAM_HACK) && gstate.isClearModeColorMask() && (gstate.isClearModeAlphaMask() || gstate_c.framebufFormat == GE_FORMAT_565)) { + if (gstate_c.Use(GPU_USE_CLEAR_RAM_HACK) && gstate.isClearModeColorMask() && (gstate.isClearModeAlphaMask() || gstate_c.framebufFormat == GE_FORMAT_565)) { int scissorX1 = gstate.getScissorX1(); int scissorY1 = gstate.getScissorY1(); int scissorX2 = gstate.getScissorX2() + 1; diff --git a/GPU/D3D11/GPU_D3D11.cpp b/GPU/D3D11/GPU_D3D11.cpp index 86340fc6d8..947a76af55 100644 --- a/GPU/D3D11/GPU_D3D11.cpp +++ b/GPU/D3D11/GPU_D3D11.cpp @@ -82,7 +82,7 @@ GPU_D3D11::GPU_D3D11(GraphicsContext *gfxCtx, Draw::DrawContext *draw) // No need to flush before the tex scale/offset commands if we are baking // the tex scale/offset into the vertices anyway. UpdateCmdInfo(); - gstate_c.useFlags = CheckGPUFeatures(); + gstate_c.SetUseFlags(CheckGPUFeatures()); BuildReportingInfo(); diff --git a/GPU/Directx9/GPU_DX9.cpp b/GPU/Directx9/GPU_DX9.cpp index c5559f379a..e60167db71 100644 --- a/GPU/Directx9/GPU_DX9.cpp +++ b/GPU/Directx9/GPU_DX9.cpp @@ -81,7 +81,7 @@ GPU_DX9::GPU_DX9(GraphicsContext *gfxCtx, Draw::DrawContext *draw) // No need to flush before the tex scale/offset commands if we are baking // the tex scale/offset into the vertices anyway. UpdateCmdInfo(); - gstate_c.useFlags = CheckGPUFeatures(); + gstate_c.SetUseFlags(CheckGPUFeatures()); BuildReportingInfo(); diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index 380fe2d2c7..43ea2a97dc 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -55,7 +55,7 @@ GPU_GLES::GPU_GLES(GraphicsContext *gfxCtx, Draw::DrawContext *draw) : GPUCommon(gfxCtx, draw), drawEngine_(draw), fragmentTestCache_(draw) { UpdateVsyncInterval(true); - gstate_c.useFlags = CheckGPUFeatures(); + gstate_c.SetUseFlags(CheckGPUFeatures()); shaderManagerGL_ = new ShaderManagerGLES(draw); framebufferManagerGL_ = new FramebufferManagerGLES(draw); @@ -146,7 +146,7 @@ GPU_GLES::~GPU_GLES() { delete textureCacheGL_; // Clear features so they're not visible in system info. - gstate_c.useFlags = 0; + gstate_c.SetUseFlags(0); } // Take the raw GL extension and versioning data and turn into feature flags. diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 6c26199290..15c9422273 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -195,7 +195,7 @@ LinkedShader::LinkedShader(GLRenderManager *render, VShaderID VSID, Shader *vs, initialize.push_back({ &u_tess_weights_v, 0, TEX_SLOT_SPLINE_WEIGHTS_V }); GLRProgramFlags flags{}; - flags.supportDualSource = (gstate_c.useFlags & GPU_USE_DUALSOURCE_BLEND) != 0; + flags.supportDualSource = gstate_c.Use(GPU_USE_DUALSOURCE_BLEND); if (!VSID.Bit(VS_BIT_IS_THROUGH) && gstate_c.Use(GPU_USE_DEPTH_CLAMP)) { flags.useClipDistance0 = true; if (VSID.Bit(VS_BIT_VERTEX_RANGE_CULLING) && gstate_c.Use(GPU_USE_CLIP_DISTANCE)) @@ -952,7 +952,7 @@ void ShaderManagerGLES::Load(const Path &filename) { if (!f.ReadArray(&header, 1)) { return; } - if (header.magic != CACHE_HEADER_MAGIC || header.version != CACHE_VERSION || header.useFlags != gstate_c.useFlags) { + if (header.magic != CACHE_HEADER_MAGIC || header.version != CACHE_VERSION || header.useFlags != gstate_c.GetUseFlags()) { return; } diskCachePending_.start = time_now_d(); @@ -1108,7 +1108,7 @@ void ShaderManagerGLES::Save(const Path &filename) { header.magic = CACHE_HEADER_MAGIC; header.version = CACHE_VERSION; header.reserved = 0; - header.useFlags = gstate_c.useFlags; + header.useFlags = gstate_c.GetUseFlags(); header.numVertexShaders = GetNumVertexShaders(); header.numFragmentShaders = GetNumFragmentShaders(); header.numLinkedPrograms = GetNumPrograms(); diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index bbfa7f3090..6682c4b5d8 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -636,7 +636,7 @@ void GPUCommon::ClearCacheNextFrame() { void GPUCommon::CheckConfigChanged() { if (configChanged_) { ClearCacheNextFrame(); - gstate_c.useFlags = CheckGPUFeatures(); + gstate_c.SetUseFlags(CheckGPUFeatures()); drawEngineCommon_->NotifyConfigChanged(); textureCache_->NotifyConfigChanged(); framebufferManager_->NotifyConfigChanged(); @@ -1244,7 +1244,7 @@ void GPUCommon::BeginFrame() { if (drawEngineCommon_->EverUsedExactEqualDepth() && !sawExactEqualDepth_) { sawExactEqualDepth_ = true; - gstate_c.useFlags = CheckGPUFeatures(); + gstate_c.SetUseFlags(CheckGPUFeatures()); } } diff --git a/GPU/GPUState.h b/GPU/GPUState.h index bc889e542f..e95c13558b 100644 --- a/GPU/GPUState.h +++ b/GPU/GPUState.h @@ -524,8 +524,8 @@ enum class SubmitType { }; struct GPUStateCache { - bool Use(u32 flags) { return (useFlags & flags) != 0; } // Return true if ANY of flags are true. - bool UseAll(u32 flags) { return (useFlags & flags) == flags; } // Return true if ALL flags are true. + bool Use(u32 flags) { return (useFlags_ & flags) != 0; } // Return true if ANY of flags are true. + bool UseAll(u32 flags) { return (useFlags_ & flags) == flags; } // Return true if ALL flags are true. uint64_t GetDirtyUniforms() { return dirty & DIRTY_ALL_UNIFORMS; } void Dirty(u64 what) { @@ -578,9 +578,21 @@ struct GPUStateCache { Dirty(DIRTY_FRAGMENTSHADER_STATE); } } + void SetUseFlags(u32 newFlags) { + if (newFlags != useFlags_) { + useFlags_ = newFlags; + // Recompile shaders and stuff? + } + } - u32 useFlags; + // When checking for a single flag, use Use()/UseAll(). + u32 GetUseFlags() const { + return useFlags_; + } +private: + u32 useFlags_; +public: u32 vertexAddr; u32 indexAddr; u32 offsetAddr; diff --git a/GPU/Vulkan/GPU_Vulkan.cpp b/GPU/Vulkan/GPU_Vulkan.cpp index 11a5bf9bde..c6ad8ca43c 100644 --- a/GPU/Vulkan/GPU_Vulkan.cpp +++ b/GPU/Vulkan/GPU_Vulkan.cpp @@ -52,7 +52,7 @@ GPU_Vulkan::GPU_Vulkan(GraphicsContext *gfxCtx, Draw::DrawContext *draw) : GPUCommon(gfxCtx, draw), drawEngine_(draw) { - gstate_c.useFlags = CheckGPUFeatures(); + gstate_c.SetUseFlags(CheckGPUFeatures()); drawEngine_.InitDeviceObjects(); VulkanContext *vulkan = (VulkanContext *)gfxCtx->GetAPIContext(); @@ -497,7 +497,7 @@ void GPU_Vulkan::DeviceRestore() { GPUCommon::DeviceRestore(); InitDeviceObjects(); - gstate_c.useFlags = CheckGPUFeatures(); + gstate_c.SetUseFlags(CheckGPUFeatures()); BuildReportingInfo(); UpdateCmdInfo(); diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index 4e614b2681..327392ad7c 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -515,8 +515,8 @@ bool ShaderManagerVulkan::LoadCache(FILE *f) { WARN_LOG(G3D, "Shader cache version mismatch, %d, expected %d", header.version, CACHE_VERSION); return false; } - if (header.useFlags != gstate_c.useFlags) { - WARN_LOG(G3D, "Shader cache useFlags mismatch, %08x, expected %08x", header.useFlags, gstate_c.useFlags); + if (header.useFlags != gstate_c.GetUseFlags()) { + WARN_LOG(G3D, "Shader cache useFlags mismatch, %08x, expected %08x", header.useFlags, gstate_c.GetUseFlags()); return false; } @@ -584,7 +584,7 @@ void ShaderManagerVulkan::SaveCache(FILE *f) { VulkanCacheHeader header{}; header.magic = CACHE_HEADER_MAGIC; header.version = CACHE_VERSION; - header.useFlags = gstate_c.useFlags; + header.useFlags = gstate_c.GetUseFlags(); header.reserved = 0; header.numVertexShaders = (int)vsCache_.size(); header.numFragmentShaders = (int)fsCache_.size(); diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index cd233f2e47..66df64c2ab 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -619,7 +619,7 @@ void SystemInfoScreen::CreateViews() { deviceSpecs->Add(new InfoItem("Moga", moga)); #endif - if (gstate_c.useFlags != 0) { + if (gstate_c.GetUseFlags()) { // We're in-game, and can determine these. // TODO: Call a static version of GPUCommon::CheckGPUFeatures() and derive them here directly.