Skip to content

Commit

Permalink
Fix reference count and palette flag for Need For Speed III
Browse files Browse the repository at this point in the history
- Call `AddRef()` for each get surface and texture request to fix
reference count
- Set peFlags to PC_NOCOLLAPSE for SetPaletteEntries and
SetCurrentTexturePalette
  • Loading branch information
elishacloud committed Jul 1, 2017
1 parent 9300faa commit 7d64f1a
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 1 deletion.
9 changes: 9 additions & 0 deletions source/d3d8to9_device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,7 @@ HRESULT STDMETHODCALLTYPE Direct3DDevice8::GetBackBuffer(UINT iBackBuffer, D3DBA
}

*ppBackBuffer = new Direct3DSurface8(this, SurfaceInterface);
(*ppBackBuffer)->AddRef();

return D3D_OK;
}
Expand Down Expand Up @@ -574,6 +575,7 @@ HRESULT STDMETHODCALLTYPE Direct3DDevice8::CopyRects(Direct3DSurface8 *pSourceSu
{
if (D3DXLoadSurfaceFromSurface != nullptr)
{
LOG << "called D3DXLoadSurfaceFromSurface\n";
hr = D3DXLoadSurfaceFromSurface(pDestinationSurface->GetProxyInterface(), nullptr, &DestinationRect, pSourceSurface->GetProxyInterface(), nullptr, &SourceRect, D3DX_FILTER_NONE, 0);
}
else
Expand Down Expand Up @@ -933,14 +935,17 @@ HRESULT STDMETHODCALLTYPE Direct3DDevice8::GetTexture(DWORD Stage, Direct3DBaseT
case D3DRTYPE_TEXTURE:
BaseTextureInterface->QueryInterface(IID_PPV_ARGS(&TextureInterface));
*ppTexture = new Direct3DTexture8(this, TextureInterface);
(*ppTexture)->AddRef();
break;
case D3DRTYPE_VOLUMETEXTURE:
BaseTextureInterface->QueryInterface(IID_PPV_ARGS(&VolumeTextureInterface));
*ppTexture = new Direct3DVolumeTexture8(this, VolumeTextureInterface);
(*ppTexture)->AddRef();
break;
case D3DRTYPE_CUBETEXTURE:
BaseTextureInterface->QueryInterface(IID_PPV_ARGS(&CubeTextureInterface));
*ppTexture = new Direct3DCubeTexture8(this, CubeTextureInterface);
(*ppTexture)->AddRef();
break;
default:
BaseTextureInterface->Release();
Expand Down Expand Up @@ -1052,6 +1057,7 @@ HRESULT STDMETHODCALLTYPE Direct3DDevice8::GetInfo(DWORD DevInfoID, void *pDevIn
}
HRESULT STDMETHODCALLTYPE Direct3DDevice8::SetPaletteEntries(UINT PaletteNumber, const PALETTEENTRY *pEntries)
{
PaletteNumber = (PaletteNumber & 0xFFF) | (PC_NOCOLLAPSE << 12);
return ProxyInterface->SetPaletteEntries(PaletteNumber, pEntries);
}
HRESULT STDMETHODCALLTYPE Direct3DDevice8::GetPaletteEntries(UINT PaletteNumber, PALETTEENTRY *pEntries)
Expand All @@ -1060,6 +1066,7 @@ HRESULT STDMETHODCALLTYPE Direct3DDevice8::GetPaletteEntries(UINT PaletteNumber,
}
HRESULT STDMETHODCALLTYPE Direct3DDevice8::SetCurrentTexturePalette(UINT PaletteNumber)
{
PaletteNumber = (PaletteNumber & 0xFFF) | (PC_NOCOLLAPSE << 12);
return ProxyInterface->SetCurrentTexturePalette(PaletteNumber);
}
HRESULT STDMETHODCALLTYPE Direct3DDevice8::GetCurrentTexturePalette(UINT *pPaletteNumber)
Expand Down Expand Up @@ -1626,6 +1633,7 @@ HRESULT STDMETHODCALLTYPE Direct3DDevice8::GetStreamSource(UINT StreamNumber, Di
if (VertexBufferInterface != nullptr)
{
*ppStreamData = new Direct3DVertexBuffer8(this, VertexBufferInterface);
(*ppStreamData)->AddRef();
}

return D3D_OK;
Expand Down Expand Up @@ -1667,6 +1675,7 @@ HRESULT STDMETHODCALLTYPE Direct3DDevice8::GetIndices(Direct3DIndexBuffer8 **ppI
if (IntexBufferInterface != nullptr)
{
*ppIndexData = new Direct3DIndexBuffer8(this, IntexBufferInterface);
(*ppIndexData)->AddRef();
}

return D3D_OK;
Expand Down
1 change: 1 addition & 0 deletions source/d3d8to9_swap_chain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ HRESULT STDMETHODCALLTYPE Direct3DSwapChain8::GetBackBuffer(UINT iBackBuffer, D3
}

*ppBackBuffer = new Direct3DSurface8(Device, SurfaceInterface);
(*ppBackBuffer)->AddRef();

return D3D_OK;
}
5 changes: 4 additions & 1 deletion source/d3d8to9_texture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ HRESULT STDMETHODCALLTYPE Direct3DTexture8::GetSurfaceLevel(UINT Level, Direct3D
}

*ppSurfaceLevel = new Direct3DSurface8(Device, SurfaceInterface);
(*ppSurfaceLevel)->AddRef();

return D3D_OK;
}
Expand Down Expand Up @@ -307,7 +308,8 @@ HRESULT STDMETHODCALLTYPE Direct3DCubeTexture8::GetCubeMapSurface(D3DCUBEMAP_FAC
return hr;
}

*ppCubeMapSurface = new Direct3DSurface8(Device, SurfaceInterface);;
*ppCubeMapSurface = new Direct3DSurface8(Device, SurfaceInterface);
(*ppCubeMapSurface)->AddRef();

return D3D_OK;
}
Expand Down Expand Up @@ -468,6 +470,7 @@ HRESULT STDMETHODCALLTYPE Direct3DVolumeTexture8::GetVolumeLevel(UINT Level, Dir
}

*ppVolumeLevel = new Direct3DVolume8(Device, VolumeInterface);
(*ppVolumeLevel)->AddRef();

return D3D_OK;
}
Expand Down

0 comments on commit 7d64f1a

Please sign in to comment.