Support small added features in new D3D12 headers

* Triangle fans
* 16-bit types in shader declarations
* Trivial/non-wrapped new interface versions
* New mostly-ignorable enums: D3D12_COMMAND_LIST_TYPE_NONE,
  D3D12_COMPARISON_FUNC_NONE
* Alpha constant blend factors
* New sampler filtering with anisotropic min/mag and point mip
* New ABGR4 format
* MSAA UAVs
* Allow SM6.7
This commit is contained in:
baldurk
2023-05-19 13:28:05 +01:00
parent 91b084a2df
commit 81ac9f9117
20 changed files with 290 additions and 43 deletions
+3 -2
View File
@@ -676,9 +676,9 @@ rdcstr DoStringise(const D3D11_MAP &el)
}
template <>
rdcstr DoStringise(const D3D11_PRIMITIVE_TOPOLOGY &el)
rdcstr DoStringise(const D3D_PRIMITIVE_TOPOLOGY &el)
{
BEGIN_ENUM_STRINGISE(D3D11_PRIMITIVE_TOPOLOGY);
BEGIN_ENUM_STRINGISE(D3D_PRIMITIVE_TOPOLOGY);
{
STRINGISE_ENUM(D3D_PRIMITIVE_TOPOLOGY_UNDEFINED);
STRINGISE_ENUM(D3D_PRIMITIVE_TOPOLOGY_POINTLIST);
@@ -686,6 +686,7 @@ rdcstr DoStringise(const D3D11_PRIMITIVE_TOPOLOGY &el)
STRINGISE_ENUM(D3D_PRIMITIVE_TOPOLOGY_LINESTRIP);
STRINGISE_ENUM(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
STRINGISE_ENUM(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
STRINGISE_ENUM(D3D_PRIMITIVE_TOPOLOGY_TRIANGLEFAN);
STRINGISE_ENUM(D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ);
STRINGISE_ENUM(D3D_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ);
STRINGISE_ENUM(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ);
+32 -10
View File
@@ -35,14 +35,15 @@ class WrappedID3D12GraphicsCommandList;
// The inheritance is awful for these. See WrappedID3D12DebugDevice for why there are multiple
// parent classes
struct WrappedID3D12DebugCommandList : public ID3D12DebugCommandList2, public ID3D12DebugCommandList1
struct WrappedID3D12DebugCommandList : public ID3D12DebugCommandList3, public ID3D12DebugCommandList1
{
WrappedID3D12GraphicsCommandList *m_pList;
ID3D12DebugCommandList *m_pReal;
ID3D12DebugCommandList1 *m_pReal1;
ID3D12DebugCommandList2 *m_pReal2;
WrappedID3D12GraphicsCommandList *m_pList = NULL;
ID3D12DebugCommandList *m_pReal = NULL;
ID3D12DebugCommandList1 *m_pReal1 = NULL;
ID3D12DebugCommandList2 *m_pReal2 = NULL;
ID3D12DebugCommandList3 *m_pReal3 = NULL;
WrappedID3D12DebugCommandList() : m_pList(NULL), m_pReal(NULL), m_pReal1(NULL), m_pReal2(NULL) {}
WrappedID3D12DebugCommandList() {}
//////////////////////////////
// implement IUnknown
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
@@ -65,6 +66,12 @@ struct WrappedID3D12DebugCommandList : public ID3D12DebugCommandList2, public ID
AddRef();
return S_OK;
}
else if(riid == __uuidof(ID3D12DebugCommandList3))
{
*ppvObject = (ID3D12DebugCommandList3 *)this;
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
@@ -101,8 +108,7 @@ struct WrappedID3D12DebugCommandList : public ID3D12DebugCommandList2, public ID
// implement ID3D12DebugCommandList1 / ID3D12DebugCommandList2
virtual HRESULT STDMETHODCALLTYPE SetDebugParameter(D3D12_DEBUG_COMMAND_LIST_PARAMETER_TYPE Type,
_In_reads_bytes_(DataSize) const void *pData,
UINT DataSize)
const void *pData, UINT DataSize)
{
if(m_pReal1)
return m_pReal1->SetDebugParameter(Type, pData, DataSize);
@@ -112,8 +118,7 @@ struct WrappedID3D12DebugCommandList : public ID3D12DebugCommandList2, public ID
}
virtual HRESULT STDMETHODCALLTYPE GetDebugParameter(D3D12_DEBUG_COMMAND_LIST_PARAMETER_TYPE Type,
_Out_writes_bytes_(DataSize) void *pData,
UINT DataSize)
void *pData, UINT DataSize)
{
if(m_pReal1)
return m_pReal1->GetDebugParameter(Type, pData, DataSize);
@@ -121,6 +126,23 @@ struct WrappedID3D12DebugCommandList : public ID3D12DebugCommandList2, public ID
return m_pReal2->GetDebugParameter(Type, pData, DataSize);
return S_OK;
}
//////////////////////////////
// implement ID3D12DebugCommandList3
virtual void STDMETHODCALLTYPE AssertResourceAccess(ID3D12Resource *pResource, UINT Subresource,
D3D12_BARRIER_ACCESS Access)
{
if(m_pReal3)
m_pReal3->AssertResourceAccess(Unwrap(pResource), Subresource, Access);
}
virtual void STDMETHODCALLTYPE AssertTextureLayout(ID3D12Resource *pResource, UINT Subresource,
D3D12_BARRIER_LAYOUT Layout)
{
if(m_pReal3)
m_pReal3->AssertTextureLayout(Unwrap(pResource), Subresource, Layout);
}
};
class WrappedID3D12GraphicsCommandList : public ID3D12GraphicsCommandListX
+28 -4
View File
@@ -70,12 +70,13 @@ struct WrappedID3D12CompatibilityQueue : public ID3D12CompatibilityQueue
_In_range_(0, 0) UINT Reserved);
};
struct WrappedID3D12DebugCommandQueue : public ID3D12DebugCommandQueue
struct WrappedID3D12DebugCommandQueue : public ID3D12DebugCommandQueue1
{
WrappedID3D12CommandQueue *m_pQueue;
ID3D12DebugCommandQueue *m_pReal;
WrappedID3D12CommandQueue *m_pQueue = NULL;
ID3D12DebugCommandQueue *m_pReal = NULL;
ID3D12DebugCommandQueue1 *m_pReal1 = NULL;
WrappedID3D12DebugCommandQueue() : m_pQueue(NULL), m_pReal(NULL) {}
WrappedID3D12DebugCommandQueue() {}
//////////////////////////////
// implement IUnknown
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
@@ -86,6 +87,12 @@ struct WrappedID3D12DebugCommandQueue : public ID3D12DebugCommandQueue
AddRef();
return S_OK;
}
else if(riid == __uuidof(ID3D12DebugCommandQueue1))
{
*ppvObject = (ID3D12DebugCommandQueue1 *)this;
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
@@ -103,6 +110,23 @@ struct WrappedID3D12DebugCommandQueue : public ID3D12DebugCommandQueue
return m_pReal->AssertResourceState(Unwrap(pResource), Subresource, State);
return TRUE;
}
//////////////////////////////
// implement ID3D12DebugCommandQueue1
virtual void STDMETHODCALLTYPE AssertResourceAccess(ID3D12Resource *pResource, UINT Subresource,
D3D12_BARRIER_ACCESS Access)
{
if(m_pReal1)
m_pReal1->AssertResourceAccess(Unwrap(pResource), Subresource, Access);
}
virtual void STDMETHODCALLTYPE AssertTextureLayout(ID3D12Resource *pResource, UINT Subresource,
D3D12_BARRIER_LAYOUT Layout)
{
if(m_pReal1)
m_pReal1->AssertTextureLayout(Unwrap(pResource), Subresource, Layout);
}
};
struct WrappedDownlevelQueue : public ID3D12CommandQueueDownlevel
+30
View File
@@ -388,6 +388,7 @@ WrappedID3D12CommandQueue::WrappedID3D12CommandQueue(ID3D12CommandQueue *real,
if(m_pReal)
{
m_pReal->QueryInterface(__uuidof(ID3D12DebugCommandQueue), (void **)&m_WrappedDebug.m_pReal);
m_pReal->QueryInterface(__uuidof(ID3D12DebugCommandQueue1), (void **)&m_WrappedDebug.m_pReal1);
m_pReal->QueryInterface(__uuidof(ID3D12CommandQueueDownlevel), (void **)&m_pDownlevel);
m_pReal->QueryInterface(__uuidof(ID3D12CompatibilityQueue), (void **)&m_WrappedCompat.m_pReal);
}
@@ -449,6 +450,7 @@ WrappedID3D12CommandQueue::~WrappedID3D12CommandQueue()
SAFE_RELEASE(m_WrappedCompat.m_pReal);
SAFE_RELEASE(m_WrappedDebug.m_pReal);
SAFE_RELEASE(m_WrappedDebug.m_pReal1);
SAFE_RELEASE(m_pReal);
}
@@ -479,6 +481,19 @@ HRESULT STDMETHODCALLTYPE WrappedID3D12CommandQueue::QueryInterface(REFIID riid,
return E_NOINTERFACE;
}
}
else if(riid == __uuidof(ID3D12DebugCommandQueue1))
{
if(m_WrappedDebug.m_pReal1)
{
AddRef();
*ppvObject = (ID3D12DebugCommandQueue1 *)&m_WrappedDebug;
return S_OK;
}
else
{
return E_NOINTERFACE;
}
}
else if(riid == __uuidof(ID3D12CompatibilityQueue))
{
if(m_WrappedCompat.m_pReal)
@@ -1140,6 +1155,7 @@ WrappedID3D12GraphicsCommandList::WrappedID3D12GraphicsCommandList(ID3D12Graphic
m_pList->QueryInterface(__uuidof(ID3D12DebugCommandList), (void **)&m_WrappedDebug.m_pReal);
m_pList->QueryInterface(__uuidof(ID3D12DebugCommandList1), (void **)&m_WrappedDebug.m_pReal1);
m_pList->QueryInterface(__uuidof(ID3D12DebugCommandList2), (void **)&m_WrappedDebug.m_pReal2);
m_pList->QueryInterface(__uuidof(ID3D12DebugCommandList3), (void **)&m_WrappedDebug.m_pReal3);
m_pList->QueryInterface(__uuidof(ID3D12GraphicsCommandList1), (void **)&m_pList1);
m_pList->QueryInterface(__uuidof(ID3D12GraphicsCommandList2), (void **)&m_pList2);
@@ -1222,6 +1238,7 @@ WrappedID3D12GraphicsCommandList::~WrappedID3D12GraphicsCommandList()
SAFE_RELEASE(m_WrappedDebug.m_pReal);
SAFE_RELEASE(m_WrappedDebug.m_pReal1);
SAFE_RELEASE(m_WrappedDebug.m_pReal2);
SAFE_RELEASE(m_WrappedDebug.m_pReal3);
SAFE_RELEASE(m_pList5);
SAFE_RELEASE(m_pList4);
SAFE_RELEASE(m_pList3);
@@ -1311,6 +1328,19 @@ HRESULT STDMETHODCALLTYPE WrappedID3D12GraphicsCommandList::QueryInterface(REFII
return E_NOINTERFACE;
}
}
else if(riid == __uuidof(ID3D12DebugCommandList3))
{
if(m_WrappedDebug.m_pReal3)
{
AddRef();
*ppvObject = (ID3D12DebugCommandList3 *)&m_WrappedDebug;
return S_OK;
}
else
{
return E_NOINTERFACE;
}
}
else if(riid == __uuidof(ID3D12GraphicsCommandList1))
{
if(m_pList1)
+9
View File
@@ -378,6 +378,8 @@ TextureType MakeTextureDim(D3D12_UAV_DIMENSION dim)
case D3D12_UAV_DIMENSION_TEXTURE1DARRAY: return TextureType::Texture1DArray;
case D3D12_UAV_DIMENSION_TEXTURE2D: return TextureType::Texture2D;
case D3D12_UAV_DIMENSION_TEXTURE2DARRAY: return TextureType::Texture2DArray;
case D3D12_UAV_DIMENSION_TEXTURE2DMS: return TextureType::Texture2DMS;
case D3D12_UAV_DIMENSION_TEXTURE2DMSARRAY: return TextureType::Texture2DMSArray;
case D3D12_UAV_DIMENSION_TEXTURE3D: return TextureType::Texture3D;
default: break;
}
@@ -404,6 +406,7 @@ CompareFunction MakeCompareFunc(D3D12_COMPARISON_FUNC func)
{
switch(func)
{
case D3D12_COMPARISON_FUNC_NONE:
case D3D12_COMPARISON_FUNC_NEVER: return CompareFunction::Never;
case D3D12_COMPARISON_FUNC_LESS: return CompareFunction::Less;
case D3D12_COMPARISON_FUNC_EQUAL: return CompareFunction::Equal;
@@ -451,6 +454,10 @@ TextureFilter MakeFilter(D3D12_FILTER filter)
case D3D12_FILTER_ANISOTROPIC:
ret.minify = ret.magnify = ret.mip = FilterMode::Anisotropic;
break;
case D3D12_FILTER_MIN_MAG_ANISOTROPIC_MIP_POINT:
ret.minify = ret.magnify = FilterMode::Anisotropic;
ret.mip = FilterMode::Point;
break;
case D3D12_FILTER_MIN_MAG_MIP_POINT:
ret.minify = ret.magnify = ret.mip = FilterMode::Point;
break;
@@ -558,6 +565,8 @@ BlendMultiplier MakeBlendMultiplier(D3D12_BLEND blend, bool alpha)
case D3D12_BLEND_INV_SRC1_COLOR: return BlendMultiplier::InvSrc1Col;
case D3D12_BLEND_SRC1_ALPHA: return BlendMultiplier::Src1Alpha;
case D3D12_BLEND_INV_SRC1_ALPHA: return BlendMultiplier::InvSrc1Alpha;
case D3D12_BLEND_ALPHA_FACTOR: return BlendMultiplier::FactorAlpha;
case D3D12_BLEND_INV_ALPHA_FACTOR: return BlendMultiplier::InvFactorAlpha;
default: break;
}
+2
View File
@@ -738,6 +738,8 @@ DECLARE_REFLECTION_STRUCT(D3D12_TEX1D_UAV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX1D_ARRAY_UAV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX2D_UAV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX2D_ARRAY_UAV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX2DMS_UAV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX2DMS_ARRAY_UAV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX3D_UAV);
DECLARE_REFLECTION_STRUCT(D3D12_UNORDERED_ACCESS_VIEW_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_DEPTH_STENCIL_VALUE);
+16
View File
@@ -550,6 +550,8 @@ WrappedID3D12Device::WrappedID3D12Device(ID3D12Device *realDevice, D3D12InitPara
(void **)&m_DREDSettings.m_pReal);
m_pDevice->QueryInterface(__uuidof(ID3D12DeviceRemovedExtendedDataSettings1),
(void **)&m_DREDSettings.m_pReal1);
m_pDevice->QueryInterface(__uuidof(ID3D12DeviceRemovedExtendedDataSettings2),
(void **)&m_DREDSettings.m_pReal2);
m_pDevice->QueryInterface(__uuidof(ID3D12DeviceDownlevel), (void **)&m_pDownlevel);
m_pDevice->QueryInterface(__uuidof(ID3D12CompatibilityDevice), (void **)&m_CompatDevice.m_pReal);
m_pDevice->QueryInterface(__uuidof(ID3D12SharingContract), (void **)&m_SharingContract.m_pReal);
@@ -834,6 +836,7 @@ WrappedID3D12Device::~WrappedID3D12Device()
SAFE_RELEASE(m_DRED.m_pReal1);
SAFE_RELEASE(m_DREDSettings.m_pReal);
SAFE_RELEASE(m_DREDSettings.m_pReal1);
SAFE_RELEASE(m_DREDSettings.m_pReal2);
SAFE_RELEASE(m_CompatDevice.m_pReal);
SAFE_RELEASE(m_SharingContract.m_pReal);
SAFE_RELEASE(m_pDownlevel);
@@ -1246,6 +1249,19 @@ HRESULT WrappedID3D12Device::QueryInterface(REFIID riid, void **ppvObject)
return E_NOINTERFACE;
}
}
else if(riid == __uuidof(ID3D12DeviceRemovedExtendedDataSettings2))
{
if(m_DREDSettings.m_pReal2)
{
AddRef();
*ppvObject = (ID3D12DeviceRemovedExtendedDataSettings2 *)&m_DREDSettings;
return S_OK;
}
else
{
return E_NOINTERFACE;
}
}
else if(riid == IRenderDoc_uuid)
{
AddRef();
+12 -2
View File
@@ -360,11 +360,12 @@ struct WrappedDRED : public ID3D12DeviceRemovedExtendedData1
}
};
struct WrappedDREDSettings : public ID3D12DeviceRemovedExtendedDataSettings1
struct WrappedDREDSettings : public ID3D12DeviceRemovedExtendedDataSettings2
{
WrappedID3D12Device &m_pDevice;
ID3D12DeviceRemovedExtendedDataSettings *m_pReal = NULL;
ID3D12DeviceRemovedExtendedDataSettings1 *m_pReal1 = NULL;
ID3D12DeviceRemovedExtendedDataSettings2 *m_pReal2 = NULL;
WrappedDREDSettings(WrappedID3D12Device &dev) : m_pDevice(dev) {}
//////////////////////////////
@@ -392,7 +393,16 @@ struct WrappedDREDSettings : public ID3D12DeviceRemovedExtendedDataSettings1
// implement ID3D12DeviceRemovedExtendedDataSettings1
virtual void STDMETHODCALLTYPE SetBreadcrumbContextEnablement(D3D12_DRED_ENABLEMENT Enablement)
{
m_pReal1->SetBreadcrumbContextEnablement(Enablement);
if(m_pReal1)
m_pReal1->SetBreadcrumbContextEnablement(Enablement);
}
//////////////////////////////
// implement ID3D12DeviceRemovedExtendedDataSettings2
virtual void STDMETHODCALLTYPE UseMarkersOnlyAutoBreadcrumbs(BOOL MarkersOnly)
{
if(m_pReal2)
m_pReal2->UseMarkersOnlyAutoBreadcrumbs(MarkersOnly);
}
};
+2 -2
View File
@@ -3359,10 +3359,10 @@ HRESULT WrappedID3D12Device::CheckFeatureSupport(D3D12_FEATURE Feature, void *pF
return E_INVALIDARG;
if(dolog)
RDCLOG("Clamping shader model from 0x%x to 6.6", model->HighestShaderModel);
RDCLOG("Clamping shader model from 0x%x to 6.7", model->HighestShaderModel);
// clamp SM to what we support
model->HighestShaderModel = RDCMIN(model->HighestShaderModel, D3D_SHADER_MODEL_6_6);
model->HighestShaderModel = RDCMIN(model->HighestShaderModel, D3D_SHADER_MODEL_6_7);
return S_OK;
}
+41 -5
View File
@@ -105,7 +105,7 @@ public:
// The inheritance is awful for these. See WrappedID3D12DebugDevice for why there are multiple
// parent classes
class WrappedID3D12Debug : public RefCounter12<ID3D12Debug>,
public ID3D12Debug5,
public ID3D12Debug6,
public ID3D12Debug1,
public ID3D12Debug2
{
@@ -148,6 +148,24 @@ public:
AddRef();
return S_OK;
}
if(riid == __uuidof(ID3D12Debug4))
{
*ppvObject = (ID3D12Debug4 *)this;
AddRef();
return S_OK;
}
if(riid == __uuidof(ID3D12Debug5))
{
*ppvObject = (ID3D12Debug5 *)this;
AddRef();
return S_OK;
}
if(riid == __uuidof(ID3D12Debug6))
{
*ppvObject = (ID3D12Debug6 *)this;
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
@@ -169,6 +187,9 @@ public:
//////////////////////////////
// Implement ID3D12Debug5
virtual void STDMETHODCALLTYPE SetEnableAutoName(BOOL Enable) {}
//////////////////////////////
// Implement ID3D12Debug6
virtual void STDMETHODCALLTYPE SetForceLegacyBarrierValidation(BOOL Enable) {}
};
class D3D12Hook : LibraryHook
@@ -416,26 +437,41 @@ private:
static HRESULT WINAPI D3D12GetDebugInterface_hook(REFIID riid, void **ppvDebug)
{
if(riid != __uuidof(ID3D12Debug))
if(riid == __uuidof(ID3D12Debug))
{
*ppvDebug = (ID3D12Debug *)(new WrappedID3D12Debug());
return S_OK;
}
else if(riid != __uuidof(ID3D12Debug1))
else if(riid == __uuidof(ID3D12Debug1))
{
*ppvDebug = (ID3D12Debug1 *)(new WrappedID3D12Debug());
return S_OK;
}
else if(riid != __uuidof(ID3D12Debug2))
else if(riid == __uuidof(ID3D12Debug2))
{
*ppvDebug = (ID3D12Debug2 *)(new WrappedID3D12Debug());
return S_OK;
}
else if(riid != __uuidof(ID3D12Debug3))
else if(riid == __uuidof(ID3D12Debug3))
{
*ppvDebug = (ID3D12Debug3 *)(new WrappedID3D12Debug());
return S_OK;
}
else if(riid == __uuidof(ID3D12Debug4))
{
*ppvDebug = (ID3D12Debug4 *)(new WrappedID3D12Debug());
return S_OK;
}
else if(riid == __uuidof(ID3D12Debug5))
{
*ppvDebug = (ID3D12Debug5 *)(new WrappedID3D12Debug());
return S_OK;
}
else if(riid == __uuidof(ID3D12Debug6))
{
*ppvDebug = (ID3D12Debug6 *)(new WrappedID3D12Debug());
return S_OK;
}
else
{
IUnknown *releaseme = NULL;
+8
View File
@@ -950,6 +950,14 @@ void D3D12Replay::FillResourceView(D3D12Pipe::View &view, const D3D12Descriptor
view.firstSlice = uav.Texture2DArray.FirstArraySlice & 0xffff;
view.firstMip = uav.Texture2DArray.MipSlice & 0xff;
}
else if(uav.ViewDimension == D3D12_UAV_DIMENSION_TEXTURE2DMS)
{
}
else if(uav.ViewDimension == D3D12_UAV_DIMENSION_TEXTURE2DMSARRAY)
{
view.numSlices = uav.Texture2DMSArray.ArraySize & 0xffff;
view.firstSlice = uav.Texture2DMSArray.FirstArraySlice & 0xffff;
}
else if(uav.ViewDimension == D3D12_UAV_DIMENSION_TEXTURE3D)
{
view.numSlices = uav.Texture3D.WSize & 0xffff;
+15 -3
View File
@@ -648,10 +648,22 @@ D3D12_UNORDERED_ACCESS_VIEW_DESC MakeUAVDesc(const D3D12_RESOURCE_DESC &desc)
}
else if(desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE2D)
{
ret.ViewDimension = arrayed ? D3D12_UAV_DIMENSION_TEXTURE2DARRAY : D3D12_UAV_DIMENSION_TEXTURE2D;
if(desc.SampleDesc.Count > 1)
{
ret.ViewDimension =
arrayed ? D3D12_UAV_DIMENSION_TEXTURE2DMSARRAY : D3D12_UAV_DIMENSION_TEXTURE2DMS;
if(arrayed)
ret.Texture2DArray.ArraySize = desc.DepthOrArraySize;
if(arrayed)
ret.Texture2DMSArray.ArraySize = desc.DepthOrArraySize;
}
else
{
ret.ViewDimension =
arrayed ? D3D12_UAV_DIMENSION_TEXTURE2DARRAY : D3D12_UAV_DIMENSION_TEXTURE2D;
if(arrayed)
ret.Texture2DArray.ArraySize = desc.DepthOrArraySize;
}
}
else if(desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D)
{
+1 -1
View File
@@ -1022,7 +1022,7 @@ public:
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
{
if(riid == __uuidof(ID3D12Resource2))
if(riid == __uuidof(ID3D12ManualWriteTrackingResource))
{
return E_NOINTERFACE;
}
@@ -1144,6 +1144,18 @@ void DoSerialise(SerialiserType &ser, D3D12_TEX2D_ARRAY_UAV &el)
SERIALISE_MEMBER(PlaneSlice);
}
template <class SerialiserType>
void DoSerialise(SerialiserType &ser, D3D12_TEX2DMS_UAV &el)
{
}
template <class SerialiserType>
void DoSerialise(SerialiserType &ser, D3D12_TEX2DMS_ARRAY_UAV &el)
{
SERIALISE_MEMBER(FirstArraySlice);
SERIALISE_MEMBER(ArraySize);
}
template <class SerialiserType>
void DoSerialise(SerialiserType &ser, D3D12_TEX3D_UAV &el)
{
@@ -1168,6 +1180,8 @@ void DoSerialise(SerialiserType &ser, D3D12_UNORDERED_ACCESS_VIEW_DESC &el)
case D3D12_UAV_DIMENSION_TEXTURE1DARRAY: SERIALISE_MEMBER(Texture1DArray); break;
case D3D12_UAV_DIMENSION_TEXTURE2D: SERIALISE_MEMBER(Texture2D); break;
case D3D12_UAV_DIMENSION_TEXTURE2DARRAY: SERIALISE_MEMBER(Texture2DArray); break;
case D3D12_UAV_DIMENSION_TEXTURE2DMS: SERIALISE_MEMBER(Texture2DMS); break;
case D3D12_UAV_DIMENSION_TEXTURE2DMSARRAY: SERIALISE_MEMBER(Texture2DMSArray); break;
case D3D12_UAV_DIMENSION_TEXTURE3D: SERIALISE_MEMBER(Texture3D); break;
default: RDCERR("Unrecognised RTV Dimension %d", el.ViewDimension); break;
}
@@ -928,6 +928,28 @@ ShaderVariable D3D12DebugAPIWrapper::GetResourceInfo(DXBCBytecode::OperandType t
break;
}
case D3D12_UAV_DIMENSION_TEXTURE2DMS:
case D3D12_UAV_DIMENSION_TEXTURE2DMSARRAY:
{
// note, DXBC doesn't support MSAA UAVs so this is here mostly for completeness and sanity
dim = 2;
result.value.u32v[0] = RDCMAX(1U, (uint32_t)(resDesc.Width >> mipLevel));
result.value.u32v[1] = RDCMAX(1U, (uint32_t)(resDesc.Height >> mipLevel));
if(uavDesc.ViewDimension == D3D12_UAV_DIMENSION_TEXTURE2DMS)
result.value.u32v[2] = 0;
else if(uavDesc.ViewDimension == D3D12_UAV_DIMENSION_TEXTURE2DMSARRAY)
result.value.u32v[2] = uavDesc.Texture2DMSArray.ArraySize;
// spec says "For UAVs (u#), the number of mip levels is always 1."
result.value.u32v[3] = 1;
if(mipLevel >= result.value.u32v[3])
result.value.u32v[0] = result.value.u32v[1] = result.value.u32v[2] = 0;
break;
}
case D3D12_UAV_DIMENSION_TEXTURE3D:
{
dim = 3;
@@ -261,6 +261,7 @@ rdcstr DoStringise(const D3D12_HEAP_TYPE &el)
STRINGISE_ENUM(D3D12_HEAP_TYPE_UPLOAD)
STRINGISE_ENUM(D3D12_HEAP_TYPE_READBACK)
STRINGISE_ENUM(D3D12_HEAP_TYPE_CUSTOM)
STRINGISE_ENUM(D3D12_HEAP_TYPE_GPU_UPLOAD)
}
END_ENUM_STRINGISE();
}
@@ -404,6 +405,8 @@ rdcstr DoStringise(const D3D12_UAV_DIMENSION &el)
STRINGISE_ENUM(D3D12_UAV_DIMENSION_TEXTURE1DARRAY)
STRINGISE_ENUM(D3D12_UAV_DIMENSION_TEXTURE2D)
STRINGISE_ENUM(D3D12_UAV_DIMENSION_TEXTURE2DARRAY)
STRINGISE_ENUM(D3D12_UAV_DIMENSION_TEXTURE2DMS)
STRINGISE_ENUM(D3D12_UAV_DIMENSION_TEXTURE2DMSARRAY)
STRINGISE_ENUM(D3D12_UAV_DIMENSION_TEXTURE3D)
}
END_ENUM_STRINGISE();
@@ -438,6 +441,7 @@ rdcstr DoStringise(const D3D12_FILTER &el)
STRINGISE_ENUM(D3D12_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR);
STRINGISE_ENUM(D3D12_FILTER_MIN_MAG_LINEAR_MIP_POINT);
STRINGISE_ENUM(D3D12_FILTER_MIN_MAG_MIP_LINEAR);
STRINGISE_ENUM(D3D12_FILTER_MIN_MAG_ANISOTROPIC_MIP_POINT);
STRINGISE_ENUM(D3D12_FILTER_ANISOTROPIC);
STRINGISE_ENUM(D3D12_FILTER_COMPARISON_MIN_MAG_MIP_POINT);
STRINGISE_ENUM(D3D12_FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR);
@@ -447,6 +451,7 @@ rdcstr DoStringise(const D3D12_FILTER &el)
STRINGISE_ENUM(D3D12_FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR);
STRINGISE_ENUM(D3D12_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT);
STRINGISE_ENUM(D3D12_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR);
STRINGISE_ENUM(D3D12_FILTER_COMPARISON_MIN_MAG_ANISOTROPIC_MIP_POINT);
STRINGISE_ENUM(D3D12_FILTER_COMPARISON_ANISOTROPIC);
STRINGISE_ENUM(D3D12_FILTER_MINIMUM_MIN_MAG_MIP_POINT);
STRINGISE_ENUM(D3D12_FILTER_MINIMUM_MIN_MAG_POINT_MIP_LINEAR);
@@ -456,6 +461,7 @@ rdcstr DoStringise(const D3D12_FILTER &el)
STRINGISE_ENUM(D3D12_FILTER_MINIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR);
STRINGISE_ENUM(D3D12_FILTER_MINIMUM_MIN_MAG_LINEAR_MIP_POINT);
STRINGISE_ENUM(D3D12_FILTER_MINIMUM_MIN_MAG_MIP_LINEAR);
STRINGISE_ENUM(D3D12_FILTER_MINIMUM_MIN_MAG_ANISOTROPIC_MIP_POINT);
STRINGISE_ENUM(D3D12_FILTER_MINIMUM_ANISOTROPIC);
STRINGISE_ENUM(D3D12_FILTER_MAXIMUM_MIN_MAG_MIP_POINT);
STRINGISE_ENUM(D3D12_FILTER_MAXIMUM_MIN_MAG_POINT_MIP_LINEAR);
@@ -465,6 +471,7 @@ rdcstr DoStringise(const D3D12_FILTER &el)
STRINGISE_ENUM(D3D12_FILTER_MAXIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR);
STRINGISE_ENUM(D3D12_FILTER_MAXIMUM_MIN_MAG_LINEAR_MIP_POINT);
STRINGISE_ENUM(D3D12_FILTER_MAXIMUM_MIN_MAG_MIP_LINEAR);
STRINGISE_ENUM(D3D12_FILTER_MAXIMUM_MIN_MAG_ANISOTROPIC_MIP_POINT);
STRINGISE_ENUM(D3D12_FILTER_MAXIMUM_ANISOTROPIC);
}
END_ENUM_STRINGISE();
@@ -514,6 +521,8 @@ rdcstr DoStringise(const D3D12_BLEND &el)
STRINGISE_ENUM(D3D12_BLEND_INV_SRC1_COLOR);
STRINGISE_ENUM(D3D12_BLEND_SRC1_ALPHA);
STRINGISE_ENUM(D3D12_BLEND_INV_SRC1_ALPHA);
STRINGISE_ENUM(D3D12_BLEND_ALPHA_FACTOR);
STRINGISE_ENUM(D3D12_BLEND_INV_ALPHA_FACTOR);
}
END_ENUM_STRINGISE();
}
@@ -612,6 +621,7 @@ rdcstr DoStringise(const D3D12_COMPARISON_FUNC &el)
BEGIN_ENUM_STRINGISE(D3D12_COMPARISON_FUNC);
{
STRINGISE_ENUM(D3D12_COMPARISON_FUNC_NONE);
STRINGISE_ENUM(D3D12_COMPARISON_FUNC_NEVER);
STRINGISE_ENUM(D3D12_COMPARISON_FUNC_LESS);
STRINGISE_ENUM(D3D12_COMPARISON_FUNC_EQUAL);
@@ -720,6 +730,10 @@ rdcstr DoStringise(const D3D12_COMMAND_LIST_TYPE &el)
STRINGISE_ENUM(D3D12_COMMAND_LIST_TYPE_BUNDLE)
STRINGISE_ENUM(D3D12_COMMAND_LIST_TYPE_COMPUTE)
STRINGISE_ENUM(D3D12_COMMAND_LIST_TYPE_COPY)
STRINGISE_ENUM(D3D12_COMMAND_LIST_TYPE_VIDEO_DECODE)
STRINGISE_ENUM(D3D12_COMMAND_LIST_TYPE_VIDEO_PROCESS)
STRINGISE_ENUM(D3D12_COMMAND_LIST_TYPE_VIDEO_ENCODE)
STRINGISE_ENUM(D3D12_COMMAND_LIST_TYPE_NONE)
}
END_ENUM_STRINGISE();
}
@@ -976,6 +990,7 @@ rdcstr DoStringise(const D3D12_HEAP_FLAGS &el)
STRINGISE_BITFIELD_BIT(D3D12_HEAP_FLAG_ALLOW_SHADER_ATOMICS);
STRINGISE_BITFIELD_BIT(D3D12_HEAP_FLAG_CREATE_NOT_RESIDENT);
STRINGISE_BITFIELD_BIT(D3D12_HEAP_FLAG_CREATE_NOT_ZEROED);
STRINGISE_BITFIELD_BIT(D3D12_HEAP_FLAG_TOOLS_USE_MANUAL_WRITE_TRACKING);
}
END_BITFIELD_STRINGISE();
}
@@ -1062,6 +1077,8 @@ rdcstr DoStringise(const D3D12_PIPELINE_STATE_FLAGS &el)
STRINGISE_BITFIELD_VALUE(D3D12_PIPELINE_STATE_FLAG_NONE);
STRINGISE_BITFIELD_BIT(D3D12_PIPELINE_STATE_FLAG_TOOL_DEBUG);
STRINGISE_BITFIELD_BIT(D3D12_PIPELINE_STATE_FLAG_DYNAMIC_DEPTH_BIAS);
STRINGISE_BITFIELD_BIT(D3D12_PIPELINE_STATE_FLAG_DYNAMIC_INDEX_BUFFER_STRIP_CUT);
}
END_BITFIELD_STRINGISE();
}
@@ -1079,6 +1096,9 @@ rdcstr DoStringise(const D3D12_RESOURCE_FLAGS &el)
STRINGISE_BITFIELD_BIT(D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE);
STRINGISE_BITFIELD_BIT(D3D12_RESOURCE_FLAG_ALLOW_CROSS_ADAPTER);
STRINGISE_BITFIELD_BIT(D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS);
STRINGISE_BITFIELD_BIT(D3D12_RESOURCE_FLAG_VIDEO_DECODE_REFERENCE_ONLY);
STRINGISE_BITFIELD_BIT(D3D12_RESOURCE_FLAG_VIDEO_ENCODE_REFERENCE_ONLY);
STRINGISE_BITFIELD_BIT(D3D12_RESOURCE_FLAG_RAYTRACING_ACCELERATION_STRUCTURE);
}
END_BITFIELD_STRINGISE();
}
+21 -14
View File
@@ -147,6 +147,7 @@ UINT GetByteSize(int Width, int Height, int Depth, DXGI_FORMAT Format, int mip)
ret *= 1;
break;
case DXGI_FORMAT_B4G4R4A4_UNORM:
case DXGI_FORMAT_A4B4G4R4_UNORM:
ret *= 2; // 4 channels, half a byte each
break;
/*
@@ -1420,7 +1421,8 @@ DXGI_FORMAT GetTypelessFormat(DXGI_FORMAT f)
case DXGI_FORMAT_P208:
case DXGI_FORMAT_V208:
case DXGI_FORMAT_V408:
case DXGI_FORMAT_B4G4R4A4_UNORM: return f;
case DXGI_FORMAT_B4G4R4A4_UNORM:
case DXGI_FORMAT_A4B4G4R4_UNORM: return f;
case DXGI_FORMAT_UNKNOWN: return DXGI_FORMAT_UNKNOWN;
@@ -1565,8 +1567,7 @@ D3D_PRIMITIVE_TOPOLOGY MakeD3DPrimitiveTopology(Topology Topo)
{
switch(Topo)
{
case Topology::LineLoop:
case Topology::TriangleFan: RDCWARN("Unsupported primitive topology on D3D: %x", Topo); break;
case Topology::LineLoop: RDCWARN("Unsupported primitive topology on D3D: %x", Topo); break;
default:
case Topology::Unknown: return D3D_PRIMITIVE_TOPOLOGY_UNDEFINED;
case Topology::PointList: return D3D_PRIMITIVE_TOPOLOGY_POINTLIST;
@@ -1574,6 +1575,7 @@ D3D_PRIMITIVE_TOPOLOGY MakeD3DPrimitiveTopology(Topology Topo)
case Topology::LineStrip: return D3D_PRIMITIVE_TOPOLOGY_LINESTRIP;
case Topology::TriangleList: return D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
case Topology::TriangleStrip: return D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP;
case Topology::TriangleFan: return D3D_PRIMITIVE_TOPOLOGY_TRIANGLEFAN;
case Topology::LineList_Adj: return D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ;
case Topology::LineStrip_Adj: return D3D_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ;
case Topology::TriangleList_Adj: return D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ;
@@ -2050,6 +2052,7 @@ Topology MakePrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY Topo)
case D3D_PRIMITIVE_TOPOLOGY_LINESTRIP: return Topology::LineStrip;
case D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST: return Topology::TriangleList;
case D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP: return Topology::TriangleStrip;
case D3D_PRIMITIVE_TOPOLOGY_TRIANGLEFAN: return Topology::TriangleFan;
case D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ: return Topology::LineList_Adj;
case D3D_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ: return Topology::LineStrip_Adj;
case D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ: return Topology::TriangleList_Adj;
@@ -2133,10 +2136,10 @@ DXGI_FORMAT MakeDXGIFormat(ResourceFormat fmt)
break;
case ResourceFormatType::R9G9B9E5: ret = DXGI_FORMAT_R9G9B9E5_SHAREDEXP; break;
case ResourceFormatType::R4G4B4A4:
// only support bgra order
if(!fmt.BGRAOrder())
return DXGI_FORMAT_UNKNOWN;
ret = DXGI_FORMAT_B4G4R4A4_UNORM;
if(fmt.BGRAOrder())
ret = DXGI_FORMAT_B4G4R4A4_UNORM;
else
ret = DXGI_FORMAT_A4B4G4R4_UNORM;
break;
case ResourceFormatType::D24S8: ret = DXGI_FORMAT_R24G8_TYPELESS; break;
case ResourceFormatType::D32S8: ret = DXGI_FORMAT_R32G8X24_TYPELESS; break;
@@ -2392,7 +2395,8 @@ ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt)
case DXGI_FORMAT_R8G8B8A8_UINT:
case DXGI_FORMAT_R8G8B8A8_SNORM:
case DXGI_FORMAT_R8G8B8A8_SINT:
case DXGI_FORMAT_B4G4R4A4_UNORM: ret.compCount = 4; break;
case DXGI_FORMAT_B4G4R4A4_UNORM:
case DXGI_FORMAT_A4B4G4R4_UNORM: ret.compCount = 4; break;
case DXGI_FORMAT_R32G32B32_TYPELESS:
case DXGI_FORMAT_R32G32B32_FLOAT:
case DXGI_FORMAT_R32G32B32_UINT:
@@ -2664,6 +2668,7 @@ ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt)
case DXGI_FORMAT_R8G8_B8G8_UNORM:
case DXGI_FORMAT_G8R8_G8B8_UNORM:
case DXGI_FORMAT_B4G4R4A4_UNORM:
case DXGI_FORMAT_A4B4G4R4_UNORM:
case DXGI_FORMAT_B5G6R5_UNORM:
case DXGI_FORMAT_B5G5R5A1_UNORM:
case DXGI_FORMAT_B8G8R8A8_UNORM:
@@ -2852,9 +2857,7 @@ ResourceFormat MakeResourceFormat(DXGI_FORMAT fmt)
break;
case DXGI_FORMAT_B4G4R4A4_UNORM:
ret.type = ResourceFormatType::R4G4B4A4;
ret.SetBGRAOrder(true);
break;
case DXGI_FORMAT_A4B4G4R4_UNORM: ret.type = ResourceFormatType::R4G4B4A4; break;
case DXGI_FORMAT_UNKNOWN: ret.type = ResourceFormatType::Undefined; break;
@@ -2959,19 +2962,23 @@ INSTANTIATE_SERIALISE_TYPE(DXGI_ADAPTER_DESC);
TEST_CASE("DXGI formats", "[format][d3d]")
{
// must be updated by hand
DXGI_FORMAT maxFormat = DXGI_FORMAT_V408;
DXGI_FORMAT maxFormat = DXGI_FORMAT_A4B4G4R4_UNORM;
// we want to skip formats that we deliberately don't represent or handle.
auto isUnsupportedFormat = [](DXGI_FORMAT f) {
// gap in DXGI_FORMAT enum
// gaps in DXGI_FORMAT enum
if(f > DXGI_FORMAT_B4G4R4A4_UNORM && f < DXGI_FORMAT_P208)
return true;
if(f > DXGI_FORMAT_V408 && f < DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE)
return true;
return (f == DXGI_FORMAT_R1_UNORM || f == DXGI_FORMAT_R8G8_B8G8_UNORM ||
f == DXGI_FORMAT_G8R8_G8B8_UNORM || f == DXGI_FORMAT_B8G8R8X8_TYPELESS ||
f == DXGI_FORMAT_B8G8R8X8_UNORM || f == DXGI_FORMAT_B8G8R8X8_UNORM_SRGB ||
f == DXGI_FORMAT_NV11 || f == DXGI_FORMAT_AI44 || f == DXGI_FORMAT_IA44 ||
f == DXGI_FORMAT_P8 || f == DXGI_FORMAT_A8P8 || f == DXGI_FORMAT_P208 ||
f == DXGI_FORMAT_V208 || f == DXGI_FORMAT_V408 || f == DXGI_FORMAT_420_OPAQUE);
f == DXGI_FORMAT_V208 || f == DXGI_FORMAT_V408 || f == DXGI_FORMAT_420_OPAQUE ||
f == DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE ||
f == DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE);
};
SECTION("Only DXGI_FORMAT_UNKNOWN is ResourceFormatType::Undefined")
@@ -339,6 +339,7 @@ rdcarray<CounterResult> NVD3D12Counters::FetchCounters(const rdcarray<GPUCounter
break;
case D3D12_COMMAND_LIST_TYPE_BUNDLE:
case D3D12_COMMAND_LIST_TYPE_COPY:
case D3D12_COMMAND_LIST_TYPE_NONE:
case D3D12_COMMAND_LIST_TYPE_VIDEO_DECODE:
case D3D12_COMMAND_LIST_TYPE_VIDEO_PROCESS:
case D3D12_COMMAND_LIST_TYPE_VIDEO_ENCODE:
@@ -222,6 +222,11 @@ enum VariableType
VARTYPE_MIN12INT,
VARTYPE_MIN16INT,
VARTYPE_MIN16UINT,
VARTYPE_INT16,
VARTYPE_UINT16,
VARTYPE_FLOAT16,
VARTYPE_INT64,
VARTYPE_UINT64,
};
struct ShaderInputBind
@@ -358,11 +358,19 @@ CBufferVariableType DXBCContainer::ParseRDEFType(const RDEFHeader *h, const byte
case DXBC::VARTYPE_BOOL: ret.varType = VarType::Bool; break;
case DXBC::VARTYPE_MIN16UINT:
case DXBC::VARTYPE_UINT: ret.varType = VarType::UInt; break;
case DXBC::VARTYPE_INT64:
case DXBC::VARTYPE_UINT64:
case DXBC::VARTYPE_DOUBLE: ret.varType = VarType::Double; break;
case DXBC::VARTYPE_FLOAT:
case DXBC::VARTYPE_MIN8FLOAT:
case DXBC::VARTYPE_MIN10FLOAT:
case DXBC::VARTYPE_MIN16FLOAT:
ret.varType = VarType::Float;
break;
// new types are actually 16-bit, though alignment is still the same as 32-bit
case DXBC::VARTYPE_INT16: ret.varType = VarType::SShort; break;
case DXBC::VARTYPE_UINT16: ret.varType = VarType::UShort; break;
case DXBC::VARTYPE_FLOAT16: ret.varType = VarType::Half; break;
default: ret.varType = VarType::Float; break;
}