diff --git a/DDrawCompat/D3dDdi/DeviceState.cpp b/DDrawCompat/D3dDdi/DeviceState.cpp index ae3fa33..4000542 100644 --- a/DDrawCompat/D3dDdi/DeviceState.cpp +++ b/DDrawCompat/D3dDdi/DeviceState.cpp @@ -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( + 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); } } diff --git a/DDrawCompat/D3dDdi/DeviceState.h b/DDrawCompat/D3dDdi/DeviceState.h index c91e596..a6a2b2b 100644 --- a/DDrawCompat/D3dDdi/DeviceState.h +++ b/DDrawCompat/D3dDdi/DeviceState.h @@ -103,6 +103,7 @@ namespace D3dDdi struct VertexDecl { + std::unique_ptr untransformedDecl; std::vector elements; std::array texCoordOffset; std::array texCoordType;