mirror of
https://github.com/cemu-project/Cemu.git
synced 2024-12-01 21:44:17 +01:00
include color format data types in ps hash
This commit is contained in:
parent
8a74445a96
commit
cd72ad80d2
@ -14,6 +14,9 @@
|
|||||||
#include "config/ActiveSettings.h"
|
#include "config/ActiveSettings.h"
|
||||||
#include "Cafe/GameProfile/GameProfile.h"
|
#include "Cafe/GameProfile/GameProfile.h"
|
||||||
#include "util/containers/flat_hash_map.hpp"
|
#include "util/containers/flat_hash_map.hpp"
|
||||||
|
#if BOOST_OS_MACOS
|
||||||
|
#include "Cafe/HW/Latte/Renderer/Metal/LatteToMtl.h"
|
||||||
|
#endif
|
||||||
#include <cinttypes>
|
#include <cinttypes>
|
||||||
|
|
||||||
// experimental new decompiler (WIP)
|
// experimental new decompiler (WIP)
|
||||||
@ -544,6 +547,20 @@ void LatteSHRC_UpdatePSBaseHash(uint8* pixelShaderPtr, uint32 pixelShaderSize, b
|
|||||||
_calculateShaderProgramHash(psProgramCode, pixelShaderSize, &hashCachePS, &psHash1, &psHash2);
|
_calculateShaderProgramHash(psProgramCode, pixelShaderSize, &hashCachePS, &psHash1, &psHash2);
|
||||||
// get vertex shader
|
// get vertex shader
|
||||||
uint64 psHash = psHash1 + psHash2 + _activePSImportTable.key + (usesGeometryShader ? hashCacheGS.prevHash1 : 0ULL);
|
uint64 psHash = psHash1 + psHash2 + _activePSImportTable.key + (usesGeometryShader ? hashCacheGS.prevHash1 : 0ULL);
|
||||||
|
|
||||||
|
#if BOOST_OS_MACOS
|
||||||
|
if (g_renderer->GetType() == RendererAPI::Metal)
|
||||||
|
{
|
||||||
|
for (uint8 i = 0; i < LATTE_NUM_COLOR_TARGET; i++)
|
||||||
|
{
|
||||||
|
auto format = LatteMRT::GetColorBufferFormat(i, LatteGPUState.contextNew);
|
||||||
|
uint8 dataType = (uint8)GetMtlPixelFormatInfo(format, false).dataType;
|
||||||
|
psHash += (uint64)dataType;
|
||||||
|
psHash = std::rotl<uint64>(psHash, 7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
_shaderBaseHash_ps = psHash;
|
_shaderBaseHash_ps = psHash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3216,7 +3216,7 @@ static void _emitExportCode(LatteDecompilerShaderContext* shaderContext, LatteDe
|
|||||||
}
|
}
|
||||||
// pixel color output
|
// pixel color output
|
||||||
//src->addFmt("#ifdef {}" _CRLF, GetColorAttachmentTypeStr(pixelColorOutputIndex));
|
//src->addFmt("#ifdef {}" _CRLF, GetColorAttachmentTypeStr(pixelColorOutputIndex));
|
||||||
src->addFmt("out.passPixelColor{} = as_type<float4>(", pixelColorOutputIndex/*, GetColorAttachmentTypeStr(pixelColorOutputIndex)*/);
|
src->addFmt("out.passPixelColor{} = as_type<{}>(", pixelColorOutputIndex, GetColorBufferDataTypeStr(pixelColorOutputIndex, *shaderContext->contextRegistersNew)/*, GetColorAttachmentTypeStr(pixelColorOutputIndex)*/);
|
||||||
_emitExportGPRReadCode(shaderContext, cfInstruction, LATTE_DECOMPILER_DTYPE_FLOAT, i);
|
_emitExportGPRReadCode(shaderContext, cfInstruction, LATTE_DECOMPILER_DTYPE_FLOAT, i);
|
||||||
src->add(");" _CRLF);
|
src->add(");" _CRLF);
|
||||||
//src->add("#endif" _CRLF);
|
//src->add("#endif" _CRLF);
|
||||||
|
@ -282,7 +282,7 @@ namespace LatteDecompiler
|
|||||||
if ((decompilerContext->shader->pixelColorOutputMask & (1 << i)) != 0)
|
if ((decompilerContext->shader->pixelColorOutputMask & (1 << i)) != 0)
|
||||||
{
|
{
|
||||||
//src->addFmt("#ifdef {}" _CRLF, GetColorAttachmentTypeStr(i));
|
//src->addFmt("#ifdef {}" _CRLF, GetColorAttachmentTypeStr(i));
|
||||||
src->addFmt("float4 passPixelColor{} [[color({})]];" _CRLF/*, GetColorAttachmentTypeStr(i)*/, i, i);
|
src->addFmt("{} passPixelColor{} [[color({})]];" _CRLF, GetColorBufferDataTypeStr(i, *decompilerContext->contextRegistersNew)/*, GetColorAttachmentTypeStr(i)*/, i, i);
|
||||||
//src->add("#endif" _CRLF);
|
//src->add("#endif" _CRLF);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -84,19 +84,17 @@ std::map<Latte::E_GX2SURFFMT, MetalPixelFormatInfo> MTL_DEPTH_FORMAT_TABLE = {
|
|||||||
|
|
||||||
const MetalPixelFormatInfo GetMtlPixelFormatInfo(Latte::E_GX2SURFFMT format, bool isDepth)
|
const MetalPixelFormatInfo GetMtlPixelFormatInfo(Latte::E_GX2SURFFMT format, bool isDepth)
|
||||||
{
|
{
|
||||||
|
if (format == Latte::E_GX2SURFFMT::INVALID_FORMAT)
|
||||||
|
{
|
||||||
|
return {MTL::PixelFormatInvalid, MetalDataType::NONE, 0};
|
||||||
|
}
|
||||||
|
|
||||||
MetalPixelFormatInfo formatInfo;
|
MetalPixelFormatInfo formatInfo;
|
||||||
if (isDepth)
|
if (isDepth)
|
||||||
formatInfo = MTL_DEPTH_FORMAT_TABLE[format];
|
formatInfo = MTL_DEPTH_FORMAT_TABLE[format];
|
||||||
else
|
else
|
||||||
formatInfo = MTL_COLOR_FORMAT_TABLE[format];
|
formatInfo = MTL_COLOR_FORMAT_TABLE[format];
|
||||||
|
|
||||||
// Depth24Unorm_Stencil8 is not supported on Apple sillicon
|
|
||||||
// TODO: query if format is available instead
|
|
||||||
if (formatInfo.pixelFormat == MTL::PixelFormatDepth24Unorm_Stencil8)
|
|
||||||
{
|
|
||||||
formatInfo.pixelFormat = MTL::PixelFormatDepth32Float_Stencil8;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (formatInfo.pixelFormat == MTL::PixelFormatInvalid)
|
if (formatInfo.pixelFormat == MTL::PixelFormatInvalid)
|
||||||
{
|
{
|
||||||
printf("invalid pixel format: %u\n", (uint32)format);
|
printf("invalid pixel format: %u\n", (uint32)format);
|
||||||
|
@ -32,6 +32,23 @@ const MetalPixelFormatInfo GetMtlPixelFormatInfo(Latte::E_GX2SURFFMT format, boo
|
|||||||
|
|
||||||
MTL::PixelFormat GetMtlPixelFormat(Latte::E_GX2SURFFMT format, bool isDepth, const MetalPixelFormatSupport& pixelFormatSupport);
|
MTL::PixelFormat GetMtlPixelFormat(Latte::E_GX2SURFFMT format, bool isDepth, const MetalPixelFormatSupport& pixelFormatSupport);
|
||||||
|
|
||||||
|
inline const char* GetColorBufferDataTypeStr(const uint32 index, const LatteContextRegister& lcr)
|
||||||
|
{
|
||||||
|
auto format = LatteMRT::GetColorBufferFormat(index, lcr);
|
||||||
|
auto dataType = GetMtlPixelFormatInfo(format, false).dataType;
|
||||||
|
switch (dataType)
|
||||||
|
{
|
||||||
|
case MetalDataType::INT:
|
||||||
|
return "int4";
|
||||||
|
case MetalDataType::UINT:
|
||||||
|
return "uint4";
|
||||||
|
case MetalDataType::FLOAT:
|
||||||
|
return "float4";
|
||||||
|
default:
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
size_t GetMtlTextureBytesPerRow(Latte::E_GX2SURFFMT format, bool isDepth, uint32 width);
|
size_t GetMtlTextureBytesPerRow(Latte::E_GX2SURFFMT format, bool isDepth, uint32 width);
|
||||||
|
|
||||||
size_t GetMtlTextureBytesPerImage(Latte::E_GX2SURFFMT format, bool isDepth, uint32 height, size_t bytesPerRow);
|
size_t GetMtlTextureBytesPerImage(Latte::E_GX2SURFFMT format, bool isDepth, uint32 height, size_t bytesPerRow);
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
#include "Cafe/HW/Latte/Renderer/Metal/MetalCommon.h"
|
#include "Cafe/HW/Latte/Renderer/Metal/MetalCommon.h"
|
||||||
#include "Cafe/HW/Latte/Renderer/Metal/MetalPipelineCache.h"
|
#include "Cafe/HW/Latte/Renderer/Metal/MetalPipelineCache.h"
|
||||||
#include "Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h"
|
#include "Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h"
|
||||||
#include "HW/Latte/Core/LatteShader.h"
|
#include "Cafe/HW/Latte/Core/LatteShader.h"
|
||||||
#include "HW/Latte/Renderer/Metal/CachedFBOMtl.h"
|
#include "Cafe/HW/Latte/Renderer/Metal/CachedFBOMtl.h"
|
||||||
#include "HW/Latte/Renderer/Metal/LatteToMtl.h"
|
#include "Cafe/HW/Latte/Renderer/Metal/LatteToMtl.h"
|
||||||
#include "HW/Latte/Renderer/Metal/RendererShaderMtl.h"
|
#include "Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.h"
|
||||||
#include "HW/Latte/Renderer/Metal/LatteTextureViewMtl.h"
|
#include "Cafe/HW/Latte/Renderer/Metal/LatteTextureViewMtl.h"
|
||||||
|
|
||||||
#include "HW/Latte/Core/FetchShader.h"
|
#include "Cafe/HW/Latte/Core/FetchShader.h"
|
||||||
#include "HW/Latte/ISA/RegDefines.h"
|
#include "Cafe/HW/Latte/ISA/RegDefines.h"
|
||||||
#include "config/ActiveSettings.h"
|
#include "config/ActiveSettings.h"
|
||||||
|
|
||||||
static void rectsEmulationGS_outputSingleVertex(std::string& gsSrc, const LatteDecompilerShader* vertexShader, LatteShaderPSInputTable* psInputTable, sint32 vIdx, const LatteContextRegister& latteRegister)
|
static void rectsEmulationGS_outputSingleVertex(std::string& gsSrc, const LatteDecompilerShader* vertexShader, LatteShaderPSInputTable* psInputTable, sint32 vIdx, const LatteContextRegister& latteRegister)
|
||||||
@ -409,7 +409,6 @@ MTL::RenderPipelineState* MetalPipelineCache::GetRenderPipelineState(const Latte
|
|||||||
{
|
{
|
||||||
debug_printf("error creating render pipeline state: %s\n", error->localizedDescription()->utf8String());
|
debug_printf("error creating render pipeline state: %s\n", error->localizedDescription()->utf8String());
|
||||||
error->release();
|
error->release();
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -484,13 +483,12 @@ MTL::RenderPipelineState* MetalPipelineCache::GetMeshPipelineState(const LatteFe
|
|||||||
desc->setLabel(GetLabel("Mesh pipeline state", desc));
|
desc->setLabel(GetLabel("Mesh pipeline state", desc));
|
||||||
#endif
|
#endif
|
||||||
pipeline = m_mtlr->GetDevice()->newRenderPipelineState(desc, MTL::PipelineOptionNone, nullptr, &error);
|
pipeline = m_mtlr->GetDevice()->newRenderPipelineState(desc, MTL::PipelineOptionNone, nullptr, &error);
|
||||||
|
desc->release();
|
||||||
if (error)
|
if (error)
|
||||||
{
|
{
|
||||||
debug_printf("error creating render pipeline state: %s\n", error->localizedDescription()->utf8String());
|
debug_printf("error creating render pipeline state: %s\n", error->localizedDescription()->utf8String());
|
||||||
error->release();
|
error->release();
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
desc->release();
|
|
||||||
|
|
||||||
return pipeline;
|
return pipeline;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user