1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-27 22:54:16 +01:00

[d3d11] Implement ID3D11Texture2D1 and ID3D11Texture3D1

This commit is contained in:
Philip Rebohle 2019-09-16 13:50:39 +02:00
parent d9f409b92f
commit 0758f14a35
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
4 changed files with 60 additions and 9 deletions

View File

@ -122,6 +122,7 @@ namespace dxvk {
desc.BindFlags = pDesc->BindFlags;
desc.CPUAccessFlags = pDesc->CPUAccessFlags;
desc.MiscFlags = pDesc->MiscFlags;
desc.TextureLayout = D3D11_TEXTURE_LAYOUT_UNDEFINED;
if (FAILED(D3D11CommonTexture::NormalizeTextureProperties(&desc)))
return E_INVALIDARG;
@ -162,6 +163,7 @@ namespace dxvk {
desc.BindFlags = pDesc->BindFlags;
desc.CPUAccessFlags = pDesc->CPUAccessFlags;
desc.MiscFlags = pDesc->MiscFlags;
desc.TextureLayout = D3D11_TEXTURE_LAYOUT_UNDEFINED;
if (FAILED(D3D11CommonTexture::NormalizeTextureProperties(&desc)))
return E_INVALIDARG;
@ -202,6 +204,7 @@ namespace dxvk {
desc.BindFlags = pDesc->BindFlags;
desc.CPUAccessFlags = pDesc->CPUAccessFlags;
desc.MiscFlags = pDesc->MiscFlags;
desc.TextureLayout = D3D11_TEXTURE_LAYOUT_UNDEFINED;
if (FAILED(D3D11CommonTexture::NormalizeTextureProperties(&desc)))
return E_INVALIDARG;

View File

@ -443,6 +443,7 @@ namespace dxvk {
| D3D11_BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;
desc.TextureLayout = D3D11_TEXTURE_LAYOUT_UNDEFINED;
if (m_desc.BufferUsage & DXGI_USAGE_UNORDERED_ACCESS)
desc.BindFlags |= D3D11_BIND_UNORDERED_ACCESS;

View File

@ -295,6 +295,16 @@ namespace dxvk {
if (pDesc->MipLevels == 0 || pDesc->MipLevels > maxMipLevelCount)
pDesc->MipLevels = maxMipLevelCount;
// Row-major is only supported for textures with one single
// subresource and one sample and cannot have bind flags.
if (pDesc->TextureLayout == D3D11_TEXTURE_LAYOUT_ROW_MAJOR
&& (pDesc->MipLevels != 1 || pDesc->SampleDesc.Count != 1 || pDesc->BindFlags))
return E_INVALIDARG;
// Standard swizzle is unsupported
if (pDesc->TextureLayout == D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE)
return E_INVALIDARG;
return S_OK;
}
@ -404,7 +414,8 @@ namespace dxvk {
// 2. Since the image will most likely be read for rendering by the GPU,
// writing the image to device-local image may be more efficient than
// reading its contents from host-visible memory.
if (m_desc.Usage == D3D11_USAGE_DYNAMIC)
if (m_desc.Usage == D3D11_USAGE_DYNAMIC
&& m_desc.TextureLayout != D3D11_TEXTURE_LAYOUT_ROW_MAJOR)
return D3D11_COMMON_TEXTURE_MAP_MODE_BUFFER;
// Depth-stencil formats in D3D11 can be mapped and follow special
@ -892,7 +903,8 @@ namespace dxvk {
if (riid == __uuidof(IUnknown)
|| riid == __uuidof(ID3D11DeviceChild)
|| riid == __uuidof(ID3D11Resource)
|| riid == __uuidof(ID3D11Texture2D)) {
|| riid == __uuidof(ID3D11Texture2D)
|| riid == __uuidof(ID3D11Texture2D1)) {
*ppvObject = ref(this);
return S_OK;
}
@ -954,7 +966,7 @@ namespace dxvk {
}
void STDMETHODCALLTYPE D3D11Texture2D::GetDesc(D3D11_TEXTURE2D_DESC *pDesc) {
void STDMETHODCALLTYPE D3D11Texture2D::GetDesc(D3D11_TEXTURE2D_DESC* pDesc) {
pDesc->Width = m_texture.Desc()->Width;
pDesc->Height = m_texture.Desc()->Height;
pDesc->MipLevels = m_texture.Desc()->MipLevels;
@ -968,6 +980,21 @@ namespace dxvk {
}
void STDMETHODCALLTYPE D3D11Texture2D::GetDesc1(D3D11_TEXTURE2D_DESC1* pDesc) {
pDesc->Width = m_texture.Desc()->Width;
pDesc->Height = m_texture.Desc()->Height;
pDesc->MipLevels = m_texture.Desc()->MipLevels;
pDesc->ArraySize = m_texture.Desc()->ArraySize;
pDesc->Format = m_texture.Desc()->Format;
pDesc->SampleDesc = m_texture.Desc()->SampleDesc;
pDesc->Usage = m_texture.Desc()->Usage;
pDesc->BindFlags = m_texture.Desc()->BindFlags;
pDesc->CPUAccessFlags = m_texture.Desc()->CPUAccessFlags;
pDesc->MiscFlags = m_texture.Desc()->MiscFlags;
pDesc->TextureLayout = m_texture.Desc()->TextureLayout;
}
///////////////////////////////////////////
// D 3 D 1 1 T E X T U R E 3 D
D3D11Texture3D::D3D11Texture3D(
@ -995,7 +1022,8 @@ namespace dxvk {
if (riid == __uuidof(IUnknown)
|| riid == __uuidof(ID3D11DeviceChild)
|| riid == __uuidof(ID3D11Resource)
|| riid == __uuidof(ID3D11Texture3D)) {
|| riid == __uuidof(ID3D11Texture3D)
|| riid == __uuidof(ID3D11Texture3D1)) {
*ppvObject = ref(this);
return S_OK;
}
@ -1049,7 +1077,7 @@ namespace dxvk {
}
void STDMETHODCALLTYPE D3D11Texture3D::GetDesc(D3D11_TEXTURE3D_DESC *pDesc) {
void STDMETHODCALLTYPE D3D11Texture3D::GetDesc(D3D11_TEXTURE3D_DESC* pDesc) {
pDesc->Width = m_texture.Desc()->Width;
pDesc->Height = m_texture.Desc()->Height;
pDesc->Depth = m_texture.Desc()->Depth;
@ -1062,6 +1090,18 @@ namespace dxvk {
}
void STDMETHODCALLTYPE D3D11Texture3D::GetDesc1(D3D11_TEXTURE3D_DESC1* pDesc) {
pDesc->Width = m_texture.Desc()->Width;
pDesc->Height = m_texture.Desc()->Height;
pDesc->Depth = m_texture.Desc()->Depth;
pDesc->MipLevels = m_texture.Desc()->MipLevels;
pDesc->Format = m_texture.Desc()->Format;
pDesc->Usage = m_texture.Desc()->Usage;
pDesc->BindFlags = m_texture.Desc()->BindFlags;
pDesc->CPUAccessFlags = m_texture.Desc()->CPUAccessFlags;
pDesc->MiscFlags = m_texture.Desc()->MiscFlags;
}
D3D11CommonTexture* GetCommonTexture(ID3D11Resource* pResource) {
D3D11_RESOURCE_DIMENSION dimension = D3D11_RESOURCE_DIMENSION_UNKNOWN;

View File

@ -43,6 +43,7 @@ namespace dxvk {
UINT BindFlags;
UINT CPUAccessFlags;
UINT MiscFlags;
D3D11_TEXTURE_LAYOUT TextureLayout;
};
@ -411,7 +412,7 @@ namespace dxvk {
///////////////////////////////////////////
// D 3 D 1 1 T E X T U R E 2 D
class D3D11Texture2D : public D3D11DeviceChild<ID3D11Texture2D> {
class D3D11Texture2D : public D3D11DeviceChild<ID3D11Texture2D1> {
public:
@ -436,7 +437,10 @@ namespace dxvk {
void STDMETHODCALLTYPE SetEvictionPriority(UINT EvictionPriority) final;
void STDMETHODCALLTYPE GetDesc(
D3D11_TEXTURE2D_DESC *pDesc) final;
D3D11_TEXTURE2D_DESC* pDesc) final;
void STDMETHODCALLTYPE GetDesc1(
D3D11_TEXTURE2D_DESC1* pDesc) final;
D3D11CommonTexture* GetCommonTexture() {
return &m_texture;
@ -459,7 +463,7 @@ namespace dxvk {
///////////////////////////////////////////
// D 3 D 1 1 T E X T U R E 3 D
class D3D11Texture3D : public D3D11DeviceChild<ID3D11Texture3D> {
class D3D11Texture3D : public D3D11DeviceChild<ID3D11Texture3D1> {
public:
@ -484,7 +488,10 @@ namespace dxvk {
void STDMETHODCALLTYPE SetEvictionPriority(UINT EvictionPriority) final;
void STDMETHODCALLTYPE GetDesc(
D3D11_TEXTURE3D_DESC *pDesc) final;
D3D11_TEXTURE3D_DESC* pDesc) final;
void STDMETHODCALLTYPE GetDesc1(
D3D11_TEXTURE3D_DESC1* pDesc) final;
D3D11CommonTexture* GetCommonTexture() {
return &m_texture;