1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-22 07:54:15 +01:00

[d3d8] Clean up D3D9 shaders on D3D8 device release

This commit is contained in:
WinterSnowfall 2024-09-10 15:35:02 +03:00 committed by Philip Rebohle
parent 010738c107
commit 5cf0783edb
2 changed files with 18 additions and 23 deletions

View File

@ -25,10 +25,10 @@ namespace dxvk {
} }
struct D3D8VertexShaderInfo { struct D3D8VertexShaderInfo {
d3d9::IDirect3DVertexDeclaration9* pVertexDecl = nullptr; Com<d3d9::IDirect3DVertexDeclaration9> pVertexDecl;
d3d9::IDirect3DVertexShader9* pVertexShader = nullptr; Com<d3d9::IDirect3DVertexShader9> pVertexShader;
std::vector<DWORD> declaration; std::vector<DWORD> declaration;
std::vector<DWORD> function; std::vector<DWORD> function;
}; };
D3D8Device::D3D8Device( D3D8Device::D3D8Device(
@ -72,7 +72,7 @@ namespace dxvk {
return D3DERR_INVALIDCALL; return D3DERR_INVALIDCALL;
HRESULT res; HRESULT res;
d3d9::IDirect3DQuery9* pQuery = nullptr; Com<d3d9::IDirect3DQuery9> pQuery;
switch (DevInfoID) { switch (DevInfoID) {
// pre-D3D8 queries // pre-D3D8 queries
@ -133,19 +133,16 @@ namespace dxvk {
res = pQuery->GetData(pDevInfoStruct, DevInfoStructSize, D3DGETDATA_FLUSH); res = pQuery->GetData(pDevInfoStruct, DevInfoStructSize, D3DGETDATA_FLUSH);
done: done:
if (pQuery != nullptr)
pQuery->Release();
if (unlikely(FAILED(res))) { if (unlikely(FAILED(res))) {
if (res == D3DERR_NOTAVAILABLE) // unsupported if (res == D3DERR_NOTAVAILABLE) // unsupported
return E_FAIL; return E_FAIL;
else // any unknown error else // any unknown error
return S_FALSE; return S_FALSE;
} }
return res; return res;
} }
HRESULT STDMETHODCALLTYPE D3D8Device::TestCooperativeLevel() { HRESULT STDMETHODCALLTYPE D3D8Device::TestCooperativeLevel() {
// Equivalent of D3D11/DXGI present tests. // Equivalent of D3D11/DXGI present tests.
return GetD3D9()->TestCooperativeLevel(); return GetD3D9()->TestCooperativeLevel();
@ -1609,7 +1606,7 @@ namespace dxvk {
D3D8VertexShaderInfo& info = device->m_vertexShaders[Handle]; D3D8VertexShaderInfo& info = device->m_vertexShaders[Handle];
if (unlikely(!info.pVertexDecl && !info.pVertexShader)) { if (unlikely(info.pVertexDecl == nullptr && info.pVertexShader == nullptr)) {
Logger::debug(str::format("getVertexShaderInfo: Application provided deleted vertex shader ", std::hex, Handle)); Logger::debug(str::format("getVertexShaderInfo: Application provided deleted vertex shader ", std::hex, Handle));
return nullptr; return nullptr;
} }
@ -1634,8 +1631,8 @@ namespace dxvk {
StateChange(); StateChange();
GetD3D9()->SetVertexDeclaration(info->pVertexDecl); GetD3D9()->SetVertexDeclaration(info->pVertexDecl.ptr());
res = GetD3D9()->SetVertexShader(info->pVertexShader); res = GetD3D9()->SetVertexShader(info->pVertexShader.ptr());
if (likely(SUCCEEDED(res))) { if (likely(SUCCEEDED(res))) {
// Cache current shader // Cache current shader
@ -1701,10 +1698,10 @@ namespace dxvk {
if (!info) if (!info)
return D3DERR_INVALIDCALL; return D3DERR_INVALIDCALL;
if (info->pVertexDecl) if (info->pVertexDecl != nullptr)
info->pVertexDecl->Release(); info->pVertexDecl = nullptr;
if (info->pVertexShader) if (info->pVertexShader != nullptr)
info->pVertexShader->Release(); info->pVertexShader = nullptr;
info->declaration.clear(); info->declaration.clear();
info->function.clear(); info->function.clear();
@ -1795,7 +1792,7 @@ namespace dxvk {
return nullptr; return nullptr;
} }
d3d9::IDirect3DPixelShader9* pPixelShader = device->m_pixelShaders[Handle]; d3d9::IDirect3DPixelShader9* pPixelShader = device->m_pixelShaders[Handle].ptr();
if (unlikely(pPixelShader == nullptr)) { if (unlikely(pPixelShader == nullptr)) {
Logger::debug(str::format("getPixelShaderPtr: Application provided deleted pixel shader ", std::hex, Handle)); Logger::debug(str::format("getPixelShaderPtr: Application provided deleted pixel shader ", std::hex, Handle));
@ -1850,8 +1847,6 @@ namespace dxvk {
return D3DERR_INVALIDCALL; return D3DERR_INVALIDCALL;
} }
pPixelShader->Release();
m_pixelShaders[getShaderIndex(Handle)] = nullptr; m_pixelShaders[getShaderIndex(Handle)] = nullptr;
return D3D_OK; return D3D_OK;

View File

@ -441,10 +441,10 @@ namespace dxvk {
Com<D3D8Surface, false> m_renderTarget; Com<D3D8Surface, false> m_renderTarget;
Com<D3D8Surface, false> m_depthStencil; Com<D3D8Surface, false> m_depthStencil;
std::vector<D3D8VertexShaderInfo> m_vertexShaders; std::vector<D3D8VertexShaderInfo> m_vertexShaders;
std::vector<d3d9::IDirect3DPixelShader9*> m_pixelShaders; std::vector<Com<d3d9::IDirect3DPixelShader9>> m_pixelShaders;
DWORD m_currentVertexShader = 0; // can be FVF or vs index (marked by D3DFVF_RESERVED0) DWORD m_currentVertexShader = 0; // can be FVF or vs index (marked by D3DFVF_RESERVED0)
DWORD m_currentPixelShader = 0; DWORD m_currentPixelShader = 0;
D3DDEVTYPE m_deviceType; D3DDEVTYPE m_deviceType;
HWND m_window; HWND m_window;