Skip to content

Commit

Permalink
[d3d8] refcount refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
WinterSnowfall committed Mar 22, 2023
1 parent 2c56a1a commit ccbc5e4
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 19 deletions.
2 changes: 1 addition & 1 deletion src/d3d8/d3d8_blit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ namespace dxvk {
case D3DPOOL_SYSTEMMEM: {

// RT (DEFAULT) -> SYSTEMMEM: Use GetRenderTargetData as fast path if possible
if ((srcDesc.Usage & D3DUSAGE_RENDERTARGET || m_renderTarget == src)) {
if ((srcDesc.Usage & D3DUSAGE_RENDERTARGET || m_renderTarget.ptr() == src.ptr())) {

// GetRenderTargetData works if the formats and sizes match
if (srcDesc.MultiSampleType == d3d9::D3DMULTISAMPLE_NONE
Expand Down
55 changes: 38 additions & 17 deletions src/d3d8/d3d8_device.h
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ namespace dxvk {

if (FAILED(res)) return res;

m_backBuffers[iBackBuffer] = ref(new D3D8Surface(this, std::move(pSurface9)));
m_backBuffers[iBackBuffer] = new D3D8Surface(this, std::move(pSurface9));
*ppBackBuffer = m_backBuffers[iBackBuffer].ref();

return res;
Expand Down Expand Up @@ -368,21 +368,42 @@ namespace dxvk {

if (pRenderTarget != NULL) {
D3D8Surface* surf = static_cast<D3D8Surface*>(pRenderTarget);
res = GetD3D9()->SetRenderTarget(0, surf->GetD3D9());

if (FAILED(res)) return res;
D3DSURFACE_DESC rtDesc;
surf->GetDesc(&rtDesc);

if (unlikely(!(rtDesc.Usage & D3DUSAGE_RENDERTARGET)))
return D3DERR_INVALIDCALL;

if(likely(m_renderTarget.ptr() != surf)) {
res = GetD3D9()->SetRenderTarget(0, surf->GetD3D9());

m_renderTarget = ref(surf);
if (FAILED(res)) return res;

m_renderTarget = surf;
}
}

// SetDepthStencilSurface is a separate call
D3D8Surface* zStencil = static_cast<D3D8Surface*>(pNewZStencil);
res = GetD3D9()->SetDepthStencilSurface(D3D8Surface::GetD3D9Nullable(zStencil));

if (FAILED(res)) return res;
if(pNewZStencil != NULL) {
D3DSURFACE_DESC zsDesc;
zStencil->GetDesc(&zsDesc);

m_depthStencil = ref(zStencil);
return res;
if (unlikely(!(zsDesc.Usage & D3DUSAGE_DEPTHSTENCIL)))
return D3DERR_INVALIDCALL;
}

if(likely(m_depthStencil.ptr() != zStencil)) {
res = GetD3D9()->SetDepthStencilSurface(D3D8Surface::GetD3D9Nullable(zStencil));

if (FAILED(res)) return res;

m_depthStencil = zStencil;
}

return D3D_OK;
}

HRESULT STDMETHODCALLTYPE GetRenderTarget(IDirect3DSurface8** ppRenderTarget) {
Expand All @@ -391,7 +412,7 @@ namespace dxvk {
Com<d3d9::IDirect3DSurface9> pRT9 = nullptr;
HRESULT res = GetD3D9()->GetRenderTarget(0, &pRT9); // use RT index 0

m_renderTarget = ref(new D3D8Surface(this, std::move(pRT9)));
m_renderTarget = new D3D8Surface(this, std::move(pRT9));

*ppRenderTarget = m_renderTarget.ref();
return res;
Expand All @@ -407,7 +428,7 @@ namespace dxvk {
Com<d3d9::IDirect3DSurface9> pStencil9 = nullptr;
HRESULT res = GetD3D9()->GetDepthStencilSurface(&pStencil9);

m_depthStencil = ref(new D3D8Surface(this, std::move(pStencil9)));
m_depthStencil = new D3D8Surface(this, std::move(pStencil9));

*ppZStencilSurface = m_depthStencil.ref();
return res;
Expand Down Expand Up @@ -567,7 +588,7 @@ namespace dxvk {

D3D8Texture2D* tex = static_cast<D3D8Texture2D*>(pTexture);

m_textures[Stage] = ref(tex);
m_textures[Stage] = tex;

return GetD3D9()->SetTexture(Stage, D3D8Texture2D::GetD3D9Nullable(tex));
}
Expand Down Expand Up @@ -849,22 +870,22 @@ namespace dxvk {
D3D8StateBlock* m_recorder = nullptr;

struct D3D8VBO {
Com<D3D8VertexBuffer> buffer = nullptr;
UINT stride = 0;
Com<D3D8VertexBuffer, false> buffer = nullptr;
UINT stride = 0;
};

// Remember to fill() these in the constructor!
std::array<Com<IDirect3DBaseTexture8>, d8caps::MAX_TEXTURE_STAGES> m_textures;
std::array<Com<D3D8Texture2D, false>, d8caps::MAX_TEXTURE_STAGES> m_textures;
std::array<D3D8VBO, d8caps::MAX_STREAMS> m_streams;

Com<D3D8IndexBuffer> m_indices;
INT m_baseVertexIndex = 0;
Com<D3D8IndexBuffer, false> m_indices;
INT m_baseVertexIndex = 0;

// TODO: Which of these should be a private ref
std::vector<Com<D3D8Surface, false>> m_backBuffers;
Com<D3D8Surface> m_frontBuffer;

Com<D3D8Surface> m_renderTarget;
Com<D3D8Surface, false> m_renderTarget;
Com<D3D8Surface, false> m_depthStencil;

std::vector<D3D8VertexShaderInfo> m_vertexShaders;
Expand Down
2 changes: 1 addition & 1 deletion src/d3d8/d3d8_texture.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ namespace dxvk {
return ptr;
}

std::vector<Com<SubresourceType>> m_subresources;
std::vector<Com<SubresourceType, false>> m_subresources;

};

Expand Down

0 comments on commit ccbc5e4

Please sign in to comment.