mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-07-06 15:01:18 +12:00
Latte/Vulkan: Set shader rounding mode via VK_KHR_SHADER_FLOAT_CONTROLS
This commit is contained in:
parent
43c9a4eccd
commit
4a564e2447
11 changed files with 142 additions and 75 deletions
|
@ -641,16 +641,19 @@ bool LatteShaderCache_readSeparableVertexShader(MemStreamReader& streamReader, u
|
|||
return false;
|
||||
if (streamReader.hasError() || !streamReader.isEndOfStream())
|
||||
return false;
|
||||
// update PS inputs (influence VS shader outputs)
|
||||
// update PS inputs (affects VS shader outputs)
|
||||
LatteShader_UpdatePSInputs(lcr->GetRawView());
|
||||
// get fetch shader
|
||||
LatteFetchShader::CacheHash fsHash = LatteFetchShader::CalculateCacheHash((uint32*)fetchShaderData.data(), fetchShaderData.size());
|
||||
LatteFetchShader* fetchShader = LatteShaderRecompiler_createFetchShader(fsHash, lcr->GetRawView(), (uint32*)fetchShaderData.data(), fetchShaderData.size());
|
||||
// determine decompiler options
|
||||
LatteDecompilerOptions options;
|
||||
LatteShader_GetDecompilerOptions(options, LatteConst::ShaderType::Vertex, usesGeometryShader);
|
||||
// decompile vertex shader
|
||||
LatteDecompilerOutput_t decompilerOutput{};
|
||||
LatteFetchShader* fetchShaderList[1];
|
||||
fetchShaderList[0] = fetchShader;
|
||||
LatteDecompiler_DecompileVertexShader(shaderBaseHash, lcr->GetRawView(), vertexShaderData.data(), vertexShaderData.size(), fetchShaderList, 1, lcr->GetSpecialStateValues(), usesGeometryShader, &decompilerOutput);
|
||||
LatteDecompiler_DecompileVertexShader(shaderBaseHash, lcr->GetRawView(), vertexShaderData.data(), vertexShaderData.size(), fetchShaderList, 1, lcr->GetSpecialStateValues(), options, &decompilerOutput);
|
||||
LatteDecompilerShader* vertexShader = LatteShader_CreateShaderFromDecompilerOutput(decompilerOutput, shaderBaseHash, false, shaderAuxHash, lcr->GetRawView());
|
||||
// compile
|
||||
LatteShader_DumpShader(shaderBaseHash, shaderAuxHash, vertexShader);
|
||||
|
@ -688,15 +691,17 @@ bool LatteShaderCache_readSeparableGeometryShader(MemStreamReader& streamReader,
|
|||
return false;
|
||||
// update PS inputs
|
||||
LatteShader_UpdatePSInputs(lcr->GetRawView());
|
||||
// determine decompiler options
|
||||
LatteDecompilerOptions options;
|
||||
LatteShader_GetDecompilerOptions(options, LatteConst::ShaderType::Geometry, true);
|
||||
// decompile geometry shader
|
||||
LatteDecompilerOutput_t decompilerOutput{};
|
||||
LatteDecompiler_DecompileGeometryShader(shaderBaseHash, lcr->GetRawView(), geometryShaderData.data(), geometryShaderData.size(), geometryCopyShaderData.data(), geometryCopyShaderData.size(), lcr->GetSpecialStateValues(), vsRingParameterCount, &decompilerOutput);
|
||||
LatteDecompiler_DecompileGeometryShader(shaderBaseHash, lcr->GetRawView(), geometryShaderData.data(), geometryShaderData.size(), geometryCopyShaderData.data(), geometryCopyShaderData.size(), lcr->GetSpecialStateValues(), vsRingParameterCount, options, &decompilerOutput);
|
||||
LatteDecompilerShader* geometryShader = LatteShader_CreateShaderFromDecompilerOutput(decompilerOutput, shaderBaseHash, false, shaderAuxHash, lcr->GetRawView());
|
||||
// compile
|
||||
LatteShader_DumpShader(shaderBaseHash, shaderAuxHash, geometryShader);
|
||||
LatteShader_DumpRawShader(shaderBaseHash, shaderAuxHash, SHADER_DUMP_TYPE_GEOMETRY, geometryShaderData.data(), geometryShaderData.size());
|
||||
LatteShaderCache_loadOrCompileSeparableShader(geometryShader, shaderBaseHash, shaderAuxHash);
|
||||
catchOpenGLError();
|
||||
LatteSHRC_RegisterShader(geometryShader, shaderBaseHash, shaderAuxHash);
|
||||
return true;
|
||||
}
|
||||
|
@ -724,9 +729,12 @@ bool LatteShaderCache_readSeparablePixelShader(MemStreamReader& streamReader, ui
|
|||
return false;
|
||||
// update PS inputs
|
||||
LatteShader_UpdatePSInputs(lcr->GetRawView());
|
||||
// determine decompiler options
|
||||
LatteDecompilerOptions options;
|
||||
LatteShader_GetDecompilerOptions(options, LatteConst::ShaderType::Pixel, usesGeometryShader);
|
||||
// decompile pixel shader
|
||||
LatteDecompilerOutput_t decompilerOutput{};
|
||||
LatteDecompiler_DecompilePixelShader(shaderBaseHash, lcr->GetRawView(), pixelShaderData.data(), pixelShaderData.size(), lcr->GetSpecialStateValues(), usesGeometryShader, &decompilerOutput);
|
||||
LatteDecompiler_DecompilePixelShader(shaderBaseHash, lcr->GetRawView(), pixelShaderData.data(), pixelShaderData.size(), lcr->GetSpecialStateValues(), options, &decompilerOutput);
|
||||
LatteDecompilerShader* pixelShader = LatteShader_CreateShaderFromDecompilerOutput(decompilerOutput, shaderBaseHash, false, shaderAuxHash, lcr->GetRawView());
|
||||
// compile
|
||||
LatteShader_DumpShader(shaderBaseHash, shaderAuxHash, pixelShader);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue