Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/doitsujin/dxvk.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Ashton <joshua@froggi.es>2020-02-29 01:29:01 +0300
committerJoshua Ashton <joshua@froggi.es>2020-02-29 01:29:01 +0300
commitfb8852a656c0414ad2f9c2bfcee3fb1240cb03f2 (patch)
treea0303ed9d5b880803afcbb9d8992c75e8c764471
parentc05b5a99e106641c4263843e03dc9e401db83b82 (diff)
[d3d9] Implement GetContainer for swapchain surfacesd3d9-container-swapchain
-rw-r--r--src/d3d9/d3d9_subresource.h6
-rw-r--r--src/d3d9/d3d9_surface.cpp66
-rw-r--r--src/d3d9/d3d9_surface.h16
-rw-r--r--src/d3d9/d3d9_swapchain.cpp2
-rw-r--r--src/d3d9/d3d9_volume.cpp8
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;
}