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

View File

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