diff --git a/src/d3d10/d3d10_device.cpp b/src/d3d10/d3d10_device.cpp index 32a3d260..6ecc5e35 100644 --- a/src/d3d10/d3d10_device.cpp +++ b/src/d3d10/d3d10_device.cpp @@ -243,16 +243,16 @@ namespace dxvk { Com d3d11Resource; GetD3D11Resource(pResource, &d3d11Resource); - ID3D11ShaderResourceView* d3d11Srv = nullptr; + ID3D11ShaderResourceView* d3d11View = nullptr; HRESULT hr = m_device->CreateShaderResourceView(d3d11Resource.ptr(), reinterpret_cast(pDesc), - ppSRView ? &d3d11Srv : nullptr); + ppSRView ? &d3d11View : nullptr); if (FAILED(hr)) return hr; if (ppSRView != nullptr) { - *ppSRView = static_cast(d3d11Srv)->GetD3D10Iface(); + *ppSRView = static_cast(d3d11View)->GetD3D10Iface(); return S_OK; } return S_FALSE; } @@ -262,8 +262,21 @@ namespace dxvk { ID3D10Resource* pResource, const D3D10_RENDER_TARGET_VIEW_DESC* pDesc, ID3D10RenderTargetView** ppRTView) { - Logger::err("D3D10Device::CreateRenderTargetView: Not implemented"); - return E_NOTIMPL; + Com d3d11Resource; + GetD3D11Resource(pResource, &d3d11Resource); + + ID3D11RenderTargetView* d3d11View = nullptr; + HRESULT hr = m_device->CreateRenderTargetView(d3d11Resource.ptr(), + reinterpret_cast(pDesc), + ppRTView ? &d3d11View : nullptr); + + if (FAILED(hr)) + return hr; + + if (ppRTView != nullptr) { + *ppRTView = static_cast(d3d11View)->GetD3D10Iface(); + return S_OK; + } return S_FALSE; } diff --git a/src/d3d10/d3d10_view_rtv.cpp b/src/d3d10/d3d10_view_rtv.cpp new file mode 100644 index 00000000..7170a649 --- /dev/null +++ b/src/d3d10/d3d10_view_rtv.cpp @@ -0,0 +1,68 @@ +#include "d3d10_view_rtv.h" + +#include "../d3d11/d3d11_device.h" +#include "../d3d11/d3d11_view_rtv.h" + +namespace dxvk { + + HRESULT STDMETHODCALLTYPE D3D10RenderTargetView::QueryInterface( + REFIID riid, + void** ppvObject) { + return m_d3d11->QueryInterface(riid, ppvObject); + } + + + ULONG STDMETHODCALLTYPE D3D10RenderTargetView::AddRef() { + return m_d3d11->AddRef(); + } + + + ULONG STDMETHODCALLTYPE D3D10RenderTargetView::Release() { + return m_d3d11->Release(); + } + + + void STDMETHODCALLTYPE D3D10RenderTargetView::GetDevice( + ID3D10Device** ppDevice) { + GetD3D10Device(m_d3d11, ppDevice); + } + + + HRESULT STDMETHODCALLTYPE D3D10RenderTargetView::GetPrivateData( + REFGUID guid, + UINT* pDataSize, + void* pData) { + return m_d3d11->GetPrivateData(guid, pDataSize, pData); + } + + + HRESULT STDMETHODCALLTYPE D3D10RenderTargetView::SetPrivateData( + REFGUID guid, + UINT DataSize, + const void* pData) { + return m_d3d11->SetPrivateData(guid, DataSize, pData); + } + + + HRESULT STDMETHODCALLTYPE D3D10RenderTargetView::SetPrivateDataInterface( + REFGUID guid, + const IUnknown* pData) { + return m_d3d11->SetPrivateDataInterface(guid, pData); + } + + + void STDMETHODCALLTYPE D3D10RenderTargetView::GetResource( + ID3D10Resource** ppResource) { + GetD3D10ResourceFromView(m_d3d11, ppResource); + } + + + void STDMETHODCALLTYPE D3D10RenderTargetView::GetDesc( + D3D10_RENDER_TARGET_VIEW_DESC* pDesc) { + static_assert(sizeof(D3D10_RENDER_TARGET_VIEW_DESC) == + sizeof(D3D11_RENDER_TARGET_VIEW_DESC)); + + m_d3d11->GetDesc(reinterpret_cast(pDesc)); + } + +} \ No newline at end of file diff --git a/src/d3d10/d3d10_view_rtv.h b/src/d3d10/d3d10_view_rtv.h new file mode 100644 index 00000000..e6a46c56 --- /dev/null +++ b/src/d3d10/d3d10_view_rtv.h @@ -0,0 +1,58 @@ +#pragma once + +#include "d3d10_util.h" + +namespace dxvk { + + class D3D11Device; + class D3D11RenderTargetView; + + class D3D10RenderTargetView : public ID3D10RenderTargetView { + + public: + + D3D10RenderTargetView(D3D11RenderTargetView* pParent) + : m_d3d11(pParent) { } + + HRESULT STDMETHODCALLTYPE QueryInterface( + REFIID riid, + void** ppvObject); + + ULONG STDMETHODCALLTYPE AddRef(); + + ULONG STDMETHODCALLTYPE Release(); + + void STDMETHODCALLTYPE GetDevice( + ID3D10Device** ppDevice); + + HRESULT STDMETHODCALLTYPE GetPrivateData( + REFGUID guid, + UINT* pDataSize, + void* pData); + + HRESULT STDMETHODCALLTYPE SetPrivateData( + REFGUID guid, + UINT DataSize, + const void* pData); + + HRESULT STDMETHODCALLTYPE SetPrivateDataInterface( + REFGUID guid, + const IUnknown* pData); + + void STDMETHODCALLTYPE GetResource( + ID3D10Resource** ppResource); + + void STDMETHODCALLTYPE GetDesc( + D3D10_RENDER_TARGET_VIEW_DESC* pDesc); + + D3D11RenderTargetView* GetD3D11Iface() { + return m_d3d11; + } + + private: + + D3D11RenderTargetView* m_d3d11; + + }; + +} \ No newline at end of file diff --git a/src/d3d11/d3d11_view_rtv.cpp b/src/d3d11/d3d11_view_rtv.cpp index d5b1f055..2a468989 100644 --- a/src/d3d11/d3d11_view_rtv.cpp +++ b/src/d3d11/d3d11_view_rtv.cpp @@ -10,7 +10,7 @@ namespace dxvk { D3D11Device* pDevice, ID3D11Resource* pResource, const D3D11_RENDER_TARGET_VIEW_DESC* pDesc) - : m_device(pDevice), m_resource(pResource), m_desc(*pDesc) { + : m_device(pDevice), m_resource(pResource), m_desc(*pDesc), m_d3d10(this) { ResourceAddRefPrivate(m_resource); DxvkImageViewCreateInfo viewInfo; @@ -108,6 +108,13 @@ namespace dxvk { return S_OK; } + if (riid == __uuidof(ID3D10DeviceChild) + || riid == __uuidof(ID3D10View) + || riid == __uuidof(ID3D10RenderTargetView)) { + *ppvObject = ref(this); + return S_OK; + } + Logger::warn("D3D11RenderTargetView::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); return E_NOINTERFACE; diff --git a/src/d3d11/d3d11_view_rtv.h b/src/d3d11/d3d11_view_rtv.h index 14b83c23..d75483c3 100644 --- a/src/d3d11/d3d11_view_rtv.h +++ b/src/d3d11/d3d11_view_rtv.h @@ -2,6 +2,8 @@ #include "../dxvk/dxvk_device.h" +#include "../d3d10/d3d10_view_rtv.h" + #include "d3d11_device_child.h" namespace dxvk { @@ -45,6 +47,10 @@ namespace dxvk { ? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL : VK_IMAGE_LAYOUT_GENERAL; } + + D3D10RenderTargetView* GetD3D10Iface() { + return &m_d3d10; + } static HRESULT GetDescFromResource( ID3D11Resource* pResource, @@ -60,6 +66,7 @@ namespace dxvk { ID3D11Resource* m_resource; D3D11_RENDER_TARGET_VIEW_DESC m_desc; Rc m_view; + D3D10RenderTargetView m_d3d10; }; diff --git a/src/d3d11/meson.build b/src/d3d11/meson.build index c18a3a95..0c4f3cff 100644 --- a/src/d3d11/meson.build +++ b/src/d3d11/meson.build @@ -8,6 +8,7 @@ d3d10_src = [ '../d3d10/d3d10_sampler.cpp', '../d3d10/d3d10_texture.cpp', '../d3d10/d3d10_util.cpp', + '../d3d10/d3d10_view_rtv.cpp', '../d3d10/d3d10_view_srv.cpp', ]