mirror of
https://github.com/cemu-project/Cemu.git
synced 2026-04-26 04:45:18 -06:00
isolate more stuffs to opengl/vulkan only
This commit is contained in:
parent
6e7d95714a
commit
594f377671
@ -108,15 +108,22 @@ void LatteShader_calculateFSKey(LatteFetchShader* fetchShader)
|
||||
key = std::rotl<uint64>(key, 8);
|
||||
key += (uint64)attrib->semanticId;
|
||||
key = std::rotl<uint64>(key, 8);
|
||||
if (g_renderer->GetType() == RendererAPI::Metal)
|
||||
switch(g_renderer->GetType())
|
||||
{
|
||||
#if ENABLE_METAL
|
||||
case RendererAPI::Metal:
|
||||
{
|
||||
key += (uint64)attrib->offset;
|
||||
key = std::rotl<uint64>(key, 7);
|
||||
break;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
default:
|
||||
{
|
||||
key += (uint64)(attrib->offset & 3);
|
||||
key = std::rotl<uint64>(key, 2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -552,7 +552,7 @@ void LatteSHRC_UpdateVSBaseHash(uint8* vertexShaderPtr, uint32 vertexShaderSize,
|
||||
vsHash += 51ULL;
|
||||
|
||||
// Vertex fetch
|
||||
if (_activeFetchShader->mtlFetchVertexManually)
|
||||
if (_activeFetchShader->mtlFetchVertexManually)
|
||||
vsHash += 349ULL;
|
||||
}
|
||||
}
|
||||
@ -807,12 +807,12 @@ void LatteShader_GetDecompilerOptions(LatteDecompilerOptions& options, LatteCons
|
||||
options.usesGeometryShader = geometryShaderEnabled;
|
||||
options.spirvInstrinsics.hasRoundingModeRTEFloat32 = false;
|
||||
options.useTFViaSSBO = g_renderer->UseTFViaSSBO();
|
||||
#ifdef ENABLE_VULKAN
|
||||
#ifdef ENABLE_VULKAN
|
||||
if (g_renderer->GetType() == RendererAPI::Vulkan)
|
||||
{
|
||||
options.spirvInstrinsics.hasRoundingModeRTEFloat32 = VulkanRenderer::GetInstance()->HasSPRIVRoundingModeRTE32();
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
options.strictMul = g_current_game_profile->GetAccurateShaderMul() != AccurateShaderMulOption::False;
|
||||
}
|
||||
|
||||
@ -888,12 +888,14 @@ LatteDecompilerShader* LatteShader_CompileSeparableVertexShader(uint64 baseHash,
|
||||
LatteShader_CreateRendererShader(vertexShader, false);
|
||||
performanceMonitor.numCompiledVS++;
|
||||
|
||||
#ifdef ENABLE_OPENGL
|
||||
if (g_renderer->GetType() == RendererAPI::OpenGL)
|
||||
{
|
||||
if (vertexShader->shader)
|
||||
vertexShader->shader->PreponeCompilation(true);
|
||||
LatteShader_FinishCompilation(vertexShader);
|
||||
}
|
||||
#endif
|
||||
|
||||
LatteSHRC_RegisterShader(vertexShader, vertexShader->baseHash, vertexShader->auxHash);
|
||||
return vertexShader;
|
||||
@ -917,12 +919,14 @@ LatteDecompilerShader* LatteShader_CompileSeparableGeometryShader(uint64 baseHas
|
||||
LatteShader_CreateRendererShader(geometryShader, false);
|
||||
performanceMonitor.numCompiledGS++;
|
||||
|
||||
#ifdef ENABLE_OPENGL
|
||||
if (g_renderer->GetType() == RendererAPI::OpenGL)
|
||||
{
|
||||
if (geometryShader->shader)
|
||||
geometryShader->shader->PreponeCompilation(true);
|
||||
LatteShader_FinishCompilation(geometryShader);
|
||||
}
|
||||
#endif
|
||||
|
||||
LatteSHRC_RegisterShader(geometryShader, geometryShader->baseHash, geometryShader->auxHash);
|
||||
return geometryShader;
|
||||
@ -946,12 +950,14 @@ LatteDecompilerShader* LatteShader_CompileSeparablePixelShader(uint64 baseHash,
|
||||
LatteShaderCache_writeSeparablePixelShader(_shaderBaseHash_ps, psAuxHash, pixelShaderPtr, pixelShaderSize, LatteGPUState.contextRegister, usesGeometryShader);
|
||||
}
|
||||
|
||||
#ifdef ENABLE_OPENGL
|
||||
if (g_renderer->GetType() == RendererAPI::OpenGL)
|
||||
{
|
||||
if (pixelShader->shader)
|
||||
pixelShader->shader->PreponeCompilation(true);
|
||||
LatteShader_FinishCompilation(pixelShader);
|
||||
}
|
||||
#endif
|
||||
|
||||
LatteSHRC_RegisterShader(pixelShader, _shaderBaseHash_ps, psAuxHash);
|
||||
return pixelShader;
|
||||
|
||||
@ -394,10 +394,17 @@ void LatteShaderCache_Load()
|
||||
|
||||
// get cache file name
|
||||
fs::path pathGeneric;
|
||||
if (g_renderer->GetType() == RendererAPI::Metal)
|
||||
switch(g_renderer->GetType())
|
||||
{
|
||||
#if ENABLE_METAL
|
||||
case RendererAPI::Metal:
|
||||
pathGeneric = ActiveSettings::GetCachePath("shaderCache/transferable/{:016x}_mtlshaders.bin", cacheTitleId);
|
||||
else
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
pathGeneric = ActiveSettings::GetCachePath("shaderCache/transferable/{:016x}_shaders.bin", cacheTitleId);
|
||||
break;
|
||||
}
|
||||
|
||||
// calculate extraVersion for transferable and precompiled shader cache
|
||||
uint32 transferableExtraVersion = SHADER_CACHE_GENERIC_EXTRA_VERSION;
|
||||
@ -495,8 +502,10 @@ void LatteShaderCache_Load()
|
||||
#endif
|
||||
LatteShaderCache_finish();
|
||||
// if Vulkan or Metal then also load pipeline cache
|
||||
#if defined(ENABLE_VULKAN) || ENABLE_METAL
|
||||
if (g_renderer->GetType() == RendererAPI::Vulkan || g_renderer->GetType() == RendererAPI::Metal)
|
||||
LatteShaderCache_LoadPipelineCache(cacheTitleId);
|
||||
#endif
|
||||
|
||||
|
||||
g_renderer->BeginFrame(true);
|
||||
|
||||
@ -567,6 +567,8 @@ bool __LatteTexture_IsBlockedFormatRelation(LatteTexture* texture1, LatteTexture
|
||||
if (texture1->format == Latte::E_GX2SURFFMT::D32_FLOAT && Latte::GetHWFormat(texture2->format) == Latte::E_HWSURFFMT::HWFMT_8_8_8_8)
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_VULKAN
|
||||
// Vulkan has stricter rules
|
||||
if (g_renderer->GetType() == RendererAPI::Vulkan)
|
||||
{
|
||||
@ -574,6 +576,7 @@ bool __LatteTexture_IsBlockedFormatRelation(LatteTexture* texture1, LatteTexture
|
||||
if (texture1->format == Latte::E_GX2SURFFMT::D32_FLOAT && Latte::GetHWFormat(texture2->format) == Latte::E_HWSURFFMT::HWFMT_8_24)
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -194,7 +194,7 @@ void LatteTexture_updateTexturesForStage(LatteDecompilerShader* shaderContext, u
|
||||
LatteGPUState.repeatTextureInitialization = true;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_OPENGL
|
||||
#ifdef ENABLE_OPENGL
|
||||
if (g_renderer->GetType() == RendererAPI::OpenGL)
|
||||
{
|
||||
// on OpenGL, texture views and sampler parameters are tied together (we are avoiding sampler objects due to driver bugs)
|
||||
@ -217,7 +217,8 @@ void LatteTexture_updateTexturesForStage(LatteDecompilerShader* shaderContext, u
|
||||
textureView->lastTextureBindIndex = LatteGPUState.textureBindCounter;
|
||||
rendererGL->renderstate_updateTextureSettingsGL(shaderContext, textureView, textureIndex + glBackendBaseTexUnit, word4, textureIndex, isDepthSampler);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
g_renderer->texture_setLatteTexture(textureView, textureIndex + glBackendBaseTexUnit);
|
||||
// update if data changed
|
||||
bool swizzleChanged = false;
|
||||
|
||||
@ -250,10 +250,17 @@ fragment float4 main0(VertexOut in [[stage_in]], texture2d<float> textureSrc [[t
|
||||
RendererOutputShader::RendererOutputShader(const std::string& vertex_source, const std::string& fragment_source)
|
||||
{
|
||||
std::string finalFragmentSrc;
|
||||
if (g_renderer->GetType() == RendererAPI::Metal)
|
||||
finalFragmentSrc = fragment_source;
|
||||
else
|
||||
finalFragmentSrc = PrependFragmentPreamble(fragment_source);
|
||||
switch(g_renderer->GetType())
|
||||
{
|
||||
#if defined(ENABLE_METAL)
|
||||
case RendererAPI::Metal:
|
||||
finalFragmentSrc = fragment_source;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
finalFragmentSrc = PrependFragmentPreamble(fragment_source);
|
||||
break;
|
||||
}
|
||||
|
||||
m_vertex_shader.reset(g_renderer->shader_create(RendererShader::ShaderType::kVertex, 0, 0, vertex_source, false, false));
|
||||
m_fragment_shader.reset(g_renderer->shader_create(RendererShader::ShaderType::kFragment, 0, 0, finalFragmentSrc, false, false));
|
||||
@ -488,7 +495,10 @@ void main()
|
||||
}
|
||||
void RendererOutputShader::InitializeStatic()
|
||||
{
|
||||
if (g_renderer->GetType() == RendererAPI::Metal)
|
||||
switch(g_renderer->GetType())
|
||||
{
|
||||
#if ENABLE_METAL
|
||||
case RendererAPI::Metal:
|
||||
{
|
||||
std::string vertex_source = GetMetalVertexSource(false);
|
||||
std::string vertex_source_ud = GetMetalVertexSource(true);
|
||||
@ -501,21 +511,17 @@ void RendererOutputShader::InitializeStatic()
|
||||
|
||||
s_hermit_shader = new RendererOutputShader(vertex_source, s_hermite_shader_source_mtl);
|
||||
s_hermit_shader_ud = new RendererOutputShader(vertex_source_ud, s_hermite_shader_source_mtl);
|
||||
break;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
#ifdef ENABLE_OPENGL
|
||||
case RendererAPI::OpenGL:
|
||||
{
|
||||
std::string vertex_source, vertex_source_ud;
|
||||
// vertex shader
|
||||
if (g_renderer->GetType() == RendererAPI::OpenGL)
|
||||
{
|
||||
vertex_source = GetOpenGlVertexSource(false);
|
||||
vertex_source_ud = GetOpenGlVertexSource(true);
|
||||
}
|
||||
else if (g_renderer->GetType() == RendererAPI::Vulkan)
|
||||
{
|
||||
vertex_source = GetVulkanVertexSource(false);
|
||||
vertex_source_ud = GetVulkanVertexSource(true);
|
||||
}
|
||||
vertex_source = GetOpenGlVertexSource(false);
|
||||
vertex_source_ud = GetOpenGlVertexSource(true);
|
||||
|
||||
s_copy_shader = new RendererOutputShader(vertex_source, s_copy_shader_source);
|
||||
s_copy_shader_ud = new RendererOutputShader(vertex_source_ud, s_copy_shader_source);
|
||||
|
||||
@ -524,7 +530,29 @@ void RendererOutputShader::InitializeStatic()
|
||||
|
||||
s_hermit_shader = new RendererOutputShader(vertex_source, s_hermite_shader_source);
|
||||
s_hermit_shader_ud = new RendererOutputShader(vertex_source_ud, s_hermite_shader_source);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#ifdef ENABLE_VULKAN
|
||||
case RendererAPI::Vulkan:
|
||||
{
|
||||
std::string vertex_source, vertex_source_ud;
|
||||
// vertex shader
|
||||
vertex_source = GetVulkanVertexSource(false);
|
||||
vertex_source_ud = GetVulkanVertexSource(true);
|
||||
|
||||
s_copy_shader = new RendererOutputShader(vertex_source, s_copy_shader_source);
|
||||
s_copy_shader_ud = new RendererOutputShader(vertex_source_ud, s_copy_shader_source);
|
||||
|
||||
s_bicubic_shader = new RendererOutputShader(vertex_source, s_bicubic_shader_source);
|
||||
s_bicubic_shader_ud = new RendererOutputShader(vertex_source_ud, s_bicubic_shader_source);
|
||||
|
||||
s_hermit_shader = new RendererOutputShader(vertex_source, s_hermite_shader_source);
|
||||
s_hermit_shader_ud = new RendererOutputShader(vertex_source_ud, s_hermite_shader_source);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void RendererOutputShader::ShutdownStatic()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user