1
0
mirror of https://github.com/narzoul/DDrawCompat synced 2024-12-30 08:55:36 +01:00

Fixed vertex shader declaration for VertexFixup=cpu

See issue #340.
This commit is contained in:
narzoul 2024-07-21 11:15:03 +02:00
parent 142b13e032
commit 1c4445717a
2 changed files with 15 additions and 4 deletions

View File

@ -549,10 +549,18 @@ namespace D3dDdi
}
}
HRESULT result = m_device.getOrigVtable().pfnCreateVertexShaderDecl(m_device, data, ve.data());
HRESULT result = m_device.getOrigVtable().pfnCreateVertexShaderDecl(m_device, data, vertexElements);
if (SUCCEEDED(result))
{
m_vertexShaderDecls[data->ShaderHandle] = decl;
if (decl.isTransformed)
{
D3DDDIARG_CREATEVERTEXSHADERDECL d = *data;
d.ShaderHandle = nullptr;
m_device.getOrigVtable().pfnCreateVertexShaderDecl(m_device, &d, ve.data());
decl.untransformedDecl = std::unique_ptr<void, ResourceDeleter>(
d.ShaderHandle, ResourceDeleter(m_device, m_device.getOrigVtable().pfnDeleteVertexShaderDecl));
}
m_vertexShaderDecls.emplace(data->ShaderHandle, std::move(decl));
}
return result;
}
@ -1236,15 +1244,17 @@ namespace D3dDdi
void DeviceState::updateShaders()
{
setPixelShader(mapPixelShader(m_app.pixelShader));
setVertexShaderDecl(m_app.vertexShaderDecl);
auto& vertexDecl = getVertexDecl();
if (Config::Settings::VertexFixup::GPU == m_vertexFixupConfig &&
getVertexDecl().isTransformed)
vertexDecl.isTransformed)
{
setVertexShaderDecl(vertexDecl.untransformedDecl.get());
setVertexShaderFunc(getVsVertexFixup());
}
else
{
setVertexShaderDecl(m_app.vertexShaderDecl);
setVertexShaderFunc(m_app.vertexShaderFunc);
}
}

View File

@ -103,6 +103,7 @@ namespace D3dDdi
struct VertexDecl
{
std::unique_ptr<void, ResourceDeleter> untransformedDecl;
std::vector<D3DDDIVERTEXELEMENT> elements;
std::array<UINT, 8> texCoordOffset;
std::array<UINT, 8> texCoordType;