Don't free what hasn't been allocated.

Don't activate declaration when a shader is merely created
Use X_VSH_MAX_ATTRIBUTES instead of 16
Rename SetCxbxVertexShader into RegisterCxbxVertexShader
This commit is contained in:
patrickvl 2020-05-04 10:18:00 +02:00
parent 9ab91550ae
commit 79102c6ef8
1 changed files with 13 additions and 7 deletions

View File

@ -1293,7 +1293,7 @@ CxbxVertexShader* GetCxbxVertexShader(DWORD XboxVertexShaderHandle)
return nullptr; return nullptr;
} }
void SetCxbxVertexShader(DWORD XboxVertexShaderHandle, CxbxVertexShader* shader) void RegisterCxbxVertexShader(DWORD XboxVertexShaderHandle, CxbxVertexShader* shader)
{ {
auto it = g_CxbxVertexShaders.find(XboxVertexShaderHandle); auto it = g_CxbxVertexShaders.find(XboxVertexShaderHandle);
if (it != g_CxbxVertexShaders.end() && it->second != nullptr && shader != nullptr) { if (it != g_CxbxVertexShaders.end() && it->second != nullptr && shader != nullptr) {
@ -1315,8 +1315,8 @@ void SetCxbxVertexDeclaration(CxbxVertexDeclaration& pCxbxVertexDeclaration) {
// Titles can specify default values for registers via calls like SetVertexData4f // Titles can specify default values for registers via calls like SetVertexData4f
// HLSL shaders need to know whether to use vertex data or default vertex shader values // HLSL shaders need to know whether to use vertex data or default vertex shader values
// Any register not in the vertex declaration should be set to the default value // Any register not in the vertex declaration should be set to the default value
float vertexDefaultFlags[16]; float vertexDefaultFlags[X_VSH_MAX_ATTRIBUTES];
for (int i = 0; i < 16; i++) { for (int i = 0; i < X_VSH_MAX_ATTRIBUTES; i++) {
vertexDefaultFlags[i] = pCxbxVertexDeclaration.vRegisterInDeclaration[i] ? 0.0f : 1.0f; vertexDefaultFlags[i] = pCxbxVertexDeclaration.vRegisterInDeclaration[i] ? 0.0f : 1.0f;
} }
g_pD3DDevice->SetVertexShaderConstantF(CXBX_D3DVS_CONSTREG_VREGDEFAULTS_FLAG_BASE, vertexDefaultFlags, 4); g_pD3DDevice->SetVertexShaderConstantF(CXBX_D3DVS_CONSTREG_VREGDEFAULTS_FLAG_BASE, vertexDefaultFlags, 4);
@ -1527,11 +1527,13 @@ HRESULT CxbxImpl_CreateVertexShader(CONST DWORD *pDeclaration, CONST DWORD *pFun
// NOTE: This is a fatal error because it ALWAYS triggers a crash within DrawVertices if not set // NOTE: This is a fatal error because it ALWAYS triggers a crash within DrawVertices if not set
CxbxKrnlCleanup("Failed to create Vertex Declaration"); CxbxKrnlCleanup("Failed to create Vertex Declaration");
} }
#if 0 // Creating a vertex shader doesn't imply activating it!
hRet = g_pD3DDevice->SetVertexDeclaration(pCxbxVertexShader->Declaration.pHostVertexDeclaration); hRet = g_pD3DDevice->SetVertexDeclaration(pCxbxVertexShader->Declaration.pHostVertexDeclaration);
DEBUG_D3DRESULT(hRet, "g_pD3DDevice->SetVertexDeclaration"); DEBUG_D3DRESULT(hRet, "g_pD3DDevice->SetVertexDeclaration");
if (FAILED(hRet)) { if (FAILED(hRet)) {
CxbxKrnlCleanup("Failed to set Vertex Declaration"); CxbxKrnlCleanup("Failed to set Vertex Declaration");
} }
#endif
uint64_t vertexShaderKey = 0; uint64_t vertexShaderKey = 0;
DWORD XboxFunctionSize = 0; DWORD XboxFunctionSize = 0;
@ -1558,8 +1560,7 @@ HRESULT CxbxImpl_CreateVertexShader(CONST DWORD *pDeclaration, CONST DWORD *pFun
memcpy(pCxbxVertexShader->pXboxFunctionCopy, pFunction, XboxFunctionSize); memcpy(pCxbxVertexShader->pXboxFunctionCopy, pFunction, XboxFunctionSize);
} }
// Register the host Vertex Shader RegisterCxbxVertexShader(*pHandle, pCxbxVertexShader);
SetCxbxVertexShader(*pHandle, pCxbxVertexShader);
if (FAILED(hRet)) if (FAILED(hRet))
{ {
@ -1585,6 +1586,7 @@ HRESULT CxbxImpl_CreateVertexShader(CONST DWORD *pDeclaration, CONST DWORD *pFun
return hRet; return hRet;
} }
void CxbxImpl_DeleteVertexShader(DWORD Handle) void CxbxImpl_DeleteVertexShader(DWORD Handle)
{ {
LOG_INIT // Allows use of DEBUG_D3DRESULT LOG_INIT // Allows use of DEBUG_D3DRESULT
@ -1594,8 +1596,12 @@ void CxbxImpl_DeleteVertexShader(DWORD Handle)
if (VshHandleIsVertexShader(Handle)) if (VshHandleIsVertexShader(Handle))
{ {
CxbxVertexShader* pCxbxVertexShader = GetCxbxVertexShader(Handle); CxbxVertexShader* pCxbxVertexShader = GetCxbxVertexShader(Handle); // Fetch from cache
SetCxbxVertexShader(Handle, nullptr); if (pCxbxVertexShader == nullptr) {
return; // Avoid crash if no shader was cached yet
}
RegisterCxbxVertexShader(Handle, nullptr); // Remove from cache
if (pCxbxVertexShader->Declaration.pHostVertexDeclaration) { if (pCxbxVertexShader->Declaration.pHostVertexDeclaration) {
HRESULT hRet = pCxbxVertexShader->Declaration.pHostVertexDeclaration->Release(); HRESULT hRet = pCxbxVertexShader->Declaration.pHostVertexDeclaration->Release();