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)) 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; return result;
} }
@ -1236,15 +1244,17 @@ namespace D3dDdi
void DeviceState::updateShaders() void DeviceState::updateShaders()
{ {
setPixelShader(mapPixelShader(m_app.pixelShader)); setPixelShader(mapPixelShader(m_app.pixelShader));
setVertexShaderDecl(m_app.vertexShaderDecl);
auto& vertexDecl = getVertexDecl();
if (Config::Settings::VertexFixup::GPU == m_vertexFixupConfig && if (Config::Settings::VertexFixup::GPU == m_vertexFixupConfig &&
getVertexDecl().isTransformed) vertexDecl.isTransformed)
{ {
setVertexShaderDecl(vertexDecl.untransformedDecl.get());
setVertexShaderFunc(getVsVertexFixup()); setVertexShaderFunc(getVsVertexFixup());
} }
else else
{ {
setVertexShaderDecl(m_app.vertexShaderDecl);
setVertexShaderFunc(m_app.vertexShaderFunc); setVertexShaderFunc(m_app.vertexShaderFunc);
} }
} }

View File

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