mirror of
https://github.com/cemu-project/Cemu.git
synced 2024-11-29 12:34:17 +01:00
check if pipeline is eligible for serializing
This commit is contained in:
parent
cbde7f983c
commit
4dcb858ab8
@ -10,6 +10,7 @@
|
|||||||
#include "Cafe/HW/Latte/Common/RegisterSerializer.h"
|
#include "Cafe/HW/Latte/Common/RegisterSerializer.h"
|
||||||
#include "Cafe/HW/Latte/Core/LatteShaderCache.h"
|
#include "Cafe/HW/Latte/Core/LatteShaderCache.h"
|
||||||
#include "Cemu/FileCache/FileCache.h"
|
#include "Cemu/FileCache/FileCache.h"
|
||||||
|
#include "Common/precompiled.h"
|
||||||
#include "HW/Latte/Core/LatteShader.h"
|
#include "HW/Latte/Core/LatteShader.h"
|
||||||
#include "HW/Latte/ISA/LatteReg.h"
|
#include "HW/Latte/ISA/LatteReg.h"
|
||||||
#include "HW/Latte/Renderer/Metal/LatteToMtl.h"
|
#include "HW/Latte/Renderer/Metal/LatteToMtl.h"
|
||||||
@ -47,10 +48,13 @@ MTL::RenderPipelineState* MetalPipelineCache::GetRenderPipelineState(const Latte
|
|||||||
return pipeline;
|
return pipeline;
|
||||||
|
|
||||||
MetalPipelineCompiler compiler(m_mtlr);
|
MetalPipelineCompiler compiler(m_mtlr);
|
||||||
compiler.InitFromState(fetchShader, vertexShader, geometryShader, pixelShader, lastUsedAttachmentsInfo, activeAttachmentsInfo, lcr);
|
bool fbosMatch;
|
||||||
|
compiler.InitFromState(fetchShader, vertexShader, geometryShader, pixelShader, lastUsedAttachmentsInfo, activeAttachmentsInfo, lcr, fbosMatch);
|
||||||
pipeline = compiler.Compile(false, true, true);
|
pipeline = compiler.Compile(false, true, true);
|
||||||
|
|
||||||
AddCurrentStateToCache(hash);
|
// If FBOs don't match, it wouldn't be possible to reconstruct the pipeline from the cache
|
||||||
|
if (fbosMatch)
|
||||||
|
AddCurrentStateToCache(hash);
|
||||||
|
|
||||||
return pipeline;
|
return pipeline;
|
||||||
}
|
}
|
||||||
@ -355,7 +359,9 @@ void MetalPipelineCache::LoadPipelineFromCache(std::span<uint8> fileData)
|
|||||||
// compile
|
// compile
|
||||||
{
|
{
|
||||||
MetalPipelineCompiler pp(m_mtlr);
|
MetalPipelineCompiler pp(m_mtlr);
|
||||||
pp.InitFromState(vertexShader->compatibleFetchShader, vertexShader, geometryShader, pixelShader, attachmentsInfo, attachmentsInfo, *lcr);
|
bool fbosMatch;
|
||||||
|
pp.InitFromState(vertexShader->compatibleFetchShader, vertexShader, geometryShader, pixelShader, attachmentsInfo, attachmentsInfo, *lcr, fbosMatch);
|
||||||
|
cemu_assert_debug(fbosMatch);
|
||||||
//{
|
//{
|
||||||
// s_spinlockSharedInternal.lock();
|
// s_spinlockSharedInternal.lock();
|
||||||
// delete lcr;
|
// delete lcr;
|
||||||
|
@ -196,7 +196,7 @@ extern std::atomic_int g_compiled_shaders_total;
|
|||||||
extern std::atomic_int g_compiled_shaders_async;
|
extern std::atomic_int g_compiled_shaders_async;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void SetFragmentState(T* desc, const MetalAttachmentsInfo& lastUsedAttachmentsInfo, const MetalAttachmentsInfo& activeAttachmentsInfo, const LatteContextRegister& lcr)
|
void SetFragmentState(T* desc, const MetalAttachmentsInfo& lastUsedAttachmentsInfo, const MetalAttachmentsInfo& activeAttachmentsInfo, const LatteContextRegister& lcr, bool& fbosMatch)
|
||||||
{
|
{
|
||||||
// Rasterization
|
// Rasterization
|
||||||
bool rasterizationEnabled = !lcr.PA_CL_CLIP_CNTL.get_DX_RASTERIZATION_KILL();
|
bool rasterizationEnabled = !lcr.PA_CL_CLIP_CNTL.get_DX_RASTERIZATION_KILL();
|
||||||
@ -221,6 +221,7 @@ void SetFragmentState(T* desc, const MetalAttachmentsInfo& lastUsedAttachmentsIn
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Color attachments
|
// Color attachments
|
||||||
|
fbosMatch = true;
|
||||||
const Latte::LATTE_CB_COLOR_CONTROL& colorControlReg = lcr.CB_COLOR_CONTROL;
|
const Latte::LATTE_CB_COLOR_CONTROL& colorControlReg = lcr.CB_COLOR_CONTROL;
|
||||||
uint32 blendEnableMask = colorControlReg.get_BLEND_MASK();
|
uint32 blendEnableMask = colorControlReg.get_BLEND_MASK();
|
||||||
uint32 renderTargetMask = lcr.CB_TARGET_MASK.get_MASK();
|
uint32 renderTargetMask = lcr.CB_TARGET_MASK.get_MASK();
|
||||||
@ -238,6 +239,7 @@ void SetFragmentState(T* desc, const MetalAttachmentsInfo& lastUsedAttachmentsIn
|
|||||||
if (activeAttachmentsInfo.colorFormats[i] == Latte::E_GX2SURFFMT::INVALID_FORMAT)
|
if (activeAttachmentsInfo.colorFormats[i] == Latte::E_GX2SURFFMT::INVALID_FORMAT)
|
||||||
{
|
{
|
||||||
colorAttachment->setWriteMask(MTL::ColorWriteMaskNone);
|
colorAttachment->setWriteMask(MTL::ColorWriteMaskNone);
|
||||||
|
fbosMatch = false;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -307,7 +309,7 @@ MetalPipelineCompiler::~MetalPipelineCompiler()
|
|||||||
m_pipelineDescriptor->release();
|
m_pipelineDescriptor->release();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MetalPipelineCompiler::InitFromState(const LatteFetchShader* fetchShader, const LatteDecompilerShader* vertexShader, const LatteDecompilerShader* geometryShader, const LatteDecompilerShader* pixelShader, const MetalAttachmentsInfo& lastUsedAttachmentsInfo, const MetalAttachmentsInfo& activeAttachmentsInfo, const LatteContextRegister& lcr)
|
void MetalPipelineCompiler::InitFromState(const LatteFetchShader* fetchShader, const LatteDecompilerShader* vertexShader, const LatteDecompilerShader* geometryShader, const LatteDecompilerShader* pixelShader, const MetalAttachmentsInfo& lastUsedAttachmentsInfo, const MetalAttachmentsInfo& activeAttachmentsInfo, const LatteContextRegister& lcr, bool& fbosMatch)
|
||||||
{
|
{
|
||||||
// Check if the pipeline uses a geometry shader
|
// Check if the pipeline uses a geometry shader
|
||||||
const LattePrimitiveMode primitiveMode = static_cast<LattePrimitiveMode>(LatteGPUState.contextRegister[mmVGT_PRIMITIVE_TYPE]);
|
const LattePrimitiveMode primitiveMode = static_cast<LattePrimitiveMode>(LatteGPUState.contextRegister[mmVGT_PRIMITIVE_TYPE]);
|
||||||
@ -326,9 +328,9 @@ void MetalPipelineCompiler::InitFromState(const LatteFetchShader* fetchShader, c
|
|||||||
m_pixelShaderMtl = static_cast<RendererShaderMtl*>(pixelShader->shader);
|
m_pixelShaderMtl = static_cast<RendererShaderMtl*>(pixelShader->shader);
|
||||||
|
|
||||||
if (m_usesGeometryShader)
|
if (m_usesGeometryShader)
|
||||||
InitFromStateMesh(fetchShader, lastUsedAttachmentsInfo, activeAttachmentsInfo, lcr);
|
InitFromStateMesh(fetchShader, lastUsedAttachmentsInfo, activeAttachmentsInfo, lcr, fbosMatch);
|
||||||
else
|
else
|
||||||
InitFromStateRender(fetchShader, vertexShader, lastUsedAttachmentsInfo, activeAttachmentsInfo, lcr);
|
InitFromStateRender(fetchShader, vertexShader, lastUsedAttachmentsInfo, activeAttachmentsInfo, lcr, fbosMatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
MTL::RenderPipelineState* MetalPipelineCompiler::Compile(bool forceCompile, bool isRenderThread, bool showInOverlay)
|
MTL::RenderPipelineState* MetalPipelineCompiler::Compile(bool forceCompile, bool isRenderThread, bool showInOverlay)
|
||||||
@ -409,7 +411,7 @@ MTL::RenderPipelineState* MetalPipelineCompiler::Compile(bool forceCompile, bool
|
|||||||
return pipeline;
|
return pipeline;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MetalPipelineCompiler::InitFromStateRender(const LatteFetchShader* fetchShader, const LatteDecompilerShader* vertexShader, const MetalAttachmentsInfo& lastUsedAttachmentsInfo, const MetalAttachmentsInfo& activeAttachmentsInfo, const LatteContextRegister& lcr)
|
void MetalPipelineCompiler::InitFromStateRender(const LatteFetchShader* fetchShader, const LatteDecompilerShader* vertexShader, const MetalAttachmentsInfo& lastUsedAttachmentsInfo, const MetalAttachmentsInfo& activeAttachmentsInfo, const LatteContextRegister& lcr, bool& fbosMatch)
|
||||||
{
|
{
|
||||||
// Render pipeline state
|
// Render pipeline state
|
||||||
MTL::RenderPipelineDescriptor* desc = MTL::RenderPipelineDescriptor::alloc()->init();
|
MTL::RenderPipelineDescriptor* desc = MTL::RenderPipelineDescriptor::alloc()->init();
|
||||||
@ -484,7 +486,7 @@ void MetalPipelineCompiler::InitFromStateRender(const LatteFetchShader* fetchSha
|
|||||||
vertexDescriptor->release();
|
vertexDescriptor->release();
|
||||||
}
|
}
|
||||||
|
|
||||||
SetFragmentState(desc, lastUsedAttachmentsInfo, activeAttachmentsInfo, lcr);
|
SetFragmentState(desc, lastUsedAttachmentsInfo, activeAttachmentsInfo, lcr, fbosMatch);
|
||||||
|
|
||||||
m_pipelineDescriptor = desc;
|
m_pipelineDescriptor = desc;
|
||||||
|
|
||||||
@ -545,12 +547,12 @@ void MetalPipelineCompiler::InitFromStateRender(const LatteFetchShader* fetchSha
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void MetalPipelineCompiler::InitFromStateMesh(const LatteFetchShader* fetchShader, const MetalAttachmentsInfo& lastUsedAttachmentsInfo, const MetalAttachmentsInfo& activeAttachmentsInfo, const LatteContextRegister& lcr)
|
void MetalPipelineCompiler::InitFromStateMesh(const LatteFetchShader* fetchShader, const MetalAttachmentsInfo& lastUsedAttachmentsInfo, const MetalAttachmentsInfo& activeAttachmentsInfo, const LatteContextRegister& lcr, bool& fbosMatch)
|
||||||
{
|
{
|
||||||
// Render pipeline state
|
// Render pipeline state
|
||||||
MTL::MeshRenderPipelineDescriptor* desc = MTL::MeshRenderPipelineDescriptor::alloc()->init();
|
MTL::MeshRenderPipelineDescriptor* desc = MTL::MeshRenderPipelineDescriptor::alloc()->init();
|
||||||
|
|
||||||
SetFragmentState(desc, lastUsedAttachmentsInfo, activeAttachmentsInfo, lcr);
|
SetFragmentState(desc, lastUsedAttachmentsInfo, activeAttachmentsInfo, lcr, fbosMatch);
|
||||||
|
|
||||||
m_pipelineDescriptor = desc;
|
m_pipelineDescriptor = desc;
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ public:
|
|||||||
MetalPipelineCompiler(class MetalRenderer* metalRenderer) : m_mtlr{metalRenderer} {}
|
MetalPipelineCompiler(class MetalRenderer* metalRenderer) : m_mtlr{metalRenderer} {}
|
||||||
~MetalPipelineCompiler();
|
~MetalPipelineCompiler();
|
||||||
|
|
||||||
void InitFromState(const LatteFetchShader* fetchShader, const LatteDecompilerShader* vertexShader, const LatteDecompilerShader* geometryShader, const LatteDecompilerShader* pixelShader, const class MetalAttachmentsInfo& lastUsedAttachmentsInfo, const class MetalAttachmentsInfo& activeAttachmentsInfo, const LatteContextRegister& lcr);
|
void InitFromState(const LatteFetchShader* fetchShader, const LatteDecompilerShader* vertexShader, const LatteDecompilerShader* geometryShader, const LatteDecompilerShader* pixelShader, const class MetalAttachmentsInfo& lastUsedAttachmentsInfo, const class MetalAttachmentsInfo& activeAttachmentsInfo, const LatteContextRegister& lcr, bool& fbosMatch);
|
||||||
|
|
||||||
MTL::RenderPipelineState* Compile(bool forceCompile, bool isRenderThread, bool showInOverlay);
|
MTL::RenderPipelineState* Compile(bool forceCompile, bool isRenderThread, bool showInOverlay);
|
||||||
|
|
||||||
@ -31,9 +31,9 @@ private:
|
|||||||
*/
|
*/
|
||||||
NS::Object* m_pipelineDescriptor;
|
NS::Object* m_pipelineDescriptor;
|
||||||
|
|
||||||
void InitFromStateRender(const LatteFetchShader* fetchShader, const LatteDecompilerShader* vertexShader, const class MetalAttachmentsInfo& lastUsedAttachmentsInfo, const class MetalAttachmentsInfo& activeAttachmentsInfo, const LatteContextRegister& lcr);
|
void InitFromStateRender(const LatteFetchShader* fetchShader, const LatteDecompilerShader* vertexShader, const class MetalAttachmentsInfo& lastUsedAttachmentsInfo, const class MetalAttachmentsInfo& activeAttachmentsInfo, const LatteContextRegister& lcr, bool& fbosMatch);
|
||||||
|
|
||||||
void InitFromStateMesh(const LatteFetchShader* fetchShader, const class MetalAttachmentsInfo& lastUsedAttachmentsInfo, const class MetalAttachmentsInfo& activeAttachmentsInfo, const LatteContextRegister& lcr);
|
void InitFromStateMesh(const LatteFetchShader* fetchShader, const class MetalAttachmentsInfo& lastUsedAttachmentsInfo, const class MetalAttachmentsInfo& activeAttachmentsInfo, const LatteContextRegister& lcr, bool& fbosMatch);
|
||||||
|
|
||||||
//void TryLoadBinaryArchive();
|
//void TryLoadBinaryArchive();
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user