mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-07-12 09:48:30 +12:00
specialize fragment shader output types & fix: shader errors
This commit is contained in:
parent
d7e9aff230
commit
e2ec602c43
11 changed files with 205 additions and 121 deletions
|
@ -1,30 +1,23 @@
|
|||
#include "Cafe/HW/Latte/Renderer/Metal/RendererShaderMtl.h"
|
||||
#include "Cafe/HW/Latte/Renderer/Metal/MetalRenderer.h"
|
||||
#include "Cafe/HW/Latte/Renderer/Metal/LatteToMtl.h"
|
||||
#include "Cafe/HW/Latte/Renderer/Metal/MetalCommon.h"
|
||||
|
||||
#include "Cemu/Logging/CemuLogging.h"
|
||||
#include "Metal/MTLFunctionDescriptor.hpp"
|
||||
#include "Common/precompiled.h"
|
||||
|
||||
RendererShaderMtl::RendererShaderMtl(MetalRenderer* mtlRenderer, ShaderType type, uint64 baseHash, uint64 auxHash, bool isGameShader, bool isGfxPackShader, const std::string& mslCode)
|
||||
: RendererShader(type, baseHash, auxHash, isGameShader, isGfxPackShader)
|
||||
: RendererShader(type, baseHash, auxHash, isGameShader, isGfxPackShader), m_mtlr{mtlRenderer}
|
||||
{
|
||||
NS::Error* error = nullptr;
|
||||
MTL::Library* library = mtlRenderer->GetDevice()->newLibrary(NS::String::string(mslCode.c_str(), NS::ASCIIStringEncoding), nullptr, &error);
|
||||
if (error)
|
||||
// Fragment functions are compiled just-in-time
|
||||
if (m_type == ShaderType::kFragment)
|
||||
{
|
||||
printf("failed to create library (error: %s) -> source:\n%s\n", error->localizedDescription()->utf8String(), mslCode.c_str());
|
||||
error->release();
|
||||
return;
|
||||
m_mslCode = mslCode;
|
||||
}
|
||||
else
|
||||
{
|
||||
Compile(mslCode);
|
||||
}
|
||||
//MTL::FunctionDescriptor* desc = MTL::FunctionDescriptor::alloc()->init();
|
||||
//desc->setName(NS::String::string("main0", NS::ASCIIStringEncoding));
|
||||
//error = nullptr;
|
||||
m_function = library->newFunction(NS::String::string("main0", NS::ASCIIStringEncoding));
|
||||
library->release();
|
||||
//if (error)
|
||||
//{
|
||||
// printf("failed to create function (error: %s)\n", error->localizedDescription()->utf8String());
|
||||
// error->release();
|
||||
// return;
|
||||
//}
|
||||
}
|
||||
|
||||
RendererShaderMtl::~RendererShaderMtl()
|
||||
|
@ -33,6 +26,47 @@ RendererShaderMtl::~RendererShaderMtl()
|
|||
m_function->release();
|
||||
}
|
||||
|
||||
void RendererShaderMtl::CompileFragmentFunction(CachedFBOMtl* activeFBO)
|
||||
{
|
||||
cemu_assert_debug(m_type == ShaderType::kFragment);
|
||||
|
||||
if (m_function)
|
||||
m_function->release();
|
||||
|
||||
std::string fullCode;
|
||||
|
||||
// Define color attachment data types
|
||||
for (uint8 i = 0; i < 8; i++)
|
||||
{
|
||||
const auto& colorBuffer = activeFBO->colorBuffer[i];
|
||||
if (!colorBuffer.texture)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
auto dataType = GetMtlPixelFormatInfo(colorBuffer.texture->format, false).dataType;
|
||||
fullCode += "#define " + GetColorAttachmentTypeStr(i) + " ";
|
||||
switch (dataType)
|
||||
{
|
||||
case MetalDataType::INT:
|
||||
fullCode += "int4";
|
||||
break;
|
||||
case MetalDataType::UINT:
|
||||
fullCode += "uint4";
|
||||
break;
|
||||
case MetalDataType::FLOAT:
|
||||
fullCode += "float4";
|
||||
break;
|
||||
default:
|
||||
cemu_assert_suspicious();
|
||||
break;
|
||||
}
|
||||
fullCode += "\n";
|
||||
}
|
||||
|
||||
fullCode += m_mslCode;
|
||||
Compile(fullCode);
|
||||
}
|
||||
|
||||
void RendererShaderMtl::ShaderCacheLoading_begin(uint64 cacheTitleId)
|
||||
{
|
||||
cemuLog_log(LogType::MetalLogging, "RendererShaderMtl::ShaderCacheLoading_begin not implemented!");
|
||||
|
@ -47,3 +81,17 @@ void RendererShaderMtl::ShaderCacheLoading_Close()
|
|||
{
|
||||
cemuLog_log(LogType::MetalLogging, "RendererShaderMtl::ShaderCacheLoading_Close not implemented!");
|
||||
}
|
||||
|
||||
void RendererShaderMtl::Compile(const std::string& mslCode)
|
||||
{
|
||||
NS::Error* error = nullptr;
|
||||
MTL::Library* library = m_mtlr->GetDevice()->newLibrary(NS::String::string(mslCode.c_str(), NS::ASCIIStringEncoding), nullptr, &error);
|
||||
if (error)
|
||||
{
|
||||
printf("failed to create library (error: %s) -> source:\n%s\n", error->localizedDescription()->utf8String(), mslCode.c_str());
|
||||
error->release();
|
||||
return;
|
||||
}
|
||||
m_function = library->newFunction(NS::String::string("main0", NS::ASCIIStringEncoding));
|
||||
library->release();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue