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:
parent
010738c107
commit
5cf0783edb
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user