mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-12-05 01:24:14 +01:00
f20a3c07fb
Otherwise we end up creating views with VK_IMAGE_FORMAT_UNDEFINED.
129 lines
3.4 KiB
C++
129 lines
3.4 KiB
C++
#pragma once
|
|
|
|
#include "d3d9_resource.h"
|
|
#include "d3d9_common_texture.h"
|
|
|
|
namespace dxvk {
|
|
|
|
template <typename... Type>
|
|
class D3D9Subresource : public D3D9Resource<Type...> {
|
|
|
|
public:
|
|
|
|
D3D9Subresource(
|
|
D3D9DeviceEx* pDevice,
|
|
D3D9CommonTexture* pTexture,
|
|
UINT Face,
|
|
UINT MipLevel,
|
|
IDirect3DBaseTexture9* pContainer)
|
|
: D3D9Resource<Type...> ( pDevice )
|
|
, m_container ( pContainer )
|
|
, m_texture ( pTexture )
|
|
, m_face ( Face )
|
|
, m_mipLevel ( MipLevel )
|
|
, m_isSrgbCompatible ( pTexture->IsSrgbCompatible() ) { }
|
|
|
|
~D3D9Subresource() {
|
|
// We own the texture!
|
|
if (m_container == nullptr)
|
|
delete m_texture;
|
|
}
|
|
|
|
ULONG STDMETHODCALLTYPE AddRef() final {
|
|
if (m_container != nullptr)
|
|
return m_container->AddRef();
|
|
|
|
return D3D9Resource<Type...>::AddRef();
|
|
}
|
|
|
|
ULONG STDMETHODCALLTYPE Release() final {
|
|
if (m_container != nullptr)
|
|
return m_container->Release();
|
|
|
|
return D3D9Resource<Type...>::Release();
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE GetContainer(REFIID riid, void** ppContainer) final {
|
|
if (m_container != nullptr)
|
|
return m_container->QueryInterface(riid, ppContainer);
|
|
|
|
return this->GetDevice()->QueryInterface(riid, ppContainer);
|
|
}
|
|
|
|
D3D9CommonTexture* GetCommonTexture() {
|
|
return m_texture;
|
|
}
|
|
|
|
UINT GetFace() const {
|
|
return m_face;
|
|
}
|
|
|
|
UINT GetMipLevel() const {
|
|
return m_mipLevel;
|
|
}
|
|
|
|
UINT GetSubresource() const {
|
|
return m_texture->CalcSubresource(m_face, m_mipLevel);
|
|
}
|
|
|
|
Rc<DxvkImageView> GetImageView(bool Srgb) {
|
|
Srgb &= m_isSrgbCompatible;
|
|
Rc<DxvkImageView>& view = m_sampleView.Pick(Srgb);
|
|
|
|
if (unlikely(view == nullptr && !IsNull()))
|
|
view = m_texture->CreateView(m_face, m_mipLevel, VK_IMAGE_USAGE_SAMPLED_BIT, Srgb);
|
|
|
|
return view;
|
|
}
|
|
|
|
Rc<DxvkImageView> GetRenderTargetView(bool Srgb) {
|
|
Srgb &= m_isSrgbCompatible;
|
|
Rc<DxvkImageView>& view = m_renderTargetView.Pick(Srgb);
|
|
|
|
if (unlikely(view == nullptr && !IsNull()))
|
|
view = m_texture->CreateView(m_face, m_mipLevel, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, Srgb);
|
|
|
|
return view;
|
|
}
|
|
|
|
VkImageLayout GetRenderTargetLayout() const {
|
|
return m_texture->DetermineRenderTargetLayout();
|
|
}
|
|
|
|
Rc<DxvkImageView> GetDepthStencilView() {
|
|
Rc<DxvkImageView>& view = m_depthStencilView;
|
|
|
|
if (unlikely(view == nullptr && !IsNull()))
|
|
view = m_texture->CreateView(m_face, m_mipLevel, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, false);
|
|
|
|
return view;
|
|
}
|
|
|
|
VkImageLayout GetDepthStencilLayout() const {
|
|
return m_texture->DetermineDepthStencilLayout();
|
|
}
|
|
|
|
bool IsNull() {
|
|
return m_texture->Desc()->Format == D3D9Format::NULL_FORMAT;
|
|
}
|
|
|
|
IDirect3DBaseTexture9* GetBaseTexture() {
|
|
return m_container;
|
|
}
|
|
|
|
protected:
|
|
|
|
IDirect3DBaseTexture9* m_container;
|
|
|
|
D3D9CommonTexture* m_texture;
|
|
UINT m_face;
|
|
UINT m_mipLevel;
|
|
|
|
bool m_isSrgbCompatible;
|
|
D3D9ColorView m_sampleView;
|
|
D3D9ColorView m_renderTargetView;
|
|
Rc<DxvkImageView> m_depthStencilView;
|
|
|
|
};
|
|
|
|
} |