From a9cb7a7ac8814a1ce90479f501a31abf1eed1c51 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Sat, 22 Apr 2017 17:25:52 +0100 Subject: [PATCH 1/7] Introduced GetXboxResourceType --- src/CxbxKrnl/EmuD3D8.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/CxbxKrnl/EmuD3D8.cpp b/src/CxbxKrnl/EmuD3D8.cpp index f6912c6ab..7717885eb 100644 --- a/src/CxbxKrnl/EmuD3D8.cpp +++ b/src/CxbxKrnl/EmuD3D8.cpp @@ -241,6 +241,14 @@ VOID XTL::CxbxInitWindow(Xbe::Header *XbeHeader, uint32 XbeHeaderSize) SetFocus(g_hEmuWindow); } +inline DWORD GetXboxResourceType(const XTL::X_D3DResource *pXboxResource) +{ + // Don't pass in unassigned Xbox resources + assert(pXboxResource != NULL); + + return pXboxResource->Common & X_D3DCOMMON_TYPE_MASK; +} + XTL::IDirect3DResource8 *GetHostResource(XTL::X_D3DResource *pThis) { if ((pThis->Data & X_D3DRESOURCE_DATA_FLAG_SPECIAL) == X_D3DRESOURCE_DATA_FLAG_SPECIAL) // Was X_D3DRESOURCE_DATA_YUV_SURFACE @@ -4380,7 +4388,7 @@ HRESULT WINAPI XTL::EMUPATCH(D3DResource_Register) X_D3DResource *pResource = pThis; - DWORD dwCommonType = pResource->Common & X_D3DCOMMON_TYPE_MASK; + DWORD dwCommonType = GetXboxResourceType(pResource); // add the offset of the current texture to the base pBase = (PVOID)((DWORD)pBase + pResource->Data); @@ -5256,7 +5264,7 @@ XTL::X_D3DRESOURCETYPE WINAPI XTL::EMUPATCH(D3DResource_GetType) EmuVerifyResourceIsRegistered(pThis); // Check for Xbox specific resources (Azurik may need this) - DWORD dwType = pThis->Common & X_D3DCOMMON_TYPE_MASK; + DWORD dwType = GetXboxResourceType(pThis); switch(dwType) { From 906c989bc655f9aaab351f7f188c145d268c199d Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Sat, 22 Apr 2017 17:29:22 +0100 Subject: [PATCH 2/7] Applied GetXboxResourceType --- src/CxbxKrnl/EmuD3D8.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/CxbxKrnl/EmuD3D8.cpp b/src/CxbxKrnl/EmuD3D8.cpp index c001fa591..74ac0c872 100644 --- a/src/CxbxKrnl/EmuD3D8.cpp +++ b/src/CxbxKrnl/EmuD3D8.cpp @@ -272,7 +272,7 @@ XTL::IDirect3DSurface8 *GetHostSurface(XTL::X_D3DResource *pThis) if (pThis == NULL) return nullptr; - if ((pThis->Common & X_D3DCOMMON_TYPE_MASK) != X_D3DCOMMON_TYPE_SURFACE) + if (GetXboxResourceType(pThis) != X_D3DCOMMON_TYPE_SURFACE) return nullptr; return pThis->EmuSurface8; @@ -283,7 +283,7 @@ XTL::IDirect3DBaseTexture8 *GetHostBaseTexture(XTL::X_D3DResource *pThis) if (pThis == NULL) return nullptr; - if ((pThis->Common & X_D3DCOMMON_TYPE_MASK) != X_D3DCOMMON_TYPE_TEXTURE) + if (GetXboxResourceType(pThis) != X_D3DCOMMON_TYPE_TEXTURE) return nullptr; return pThis->EmuBaseTexture8; @@ -294,7 +294,7 @@ XTL::IDirect3DTexture8 *GetHostTexture(XTL::X_D3DResource *pThis) if (pThis == NULL) return nullptr; - if ((pThis->Common & X_D3DCOMMON_TYPE_MASK) != X_D3DCOMMON_TYPE_TEXTURE) + if (GetXboxResourceType(pThis) != X_D3DCOMMON_TYPE_TEXTURE) return nullptr; // TODO : Check for 1 face? @@ -307,7 +307,7 @@ XTL::IDirect3DCubeTexture8 *GetHostCubeTexture(XTL::X_D3DResource *pThis) if (pThis == NULL) return nullptr; - if ((pThis->Common & X_D3DCOMMON_TYPE_MASK) != X_D3DCOMMON_TYPE_TEXTURE) + if (GetXboxResourceType(pThis) != X_D3DCOMMON_TYPE_TEXTURE) return nullptr; // TODO : Check for 6 faces? @@ -320,7 +320,7 @@ XTL::IDirect3DIndexBuffer8 *GetHostIndexBuffer(XTL::X_D3DResource *pThis) if (pThis == NULL) return nullptr; - if ((pThis->Common & X_D3DCOMMON_TYPE_MASK) != X_D3DCOMMON_TYPE_INDEXBUFFER) + if (GetXboxResourceType(pThis) != X_D3DCOMMON_TYPE_INDEXBUFFER) return nullptr; return pThis->EmuIndexBuffer8; @@ -331,7 +331,7 @@ XTL::IDirect3DVertexBuffer8 *GetHostVertexBuffer(XTL::X_D3DResource *pThis) if (pThis == NULL) return nullptr; - if ((pThis->Common & X_D3DCOMMON_TYPE_MASK) != X_D3DCOMMON_TYPE_VERTEXBUFFER) + if (GetXboxResourceType(pThis) != X_D3DCOMMON_TYPE_VERTEXBUFFER) return nullptr; return pThis->EmuVertexBuffer8; From d79cbe3e2b654f722161942d2ed7d9620a7ed267 Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Sat, 22 Apr 2017 17:30:30 +0100 Subject: [PATCH 3/7] Renamed some pThis into pXboxResource --- src/CxbxKrnl/EmuD3D8.cpp | 58 ++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/CxbxKrnl/EmuD3D8.cpp b/src/CxbxKrnl/EmuD3D8.cpp index 74ac0c872..3914866bf 100644 --- a/src/CxbxKrnl/EmuD3D8.cpp +++ b/src/CxbxKrnl/EmuD3D8.cpp @@ -250,91 +250,91 @@ inline DWORD GetXboxResourceType(const XTL::X_D3DResource *pXboxResource) return pXboxResource->Common & X_D3DCOMMON_TYPE_MASK; } -XTL::IDirect3DResource8 *GetHostResource(XTL::X_D3DResource *pThis) +XTL::IDirect3DResource8 *GetHostResource(XTL::X_D3DResource *pXboxResource) { - if ((pThis->Data & X_D3DRESOURCE_DATA_FLAG_SPECIAL) == X_D3DRESOURCE_DATA_FLAG_SPECIAL) // Was X_D3DRESOURCE_DATA_YUV_SURFACE + if ((pXboxResource->Data & X_D3DRESOURCE_DATA_FLAG_SPECIAL) == X_D3DRESOURCE_DATA_FLAG_SPECIAL) // Was X_D3DRESOURCE_DATA_YUV_SURFACE return nullptr; - if (pThis->Lock == X_D3DRESOURCE_LOCK_PALETTE) + if (pXboxResource->Lock == X_D3DRESOURCE_LOCK_PALETTE) return nullptr; - if (pThis->EmuResource8 == nullptr) + if (pXboxResource->EmuResource8 == nullptr) { __asm int 3; //EmuWarning("EmuResource is not a valid pointer!"); } - return pThis->EmuResource8; + return pXboxResource->EmuResource8; } -XTL::IDirect3DSurface8 *GetHostSurface(XTL::X_D3DResource *pThis) +XTL::IDirect3DSurface8 *GetHostSurface(XTL::X_D3DResource *pXboxResource) { - if (pThis == NULL) + if (pXboxResource == NULL) return nullptr; - if (GetXboxResourceType(pThis) != X_D3DCOMMON_TYPE_SURFACE) + if (GetXboxResourceType(pXboxResource) != X_D3DCOMMON_TYPE_SURFACE) return nullptr; - return pThis->EmuSurface8; + return pXboxResource->EmuSurface8; } -XTL::IDirect3DBaseTexture8 *GetHostBaseTexture(XTL::X_D3DResource *pThis) +XTL::IDirect3DBaseTexture8 *GetHostBaseTexture(XTL::X_D3DResource *pXboxResource) { - if (pThis == NULL) + if (pXboxResource == NULL) return nullptr; - if (GetXboxResourceType(pThis) != X_D3DCOMMON_TYPE_TEXTURE) + if (GetXboxResourceType(pXboxResource) != X_D3DCOMMON_TYPE_TEXTURE) return nullptr; - return pThis->EmuBaseTexture8; + return pXboxResource->EmuBaseTexture8; } -XTL::IDirect3DTexture8 *GetHostTexture(XTL::X_D3DResource *pThis) +XTL::IDirect3DTexture8 *GetHostTexture(XTL::X_D3DResource *pXboxResource) { - if (pThis == NULL) + if (pXboxResource == NULL) return nullptr; - if (GetXboxResourceType(pThis) != X_D3DCOMMON_TYPE_TEXTURE) + if (GetXboxResourceType(pXboxResource) != X_D3DCOMMON_TYPE_TEXTURE) return nullptr; // TODO : Check for 1 face? - return pThis->EmuTexture8; + return pXboxResource->EmuTexture8; } -XTL::IDirect3DCubeTexture8 *GetHostCubeTexture(XTL::X_D3DResource *pThis) +XTL::IDirect3DCubeTexture8 *GetHostCubeTexture(XTL::X_D3DResource *pXboxResource) { - if (pThis == NULL) + if (pXboxResource == NULL) return nullptr; - if (GetXboxResourceType(pThis) != X_D3DCOMMON_TYPE_TEXTURE) + if (GetXboxResourceType(pXboxResource) != X_D3DCOMMON_TYPE_TEXTURE) return nullptr; // TODO : Check for 6 faces? - return pThis->EmuCubeTexture8; + return pXboxResource->EmuCubeTexture8; } -XTL::IDirect3DIndexBuffer8 *GetHostIndexBuffer(XTL::X_D3DResource *pThis) +XTL::IDirect3DIndexBuffer8 *GetHostIndexBuffer(XTL::X_D3DResource *pXboxResource) { - if (pThis == NULL) + if (pXboxResource == NULL) return nullptr; - if (GetXboxResourceType(pThis) != X_D3DCOMMON_TYPE_INDEXBUFFER) + if (GetXboxResourceType(pXboxResource) != X_D3DCOMMON_TYPE_INDEXBUFFER) return nullptr; - return pThis->EmuIndexBuffer8; + return pXboxResource->EmuIndexBuffer8; } -XTL::IDirect3DVertexBuffer8 *GetHostVertexBuffer(XTL::X_D3DResource *pThis) +XTL::IDirect3DVertexBuffer8 *GetHostVertexBuffer(XTL::X_D3DResource *pXboxResource) { - if (pThis == NULL) + if (pXboxResource == NULL) return nullptr; - if (GetXboxResourceType(pThis) != X_D3DCOMMON_TYPE_VERTEXBUFFER) + if (GetXboxResourceType(pXboxResource) != X_D3DCOMMON_TYPE_VERTEXBUFFER) return nullptr; - return pThis->EmuVertexBuffer8; + return pXboxResource->EmuVertexBuffer8; } int GetD3DResourceRefCount(XTL::IDirect3DResource8 *EmuResource) From e9dff8cfcb7c021b5e4aa9012385eb0d638969db Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Sat, 22 Apr 2017 17:59:47 +0100 Subject: [PATCH 4/7] Introduced GetDataFromXboxResource --- src/CxbxKrnl/EmuD3D8.cpp | 58 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/src/CxbxKrnl/EmuD3D8.cpp b/src/CxbxKrnl/EmuD3D8.cpp index 3914866bf..2cde9c22a 100644 --- a/src/CxbxKrnl/EmuD3D8.cpp +++ b/src/CxbxKrnl/EmuD3D8.cpp @@ -337,6 +337,62 @@ XTL::IDirect3DVertexBuffer8 *GetHostVertexBuffer(XTL::X_D3DResource *pXboxResour return pXboxResource->EmuVertexBuffer8; } +void *GetDataFromXboxResource(XTL::X_D3DResource *pXboxResource) +{ + // Don't pass in unassigned Xbox resources + if(pXboxResource == NULL) + return nullptr; + + xbaddr pData = pXboxResource->Data; + if (pData == NULL) + return nullptr; + + if ((pXboxResource->Data & X_D3DRESOURCE_DATA_FLAG_SPECIAL) == X_D3DRESOURCE_DATA_FLAG_SPECIAL) + { + switch (pData) { + case X_D3DRESOURCE_DATA_BACK_BUFFER: + return nullptr; + case X_D3DRESOURCE_DATA_YUV_SURFACE: + // YUV surfaces are marked as such in the Data field, + // and their data is put in their Lock field :s + pData = pXboxResource->Lock; + // TODO : What about X_D3DRESOURCE_LOCK_FLAG_NOSIZE? + break; + case X_D3DRESOURCE_DATA_RENDER_TARGET: + return nullptr; + case X_D3DRESOURCE_DATA_DEPTH_STENCIL: + return nullptr; + case X_D3DRESOURCE_DATA_SURFACE_LEVEL: + return nullptr; + default: + CxbxKrnlCleanup("Unhandled special resource type"); + } + } + + DWORD Type = GetXboxResourceType(pXboxResource); + switch (Type) { + case X_D3DCOMMON_TYPE_VERTEXBUFFER: + break; + case X_D3DCOMMON_TYPE_INDEXBUFFER: + break; + case X_D3DCOMMON_TYPE_PUSHBUFFER: + break; + case X_D3DCOMMON_TYPE_PALETTE: + pData |= MM_SYSTEM_PHYSICAL_MAP; + break; + case X_D3DCOMMON_TYPE_TEXTURE: + break; + case X_D3DCOMMON_TYPE_SURFACE: + break; + case X_D3DCOMMON_TYPE_FIXUP: + break; + default: + CxbxKrnlCleanup("Unhandled resource type"); + } + + return (uint08*)pData; +} + int GetD3DResourceRefCount(XTL::IDirect3DResource8 *EmuResource) { if (EmuResource != nullptr) @@ -6166,7 +6222,7 @@ VOID WINAPI XTL::EMUPATCH(D3DDevice_UpdateOverlay) if (pSurface == NULL) { EmuWarning("pSurface == NULL!"); } else { - uint08 *pYUY2SourceBuffer = (uint08*)pSurface->Lock; // TODO : DxbxGetDataFromXboxResource(pSurface); + uint08 *pYUY2SourceBuffer = (uint08*)GetDataFromXboxResource(pSurface); RECT EmuSourRect; RECT EmuDestRect; From 0d47476dccd8ebe18c5aa014dfb0679c52ad0bff Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Sat, 22 Apr 2017 18:27:19 +0100 Subject: [PATCH 5/7] SetPalette now supports all 4 stages. Also constantified TEXTURE_STAGES --- src/CxbxKrnl/EmuD3D8.cpp | 45 ++++++++++++++++++------------------- src/CxbxKrnl/EmuD3D8.h | 2 +- src/CxbxKrnl/EmuD3D8Types.h | 4 +++- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/CxbxKrnl/EmuD3D8.cpp b/src/CxbxKrnl/EmuD3D8.cpp index 2cde9c22a..bf719b1eb 100644 --- a/src/CxbxKrnl/EmuD3D8.cpp +++ b/src/CxbxKrnl/EmuD3D8.cpp @@ -141,9 +141,9 @@ static DWORD g_dwVertexShaderUsage = 0; static DWORD g_VertexShaderSlots[136]; // cached palette pointer -static PVOID g_pCurrentPalette = nullptr; +static PVOID g_pCurrentPalette[TEXTURE_STAGES] = { nullptr, nullptr, nullptr, nullptr }; // cached palette size -static DWORD g_dwCurrentPaletteSize = -1; +static DWORD g_dwCurrentPaletteSize[TEXTURE_STAGES] = { -1, -1, -1, -1 }; static XTL::X_VERTEXSHADERCONSTANTMODE g_VertexShaderConstantMode = X_VSCM_192; @@ -151,7 +151,7 @@ static XTL::X_VERTEXSHADERCONSTANTMODE g_VertexShaderConstantMode = X_VSCM_192; XTL::X_D3DTILE XTL::EmuD3DTileCache[0x08] = {0}; // cached active texture -XTL::X_D3DPixelContainer *XTL::EmuD3DActiveTexture[4] = {0,0,0,0}; +XTL::X_D3DPixelContainer *XTL::EmuD3DActiveTexture[TEXTURE_STAGES] = {0,0,0,0}; // information passed to the create device proxy thread struct EmuD3D8CreateDeviceProxyData @@ -1416,7 +1416,7 @@ static void EmuAdjustPower2(UINT *dwWidth, UINT *dwHeight) // Derived from EmuUnswizzleActiveTexture static void EmuUnswizzleTextureStages() { - for( int i = 0; i < 4; i++ ) + for( int i = 0; i < TEXTURE_STAGES; i++ ) { // for current usages, we're always on stage 0 XTL::X_D3DPixelContainer *pPixelContainer = XTL::EmuD3DActiveTexture[i]; @@ -3785,9 +3785,9 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_SetTexture) } /* - static IDirect3DTexture8 *pDummyTexture[4] = {0, 0, 0, 0}; + static IDirect3DTexture8 *pDummyTexture[TEXTURE_STAGES] = {nullptr, nullptr, nullptr, nullptr}; - if(pDummyTexture[Stage] == 0) + if(pDummyTexture[Stage] == nullptr) { if(Stage == 0) { @@ -3839,10 +3839,10 @@ VOID __fastcall XTL::EMUPATCH(D3DDevice_SwitchTexture) ");\n", Method, Data, Format); - DWORD StageLookup[] = { 0x00081b00, 0x00081b40, 0x00081b80, 0x00081bc0 }; + DWORD StageLookup[TEXTURE_STAGES] = { 0x00081b00, 0x00081b40, 0x00081b80, 0x00081bc0 }; DWORD Stage = -1; - for(int v=0;v<4;v++) + for(int v=0;vLock = X_D3DRESOURCE_LOCK_FLAG_NOSIZE; } - g_pCurrentPalette = pBase; - g_dwCurrentPaletteSize = dwSize; + g_pCurrentPalette[TextureStage] = pBase; + g_dwCurrentPaletteSize[TextureStage] = dwSize; pResource->Data = (DWORD)pBase; } @@ -8479,22 +8481,19 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_SetPalette) ");\n", Stage, pPalette); -// g_pD3DDevice8->SetPaletteEntries(0, (PALETTEENTRY*)pPalette->Data); + // g_pD3DDevice9->SetPaletteEntries(Stage?, (PALETTEENTRY*)pPalette->Data); + // g_pD3DDevice9->SetCurrentTexturePalette(Stage, Stage); - // Cache palette data and size - if( pPalette ) + if (Stage < TEXTURE_STAGES) { - if( pPalette->Data ) - { - g_pCurrentPalette = (LPVOID) pPalette->Data; - g_dwCurrentPaletteSize = g_MemoryManager.QueryAllocationSize((LPVOID)pPalette->Data); + // Cache palette data and size + g_pCurrentPalette[Stage] = GetDataFromXboxResource(pPalette); + if (g_pCurrentPalette[Stage] != NULL) + g_dwCurrentPaletteSize[Stage] = g_MemoryManager.QueryAllocationSize((LPVOID)g_pCurrentPalette); + else { + g_dwCurrentPaletteSize[Stage] = 0; } } - - EmuWarning("Not setting palette"); - - - return D3D_OK; } diff --git a/src/CxbxKrnl/EmuD3D8.h b/src/CxbxKrnl/EmuD3D8.h index d5971c98f..1da155478 100644 --- a/src/CxbxKrnl/EmuD3D8.h +++ b/src/CxbxKrnl/EmuD3D8.h @@ -67,7 +67,7 @@ extern VOID EmuD3DCleanup(); extern X_D3DTILE EmuD3DTileCache[0x08]; // EmuD3DActiveTexture -extern X_D3DPixelContainer *EmuD3DActiveTexture[4]; +extern X_D3DPixelContainer *EmuD3DActiveTexture[TEXTURE_STAGES]; // ****************************************************************** // * patch: Direct3D_CreateDevice diff --git a/src/CxbxKrnl/EmuD3D8Types.h b/src/CxbxKrnl/EmuD3D8Types.h index 320d3efb2..46cd88793 100644 --- a/src/CxbxKrnl/EmuD3D8Types.h +++ b/src/CxbxKrnl/EmuD3D8Types.h @@ -241,6 +241,8 @@ X_D3DRESOURCETYPE; #define X_D3DTEXTURE_PITCH_ALIGNMENT X_D3D_RENDER_MEMORY_ALIGNMENT #define X_D3DTEXTURE_PITCH_MIN X_D3DTEXTURE_PITCH_ALIGNMENT +#define TEXTURE_STAGES 4 // X_D3DTS_STAGECOUNT + typedef enum _X_D3DSET_DEPTH_CLIP_PLANES_FLAGS { X_D3DSDCP_SET_VERTEXPROGRAM_PLANES = 1, @@ -373,7 +375,7 @@ typedef struct _PixelShader_ DWORD dwStatus; X_D3DPIXELSHADERDEF PSDef; - DWORD dwStageMap[4]; + DWORD dwStageMap[TEXTURE_STAGES]; } PIXEL_SHADER; From dcccb1920e4681f3979148e0335cc86bdc5aae1f Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Sat, 22 Apr 2017 18:27:19 +0100 Subject: [PATCH 6/7] SetPalette now supports all 4 stages. Also constantified TEXTURE_STAGES --- src/CxbxKrnl/EmuD3D8.cpp | 45 ++++++++++++++++++------------------- src/CxbxKrnl/EmuD3D8.h | 2 +- src/CxbxKrnl/EmuD3D8Types.h | 4 +++- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/CxbxKrnl/EmuD3D8.cpp b/src/CxbxKrnl/EmuD3D8.cpp index 2cde9c22a..83903e7b2 100644 --- a/src/CxbxKrnl/EmuD3D8.cpp +++ b/src/CxbxKrnl/EmuD3D8.cpp @@ -141,9 +141,9 @@ static DWORD g_dwVertexShaderUsage = 0; static DWORD g_VertexShaderSlots[136]; // cached palette pointer -static PVOID g_pCurrentPalette = nullptr; +static PVOID g_pCurrentPalette[TEXTURE_STAGES] = { nullptr, nullptr, nullptr, nullptr }; // cached palette size -static DWORD g_dwCurrentPaletteSize = -1; +static DWORD g_dwCurrentPaletteSize[TEXTURE_STAGES] = { -1, -1, -1, -1 }; static XTL::X_VERTEXSHADERCONSTANTMODE g_VertexShaderConstantMode = X_VSCM_192; @@ -151,7 +151,7 @@ static XTL::X_VERTEXSHADERCONSTANTMODE g_VertexShaderConstantMode = X_VSCM_192; XTL::X_D3DTILE XTL::EmuD3DTileCache[0x08] = {0}; // cached active texture -XTL::X_D3DPixelContainer *XTL::EmuD3DActiveTexture[4] = {0,0,0,0}; +XTL::X_D3DPixelContainer *XTL::EmuD3DActiveTexture[TEXTURE_STAGES] = {0,0,0,0}; // information passed to the create device proxy thread struct EmuD3D8CreateDeviceProxyData @@ -1416,7 +1416,7 @@ static void EmuAdjustPower2(UINT *dwWidth, UINT *dwHeight) // Derived from EmuUnswizzleActiveTexture static void EmuUnswizzleTextureStages() { - for( int i = 0; i < 4; i++ ) + for( int i = 0; i < TEXTURE_STAGES; i++ ) { // for current usages, we're always on stage 0 XTL::X_D3DPixelContainer *pPixelContainer = XTL::EmuD3DActiveTexture[i]; @@ -3785,9 +3785,9 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_SetTexture) } /* - static IDirect3DTexture8 *pDummyTexture[4] = {0, 0, 0, 0}; + static IDirect3DTexture8 *pDummyTexture[TEXTURE_STAGES] = {nullptr, nullptr, nullptr, nullptr}; - if(pDummyTexture[Stage] == 0) + if(pDummyTexture[Stage] == nullptr) { if(Stage == 0) { @@ -3839,10 +3839,10 @@ VOID __fastcall XTL::EMUPATCH(D3DDevice_SwitchTexture) ");\n", Method, Data, Format); - DWORD StageLookup[] = { 0x00081b00, 0x00081b40, 0x00081b80, 0x00081bc0 }; + DWORD StageLookup[TEXTURE_STAGES] = { 0x00081b00, 0x00081b40, 0x00081b80, 0x00081bc0 }; DWORD Stage = -1; - for(int v=0;v<4;v++) + for(int v=0;vLock = X_D3DRESOURCE_LOCK_FLAG_NOSIZE; } - g_pCurrentPalette = pBase; - g_dwCurrentPaletteSize = dwSize; + g_pCurrentPalette[TextureStage] = pBase; + g_dwCurrentPaletteSize[TextureStage] = dwSize; pResource->Data = (DWORD)pBase; } @@ -8479,22 +8481,19 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_SetPalette) ");\n", Stage, pPalette); -// g_pD3DDevice8->SetPaletteEntries(0, (PALETTEENTRY*)pPalette->Data); + // g_pD3DDevice9->SetPaletteEntries(Stage?, (PALETTEENTRY*)pPalette->Data); + // g_pD3DDevice9->SetCurrentTexturePalette(Stage, Stage); - // Cache palette data and size - if( pPalette ) + if (Stage < TEXTURE_STAGES) { - if( pPalette->Data ) - { - g_pCurrentPalette = (LPVOID) pPalette->Data; - g_dwCurrentPaletteSize = g_MemoryManager.QueryAllocationSize((LPVOID)pPalette->Data); + // Cache palette data and size + g_pCurrentPalette[Stage] = GetDataFromXboxResource(pPalette); + if (g_pCurrentPalette[Stage] != NULL) + g_dwCurrentPaletteSize[Stage] = g_MemoryManager.QueryAllocationSize((LPVOID)g_pCurrentPalette[Stage]); + else { + g_dwCurrentPaletteSize[Stage] = 0; } } - - EmuWarning("Not setting palette"); - - - return D3D_OK; } diff --git a/src/CxbxKrnl/EmuD3D8.h b/src/CxbxKrnl/EmuD3D8.h index d5971c98f..1da155478 100644 --- a/src/CxbxKrnl/EmuD3D8.h +++ b/src/CxbxKrnl/EmuD3D8.h @@ -67,7 +67,7 @@ extern VOID EmuD3DCleanup(); extern X_D3DTILE EmuD3DTileCache[0x08]; // EmuD3DActiveTexture -extern X_D3DPixelContainer *EmuD3DActiveTexture[4]; +extern X_D3DPixelContainer *EmuD3DActiveTexture[TEXTURE_STAGES]; // ****************************************************************** // * patch: Direct3D_CreateDevice diff --git a/src/CxbxKrnl/EmuD3D8Types.h b/src/CxbxKrnl/EmuD3D8Types.h index 320d3efb2..46cd88793 100644 --- a/src/CxbxKrnl/EmuD3D8Types.h +++ b/src/CxbxKrnl/EmuD3D8Types.h @@ -241,6 +241,8 @@ X_D3DRESOURCETYPE; #define X_D3DTEXTURE_PITCH_ALIGNMENT X_D3D_RENDER_MEMORY_ALIGNMENT #define X_D3DTEXTURE_PITCH_MIN X_D3DTEXTURE_PITCH_ALIGNMENT +#define TEXTURE_STAGES 4 // X_D3DTS_STAGECOUNT + typedef enum _X_D3DSET_DEPTH_CLIP_PLANES_FLAGS { X_D3DSDCP_SET_VERTEXPROGRAM_PLANES = 1, @@ -373,7 +375,7 @@ typedef struct _PixelShader_ DWORD dwStatus; X_D3DPIXELSHADERDEF PSDef; - DWORD dwStageMap[4]; + DWORD dwStageMap[TEXTURE_STAGES]; } PIXEL_SHADER; From 1a1c2be357bd7b5d7d18fbc7187a273ab04fbc4c Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Sat, 22 Apr 2017 23:53:18 +0100 Subject: [PATCH 7/7] revert --- src/CxbxKrnl/EmuD3D8/VertexBuffer.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/CxbxKrnl/EmuD3D8/VertexBuffer.cpp b/src/CxbxKrnl/EmuD3D8/VertexBuffer.cpp index 79e17a8e7..b7bd6ebb9 100644 --- a/src/CxbxKrnl/EmuD3D8/VertexBuffer.cpp +++ b/src/CxbxKrnl/EmuD3D8/VertexBuffer.cpp @@ -530,6 +530,7 @@ bool XTL::VertexPatcher::PatchStream(VertexPatchDesc *pPatchDesc, break; } case X_D3DVSDT_PBYTE4: { // 0x44: // Make it FLOAT4 + // Hit by Jet Set Radio Future ((FLOAT *)pNewDataPos)[0] = ((FLOAT)((BYTE*)pOrigVertex)[0]) / 255.0f; ((FLOAT *)pNewDataPos)[1] = ((FLOAT)((BYTE*)pOrigVertex)[1]) / 255.0f; ((FLOAT *)pNewDataPos)[2] = ((FLOAT)((BYTE*)pOrigVertex)[2]) / 255.0f; @@ -564,9 +565,9 @@ bool XTL::VertexPatcher::PatchStream(VertexPatchDesc *pPatchDesc, #if !DXBX_USE_D3D9 // No need for patching in D3D9 case X_D3DVSDT_NORMSHORT4: { // 0x41: // Make it FLOAT4 // UNTESTED - Need test-case! - ((FLOAT *)pNewDataPos)[2] = ((FLOAT)((SHORT*)pOrigVertex)[0]) / 32767.0f; + ((FLOAT *)pNewDataPos)[0] = ((FLOAT)((SHORT*)pOrigVertex)[0]) / 32767.0f; ((FLOAT *)pNewDataPos)[1] = ((FLOAT)((SHORT*)pOrigVertex)[1]) / 32767.0f; - ((FLOAT *)pNewDataPos)[0] = ((FLOAT)((SHORT*)pOrigVertex)[2]) / 32767.0f; + ((FLOAT *)pNewDataPos)[2] = ((FLOAT)((SHORT*)pOrigVertex)[2]) / 32767.0f; ((FLOAT *)pNewDataPos)[3] = ((FLOAT)((SHORT*)pOrigVertex)[3]) / 32767.0f; pOrigVertex += 4 * sizeof(SHORT); break;