Improve support for D3DDevice::CreatePixelShader()

This commit is contained in:
Echelon9 2013-08-13 20:52:03 +10:00
parent b48d6617d8
commit dc1a9901fd
1 changed files with 45 additions and 41 deletions

View File

@ -2914,65 +2914,64 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_CreatePixelShader
DbgPrintf("EmuD3D8 (0x%X): EmuIDirect3DDevice8_CreatePixelShader\n"
"(\n"
" pPSDef : 0x%.08X\n"
" pHandle : 0x%.08X\n"
" pHandle : 0x%.08X (0x%.08X)\n"
");\n",
GetCurrentThreadId(), pPSDef, pHandle);
GetCurrentThreadId(), pPSDef, pHandle, *pHandle);
//HRESULT hRet = E_FAIL;
HRESULT hRet = E_FAIL;
DWORD* pFunction = NULL;
LPD3DXBUFFER pRecompiledBuffer = NULL;
DWORD Handle = 0;
// DWORD Handle = 0;
//hRet = CreatePixelShaderFunction(pPSDef, &pRecompiledBuffer);
hRet = CreatePixelShaderFunction(pPSDef, &pRecompiledBuffer);
//if (SUCCEEDED(hRet))
//{
// pFunction = (DWORD*)pRecompiledBuffer->GetBufferPointer();
if (SUCCEEDED(hRet))
{
pFunction = (DWORD*)pRecompiledBuffer->GetBufferPointer();
// // redirect to windows d3d
// hRet = g_pD3DDevice8->CreatePixelShader
// (
// pFunction,
// &Handle
// );
//}
// Redirect to Windows D3D
hRet = g_pD3DDevice8->CreatePixelShader
(
pFunction,
pHandle
/*&Handle*/
);
}
//if (pRecompiledBuffer)
//{
// pRecompiledBuffer->Release();
//}
if (pRecompiledBuffer)
{
pRecompiledBuffer->Release();
}
// if(FAILED(hRet))
// {
// Handle = X_PIXELSHADER_FAKE_HANDLE;
// This additional layer of Cxbx internal indirection seems problematic, as
// CreatePixelShader() is expected to return a pHandle directly to a shader interface.
// EmuWarning("We're lying about the creation of a pixel shader!");
/*
PIXEL_SHADER *pPixelShader = (PIXEL_SHADER*)CxbxMalloc(sizeof(PIXEL_SHADER));
ZeroMemory(pPixelShader, sizeof(PIXEL_SHADER));
// hRet = D3D_OK;
// }
memcpy(&pPixelShader->PSDef, pPSDef, sizeof(X_D3DPIXELSHADERDEF));
//PIXEL_SHADER *pPixelShader = (PIXEL_SHADER*)CxbxMalloc(sizeof(PIXEL_SHADER));
//ZeroMemory(pPixelShader, sizeof(PIXEL_SHADER));
pPixelShader->Handle = Handle;
pPixelShader->dwStatus = hRet;
*pHandle = (DWORD)pPixelShader;
*/
//memcpy(&pPixelShader->PSDef, pPSDef, sizeof(X_D3DPIXELSHADERDEF));
//pPixelShader->Handle = Handle;
//pPixelShader->dwStatus = hRet;
//*pHandle = (DWORD)pPixelShader;
#if 1
#if 0
// ================================================================
pFunction = (DWORD*) pPSDef;
#endif
// Attempt to recompile PixelShader
EmuRecompilePshDef( pPSDef, NULL );
// redirect to windows d3d
HRESULT hRet = g_pD3DDevice8->CreatePixelShader
hRet = g_pD3DDevice8->CreatePixelShader
(
pFunction,
pHandle
);
// ================================================================
#endif
if(FAILED(hRet))
{
@ -2980,10 +2979,14 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_CreatePixelShader
// This is called too frequently as Azurik creates and destroys a
// pixel shader every frame, and makes debugging harder.
// EmuWarning("We're lying about the creation of a pixel shader!");
// EmuWarning("We're lying about the creation of a pixel shader!");
hRet = D3D_OK;
}
else
{
DbgPrintf("pHandle = 0x%.08X (0x%.08X)\n", pHandle, *pHandle);
}
EmuSwapFS(); // XBox FS
@ -3002,11 +3005,11 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetPixelShader
DbgPrintf("EmuD3D8 (0x%X): EmuIDirect3DDevice8_SetPixelShader\n"
"(\n"
" Handle : 0x%.08X\n"
" Handle : 0x%.08X\n"
");\n",
GetCurrentThreadId(), Handle);
// redirect to windows d3d
// Redirect to Windows D3D
HRESULT hRet = D3D_OK;
// Fake Programmable Pipeline
@ -3049,11 +3052,12 @@ HRESULT WINAPI XTL::EmuIDirect3DDevice8_SetPixelShader
g_bFakePixelShaderLoaded = TRUE;
}
// Fixed Pipeline, or Recompiled Programmable Pipeline
else if(Handle == NULL)
else if(Handle != NULL)
{
EmuWarning("Trying fixed or recompiled programmable pipeline pixel shader!");
g_bFakePixelShaderLoaded = FALSE;
g_dwCurrentPixelShader = Handle;
g_pD3DDevice8->SetPixelShader(Handle);
hRet = g_pD3DDevice8->SetPixelShader(Handle);
}
if(FAILED(hRet))