diff options
author | Joshua Ashton <joshua@froggi.es> | 2020-02-29 01:29:01 +0300 |
---|---|---|
committer | Joshua Ashton <joshua@froggi.es> | 2020-02-29 01:29:01 +0300 |
commit | fb8852a656c0414ad2f9c2bfcee3fb1240cb03f2 (patch) | |
tree | a0303ed9d5b880803afcbb9d8992c75e8c764471 | |
parent | c05b5a99e106641c4263843e03dc9e401db83b82 (diff) |
[d3d9] Implement GetContainer for swapchain surfacesd3d9-container-swapchain
-rw-r--r-- | src/d3d9/d3d9_subresource.h | 6 | ||||
-rw-r--r-- | src/d3d9/d3d9_surface.cpp | 66 | ||||
-rw-r--r-- | src/d3d9/d3d9_surface.h | 16 | ||||
-rw-r--r-- | src/d3d9/d3d9_swapchain.cpp | 2 | ||||
-rw-r--r-- | src/d3d9/d3d9_volume.cpp | 8 |
5 files changed, 66 insertions, 32 deletions
diff --git a/src/d3d9/d3d9_subresource.h b/src/d3d9/d3d9_subresource.h index 2d2c981b..0d57c155 100644 --- a/src/d3d9/d3d9_subresource.h +++ b/src/d3d9/d3d9_subresource.h @@ -15,7 +15,7 @@ namespace dxvk { D3D9CommonTexture* pTexture, UINT Face, UINT MipLevel, - IDirect3DBaseTexture9* pContainer) + IUnknown* pContainer) : D3D9Resource<Type...> ( pDevice ) , m_container ( pContainer ) , m_texture ( pTexture ) @@ -108,7 +108,7 @@ namespace dxvk { } IDirect3DBaseTexture9* GetBaseTexture() { - return m_container; + return static_cast<IDirect3DBaseTexture9*>(m_container); } void Swap(D3D9Subresource* Other) { @@ -121,7 +121,7 @@ namespace dxvk { protected: - IDirect3DBaseTexture9* m_container; + IUnknown* m_container; D3D9CommonTexture* m_texture; UINT m_face; diff --git a/src/d3d9/d3d9_surface.cpp b/src/d3d9/d3d9_surface.cpp index f4189d5d..f903e73e 100644 --- a/src/d3d9/d3d9_surface.cpp +++ b/src/d3d9/d3d9_surface.cpp @@ -2,57 +2,79 @@ #include "d3d9_texture.h" #include "d3d9_device.h" +#include "d3d9_swapchain.h" namespace dxvk { D3D9Surface::D3D9Surface( D3D9DeviceEx* pDevice, - const D3D9_COMMON_TEXTURE_DESC* pDesc) + const D3D9_COMMON_TEXTURE_DESC* pDesc, + IUnknown* pContainer, + D3D9SurfaceContainerType ContainerType) : D3D9SurfaceBase( pDevice, new D3D9CommonTexture( pDevice, pDesc, D3DRTYPE_TEXTURE), 0, 0, - nullptr) { } + pContainer) + , m_containerType (ContainerType) { } D3D9Surface::D3D9Surface( D3D9DeviceEx* pDevice, D3D9CommonTexture* pTexture, UINT Face, UINT MipLevel, - IDirect3DBaseTexture9* pContainer) + IUnknown* pContainer, + D3D9SurfaceContainerType ContainerType) : D3D9SurfaceBase( pDevice, pTexture, Face, MipLevel, - pContainer) { } + pContainer) + , m_containerType (ContainerType) { } void D3D9Surface::AddRefPrivate() { - IDirect3DBaseTexture9* pContainer = this->m_container; - - if (pContainer != nullptr) { - D3DRESOURCETYPE type = pContainer->GetType(); - if (type == D3DRTYPE_TEXTURE) - reinterpret_cast<D3D9Texture2D*> (pContainer)->AddRefPrivate(); - else //if (type == D3DRTYPE_CUBETEXTURE) - reinterpret_cast<D3D9TextureCube*>(pContainer)->AddRefPrivate(); + if (m_containerType == D3D9SurfaceContainerType::Texture) { + auto* pContainer = static_cast<IDirect3DBaseTexture9*>(this->m_container); + + if (pContainer != nullptr) { + D3DRESOURCETYPE type = pContainer->GetType(); + if (type == D3DRTYPE_TEXTURE) + reinterpret_cast<D3D9Texture2D*> (pContainer)->AddRefPrivate(); + else //if (type == D3DRTYPE_CUBETEXTURE) + reinterpret_cast<D3D9TextureCube*>(pContainer)->AddRefPrivate(); + + return; + } + } + else if (m_containerType == D3D9SurfaceContainerType::Swapchain) { + auto* pContainer = static_cast<D3D9SwapChainEx*>(this->m_container); - return; + if (pContainer != nullptr) + pContainer->AddRefPrivate(); } D3D9SurfaceBase::AddRefPrivate(); } void D3D9Surface::ReleasePrivate() { - IDirect3DBaseTexture9* pContainer = this->m_container; - - if (pContainer != nullptr) { - D3DRESOURCETYPE type = pContainer->GetType(); - if (type == D3DRTYPE_TEXTURE) - reinterpret_cast<D3D9Texture2D*> (pContainer)->ReleasePrivate(); - else //if (type == D3DRTYPE_CUBETEXTURE) - reinterpret_cast<D3D9TextureCube*>(pContainer)->ReleasePrivate(); + if (m_containerType == D3D9SurfaceContainerType::Texture) { + auto* pContainer = static_cast<IDirect3DBaseTexture9*>(this->m_container); + + if (pContainer != nullptr) { + D3DRESOURCETYPE type = pContainer->GetType(); + if (type == D3DRTYPE_TEXTURE) + reinterpret_cast<D3D9Texture2D*> (pContainer)->ReleasePrivate(); + else //if (type == D3DRTYPE_CUBETEXTURE) + reinterpret_cast<D3D9TextureCube*>(pContainer)->ReleasePrivate(); + + return; + } + } + else if (m_containerType == D3D9SurfaceContainerType::Swapchain) { + auto* pContainer = static_cast<D3D9SwapChainEx*>(this->m_container); - return; + if (pContainer != nullptr) + pContainer->ReleasePrivate(); } D3D9SurfaceBase::ReleasePrivate(); diff --git a/src/d3d9/d3d9_surface.h b/src/d3d9/d3d9_surface.h index 6e68bbae..c72f1ce9 100644 --- a/src/d3d9/d3d9_surface.h +++ b/src/d3d9/d3d9_surface.h @@ -10,6 +10,13 @@ namespace dxvk { + // The Surface's container may be a swapchain unlike our + // other subresource types... + enum class D3D9SurfaceContainerType { + Texture, + Swapchain + }; + using D3D9GDIDesc = D3DKMT_DESTROYDCFROMMEMORY; using D3D9SurfaceBase = D3D9Subresource<IDirect3DSurface9>; @@ -19,14 +26,17 @@ namespace dxvk { D3D9Surface( D3D9DeviceEx* pDevice, - const D3D9_COMMON_TEXTURE_DESC* pDesc); + const D3D9_COMMON_TEXTURE_DESC* pDesc, + IUnknown* pContainer = nullptr, + D3D9SurfaceContainerType ContainerType = D3D9SurfaceContainerType::Texture); D3D9Surface( D3D9DeviceEx* pDevice, D3D9CommonTexture* pTexture, UINT Face, UINT MipLevel, - IDirect3DBaseTexture9* pContainer); + IUnknown* pContainer, + D3D9SurfaceContainerType ContainerType = D3D9SurfaceContainerType::Texture); void AddRefPrivate(); @@ -57,6 +67,8 @@ namespace dxvk { private: + D3D9SurfaceContainerType m_containerType; + D3D9GDIDesc m_dcDesc; }; diff --git a/src/d3d9/d3d9_swapchain.cpp b/src/d3d9/d3d9_swapchain.cpp index 0a92ab93..22acb521 100644 --- a/src/d3d9/d3d9_swapchain.cpp +++ b/src/d3d9/d3d9_swapchain.cpp @@ -911,7 +911,7 @@ namespace dxvk { desc.Discard = FALSE; for (uint32_t i = 0; i < m_backBuffers.size(); i++) - m_backBuffers[i] = new D3D9Surface(m_parent, &desc); + m_backBuffers[i] = new D3D9Surface(m_parent, &desc, this, D3D9SurfaceContainerType::Swapchain); auto swapImage = m_backBuffers[0]->GetCommonTexture()->GetImage(); diff --git a/src/d3d9/d3d9_volume.cpp b/src/d3d9/d3d9_volume.cpp index b52b35b4..dce4b28f 100644 --- a/src/d3d9/d3d9_volume.cpp +++ b/src/d3d9/d3d9_volume.cpp @@ -29,10 +29,10 @@ namespace dxvk { void D3D9Volume::AddRefPrivate() { - IDirect3DBaseTexture9* pContainer = this->m_container; + auto* pContainer = static_cast<D3D9Texture3D*>(this->m_container); if (pContainer != nullptr) { - reinterpret_cast<D3D9Texture3D*> (pContainer)->AddRefPrivate(); + pContainer->AddRefPrivate(); return; } @@ -41,10 +41,10 @@ namespace dxvk { void D3D9Volume::ReleasePrivate() { - IDirect3DBaseTexture9* pContainer = this->m_container; + auto* pContainer = static_cast<D3D9Texture3D*>(this->m_container); if (pContainer != nullptr) { - reinterpret_cast<D3D9Texture3D*> (pContainer)->ReleasePrivate(); + pContainer->ReleasePrivate(); return; } |