diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 13f257a9..40c4ce2b 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -381,7 +381,8 @@ namespace dxvk { try { Rc view = m_dxvkDevice->createImageView(image, viewInfo); - *ppRTView = ref(new D3D11RenderTargetView(this, pResource, desc, view)); + *ppRTView = ref(new D3D11RenderTargetView( + this, pResource, desc, nullptr, view)); return S_OK; } catch (const DxvkError& e) { Logger::err(e.message()); @@ -516,7 +517,8 @@ namespace dxvk { try { Rc view = m_dxvkDevice->createImageView(image, viewInfo); - *ppDepthStencilView = ref(new D3D11DepthStencilView(this, pResource, desc, view)); + *ppDepthStencilView = ref(new D3D11DepthStencilView( + this, pResource, desc, nullptr, view)); return S_OK; } catch (const DxvkError& e) { Logger::err(e.message()); diff --git a/src/d3d11/d3d11_view.cpp b/src/d3d11/d3d11_view.cpp deleted file mode 100644 index 551cfdc1..00000000 --- a/src/d3d11/d3d11_view.cpp +++ /dev/null @@ -1,105 +0,0 @@ -#include "d3d11_device.h" -#include "d3d11_view.h" - -namespace dxvk { - - D3D11RenderTargetView::D3D11RenderTargetView( - D3D11Device* device, - ID3D11Resource* resource, - const D3D11_RENDER_TARGET_VIEW_DESC& desc, - Rc view) - : m_device (device), - m_resource(resource), - m_desc (desc), - m_view (view) { - - } - - - D3D11RenderTargetView::~D3D11RenderTargetView() { - - } - - - HRESULT D3D11RenderTargetView::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11View); - COM_QUERY_IFACE(riid, ppvObject, ID3D11RenderTargetView); - - Logger::warn("D3D11RenderTargetView::QueryInterface: Unknown interface query"); - return E_NOINTERFACE; - } - - - void D3D11RenderTargetView::GetDevice(ID3D11Device** ppDevice) { - *ppDevice = ref(m_device); - } - - - void D3D11RenderTargetView::GetResource(ID3D11Resource **ppResource) { - *ppResource = m_resource.ref(); - } - - - void D3D11RenderTargetView::GetDesc(D3D11_RENDER_TARGET_VIEW_DESC* pDesc) { - *pDesc = m_desc; - } - - - Rc D3D11RenderTargetView::GetDXVKImageView() { - return m_view; - } - - - - - D3D11DepthStencilView::D3D11DepthStencilView( - D3D11Device* device, - ID3D11Resource* resource, - const D3D11_DEPTH_STENCIL_VIEW_DESC& desc, - Rc view) - : m_device (device), - m_resource(resource), - m_desc (desc), - m_view (view) { - - } - - - D3D11DepthStencilView::~D3D11DepthStencilView() { - - } - - - HRESULT D3D11DepthStencilView::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11View); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DepthStencilView); - - Logger::warn("D3D11DepthStencilView::QueryInterface: Unknown interface query"); - return E_NOINTERFACE; - } - - - void D3D11DepthStencilView::GetDevice(ID3D11Device** ppDevice) { - *ppDevice = ref(m_device); - } - - - void D3D11DepthStencilView::GetResource(ID3D11Resource **ppResource) { - *ppResource = m_resource.ref(); - } - - - void D3D11DepthStencilView::GetDesc(D3D11_DEPTH_STENCIL_VIEW_DESC* pDesc) { - *pDesc = m_desc; - } - - - Rc D3D11DepthStencilView::GetDXVKImageView() { - return m_view; - } - -} diff --git a/src/d3d11/d3d11_view.h b/src/d3d11/d3d11_view.h index 440a35f1..52323262 100644 --- a/src/d3d11/d3d11_view.h +++ b/src/d3d11/d3d11_view.h @@ -8,78 +8,80 @@ namespace dxvk { class D3D11Device; - class D3D11RenderTargetView : public D3D11DeviceChild { + /** + * \brief Generic resource view template + * + * Stores an image view or a buffer view, depending + * on the referenced resource type, and implements + * the interface for a given view type. + * \tparam Iface Base interface + * \tparam DescType View description type + */ + template + class D3D11ResourceView : public D3D11DeviceChild { public: - D3D11RenderTargetView( - D3D11Device* device, - ID3D11Resource* resource, - const D3D11_RENDER_TARGET_VIEW_DESC& desc, - Rc view); - ~D3D11RenderTargetView(); + D3D11ResourceView( + D3D11Device* device, + ID3D11Resource* resource, + const DescType& desc, + const Rc& bufferView, + const Rc& imageView) + : m_device(device), m_resource(resource), m_desc(desc), + m_bufferView(bufferView), m_imageView(imageView) { } - HRESULT QueryInterface( - REFIID riid, - void** ppvObject) final; + HRESULT QueryInterface(REFIID riid, void** ppvObject) final { + COM_QUERY_IFACE(riid, ppvObject, IUnknown); + COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); + COM_QUERY_IFACE(riid, ppvObject, ID3D11View); + COM_QUERY_IFACE(riid, ppvObject, Iface); + + Logger::warn("D3D11ResourceView::QueryInterface: Unknown interface query"); + return E_NOINTERFACE; + } - void GetDevice( - ID3D11Device **ppDevice) final; + void GetDevice(ID3D11Device** ppDevice) final { + *ppDevice = ref(m_device); + } - void GetResource( - ID3D11Resource **ppResource) final; + void GetResource(ID3D11Resource** ppResource) final { + *ppResource = m_resource.ref(); + } - void GetDesc( - D3D11_RENDER_TARGET_VIEW_DESC* pDesc) final; + void GetDesc(DescType* pDesc) final { + *pDesc = m_desc; + } - Rc GetDXVKImageView(); + Rc GetDXVKBufferView() { + return m_bufferView; + } + + Rc GetDXVKImageView() { + return m_imageView; + } private: - D3D11Device* const m_device; - Com m_resource; - - D3D11_RENDER_TARGET_VIEW_DESC m_desc; - Rc m_view; - - }; - - class D3D11DepthStencilView : public D3D11DeviceChild { - - public: - - D3D11DepthStencilView( - D3D11Device* device, - ID3D11Resource* resource, - const D3D11_DEPTH_STENCIL_VIEW_DESC& desc, - Rc view); - ~D3D11DepthStencilView(); - - HRESULT QueryInterface( - REFIID riid, - void** ppvObject) final; - - void GetDevice( - ID3D11Device **ppDevice) final; - - void GetResource( - ID3D11Resource **ppResource) final; - - void GetDesc( - D3D11_DEPTH_STENCIL_VIEW_DESC* pDesc) final; - - Rc GetDXVKImageView(); - - private: - - D3D11Device* const m_device; - Com m_resource; - - D3D11_DEPTH_STENCIL_VIEW_DESC m_desc; - Rc m_view; + D3D11Device* const m_device; + Com m_resource; + DescType m_desc; + Rc m_bufferView; + Rc m_imageView; }; + using D3D11ShaderResourceView = D3D11ResourceView< + ID3D11ShaderResourceView, D3D11_SHADER_RESOURCE_VIEW_DESC>; + + using D3D11RenderTargetView = D3D11ResourceView< + ID3D11RenderTargetView, D3D11_RENDER_TARGET_VIEW_DESC>; + + using D3D11DepthStencilView = D3D11ResourceView< + ID3D11DepthStencilView, D3D11_DEPTH_STENCIL_VIEW_DESC>; + + using D3D11UnorderedAccessView = D3D11ResourceView< + ID3D11UnorderedAccessView, D3D11_UNORDERED_ACCESS_VIEW_DESC>; } diff --git a/src/d3d11/meson.build b/src/d3d11/meson.build index 41273728..644d62e1 100644 --- a/src/d3d11/meson.build +++ b/src/d3d11/meson.build @@ -10,7 +10,6 @@ d3d11_src = [ 'd3d11_state.cpp', 'd3d11_state_rs.cpp', 'd3d11_texture.cpp', - 'd3d11_view.cpp', ] d3d11_dll = shared_library('d3d11', d3d11_src,