Files
renderdoc/renderdoc/driver/d3d12/d3d12_common.h
T
baldurk fdeea5204d Refactor and optimise D3D11 refcounting implementation
* In heavy D3D11 workloads the refcounting overhead especially during fast
  binding changes was significant. Refactoring the refcounting to work on a
  different model and deferring destruction of objects removes most of the
  overhead.
2020-09-10 13:35:32 +01:00

879 lines
33 KiB
C++

/******************************************************************************
* The MIT License (MIT)
*
* Copyright (c) 2019-2020 Baldur Karlsson
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
******************************************************************************/
#pragma once
#define INITGUID
#include "core/core.h"
#include "driver/dx/official/D3D12Downlevel.h"
#include "driver/dx/official/d3d12.h"
#include "driver/dx/official/dxgi1_4.h"
#include "driver/shaders/dxbc/dxbc_compile.h"
#include "serialise/serialiser.h"
// we need to use the most-derived native interface all over the place. To make things easier when
// new versions come out we typedef it here when we don't need the specific interface
using ID3D12GraphicsCommandListX = ID3D12GraphicsCommandList5;
// replay only class for handling marker regions
struct D3D12MarkerRegion
{
D3D12MarkerRegion(ID3D12GraphicsCommandList *list, const rdcstr &marker);
D3D12MarkerRegion(ID3D12CommandQueue *queue, const rdcstr &marker);
~D3D12MarkerRegion();
static void Set(ID3D12GraphicsCommandList *list, const rdcstr &marker);
static void Set(ID3D12CommandQueue *queue, const rdcstr &marker);
static void Begin(ID3D12GraphicsCommandList *list, const rdcstr &marker);
static void End(ID3D12GraphicsCommandList *list);
static void Begin(ID3D12CommandQueue *queue, const rdcstr &marker);
static void End(ID3D12CommandQueue *queue);
ID3D12GraphicsCommandList *list = NULL;
ID3D12CommandQueue *queue = NULL;
};
bool EnableD3D12DebugLayer(PFN_D3D12_GET_DEBUG_INTERFACE getDebugInterface = NULL);
HRESULT EnumAdapterByLuid(IDXGIFactory1 *factory, LUID luid, IDXGIAdapter **pAdapter);
inline void SetObjName(ID3D12Object *obj, const rdcstr &utf8name)
{
obj->SetName(StringFormat::UTF82Wide(utf8name).c_str());
}
#define PIX_EVENT_UNICODE_VERSION 0
#define PIX_EVENT_ANSI_VERSION 1
#define PIX_EVENT_PIX3BLOB_VERSION 2
rdcstr PIX3DecodeEventString(const UINT64 *pData);
inline rdcstr DecodeMarkerString(UINT Metadata, const void *pData, UINT Size)
{
rdcstr MarkerText = "";
// There may be a space appended to the marker string - see D3D12MarkerRegion::Begin
// If we encounter this extra space (or a null terminator), remove it.
if(Metadata == PIX_EVENT_UNICODE_VERSION)
{
const wchar_t *w = (const wchar_t *)pData;
MarkerText = StringFormat::Wide2UTF8(rdcwstr(w, Size / sizeof(wchar_t)));
if(!MarkerText.empty() && (MarkerText.back() == ' ' || MarkerText.back() == 0))
MarkerText.pop_back();
}
else if(Metadata == PIX_EVENT_ANSI_VERSION)
{
const char *c = (const char *)pData;
MarkerText = rdcstr(c, Size);
if(!MarkerText.empty() && (MarkerText.back() == ' ' || MarkerText.back() == 0))
MarkerText.pop_back();
}
else if(Metadata == PIX_EVENT_PIX3BLOB_VERSION)
{
MarkerText = PIX3DecodeEventString((UINT64 *)pData);
}
else
{
RDCERR("Unexpected/unsupported Metadata value %u in marker text", Metadata);
}
return MarkerText;
}
TextureType MakeTextureDim(D3D12_SRV_DIMENSION dim);
TextureType MakeTextureDim(D3D12_RTV_DIMENSION dim);
TextureType MakeTextureDim(D3D12_DSV_DIMENSION dim);
TextureType MakeTextureDim(D3D12_UAV_DIMENSION dim);
AddressMode MakeAddressMode(D3D12_TEXTURE_ADDRESS_MODE addr);
CompareFunction MakeCompareFunc(D3D12_COMPARISON_FUNC func);
TextureFilter MakeFilter(D3D12_FILTER filter);
D3DBufferViewFlags MakeBufferFlags(D3D12_BUFFER_SRV_FLAGS flags);
D3DBufferViewFlags MakeBufferFlags(D3D12_BUFFER_UAV_FLAGS flags);
LogicOperation MakeLogicOp(D3D12_LOGIC_OP op);
BlendMultiplier MakeBlendMultiplier(D3D12_BLEND blend, bool alpha);
BlendOperation MakeBlendOp(D3D12_BLEND_OP op);
StencilOperation MakeStencilOp(D3D12_STENCIL_OP op);
// similar to RDCUNIMPLEMENTED but for things that are hit often so we don't want to fire the
// debugbreak.
#define D3D12NOTIMP(...) \
{ \
static bool CONCAT(ignore, __LINE__) = false; \
if(!CONCAT(ignore, __LINE__)) \
{ \
RDCDEBUG("D3D12 not implemented - " __VA_ARGS__); \
CONCAT(ignore, __LINE__) = true; \
} \
}
// uncomment this to cause every internal ExecuteCommandLists to immediately call
// FlushLists(), and to only submit one command list at once to narrow
// down the cause of device lost errors
#define SINGLE_FLUSH_VALIDATE OPTION_OFF
// uncomment this to get verbose debugging about when/where/why partial command
// buffer replay is happening
#define VERBOSE_PARTIAL_REPLAY OPTION_OFF
ShaderStageMask ConvertVisibility(D3D12_SHADER_VISIBILITY ShaderVisibility);
UINT GetNumSubresources(ID3D12Device *dev, const D3D12_RESOURCE_DESC *desc);
class WrappedID3D12Device;
template <typename RealType>
class RefCounter12
{
private:
unsigned int m_iRefcount;
unsigned int m_InternalRefcount : 30;
unsigned int resident : 1;
unsigned int m_SelfDeleting : 1;
protected:
RealType *m_pReal;
void SetSelfDeleting(bool selfDelete) { m_SelfDeleting = selfDelete ? 1 : 0; }
// used for derived classes that need to soft ref but are handling their
// own self-deletion
public:
RefCounter12(RealType *real, bool selfDelete = true)
: m_pReal(real),
m_iRefcount(1),
m_InternalRefcount(0),
resident(1),
m_SelfDeleting(selfDelete ? 1 : 0)
{
}
virtual ~RefCounter12() {}
unsigned int GetRefCount() { return m_iRefcount; }
// some applications wrongly check refcount return values and expect them to
// match D3D's values. When we have some internal refs we need to hide, we
// add them here and they're subtracted from return values
void AddInternalRef() { m_InternalRefcount++; }
void ReleaseInternalRef() { m_InternalRefcount--; }
bool Resident() { return resident != 0; }
void SetResident(bool r) { resident = r ? 1 : 0; }
//////////////////////////////
// implement IUnknown
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
{
if(!m_pReal)
return E_NOINTERFACE;
return RefCountDXGIObject::WrapQueryInterface(m_pReal, riid, ppvObject);
}
ULONG STDMETHODCALLTYPE AddRef()
{
InterlockedIncrement(&m_iRefcount);
return m_iRefcount;
}
ULONG STDMETHODCALLTYPE Release()
{
unsigned int ret = InterlockedDecrement(&m_iRefcount);
if(ret == 0 && m_SelfDeleting)
delete this;
return ret;
}
unsigned int SoftRef(WrappedID3D12Device *device)
{
unsigned int ret = AddRef();
if(device)
device->SoftRef();
else
RDCWARN("No device pointer, is a deleted resource being AddRef()d?");
if(ret >= m_InternalRefcount)
ret -= m_InternalRefcount;
return ret;
}
unsigned int SoftRelease(WrappedID3D12Device *device)
{
unsigned int ret = Release();
if(device)
device->SoftRelease();
else
RDCWARN("No device pointer, is a deleted resource being Release()d?");
if(ret >= m_InternalRefcount)
ret -= m_InternalRefcount;
return ret;
}
};
struct D3D12RootSignatureParameter : D3D12_ROOT_PARAMETER1
{
D3D12RootSignatureParameter()
{
ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;
ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
// copy the POD ones first
Constants.Num32BitValues = 0;
Constants.RegisterSpace = 0;
Constants.ShaderRegister = 0;
}
D3D12RootSignatureParameter(const D3D12RootSignatureParameter &other) { *this = other; }
D3D12RootSignatureParameter &operator=(const D3D12RootSignatureParameter &other)
{
// copy first
ParameterType = other.ParameterType;
ShaderVisibility = other.ShaderVisibility;
// copy the POD ones first
Descriptor = other.Descriptor;
Constants = other.Constants;
ranges = other.ranges;
// repoint ranges
if(ParameterType == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE)
{
DescriptorTable.NumDescriptorRanges = (UINT)ranges.size();
DescriptorTable.pDescriptorRanges = &ranges[0];
}
return *this;
}
void MakeFrom(const D3D12_ROOT_PARAMETER1 &param, UINT &maxSpaceIndex)
{
ParameterType = param.ParameterType;
ShaderVisibility = param.ShaderVisibility;
// copy the POD ones first
Descriptor = param.Descriptor;
Constants = param.Constants;
if(ParameterType == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE)
{
ranges.resize(param.DescriptorTable.NumDescriptorRanges);
for(size_t i = 0; i < ranges.size(); i++)
{
ranges[i] = param.DescriptorTable.pDescriptorRanges[i];
maxSpaceIndex = RDCMAX(maxSpaceIndex, ranges[i].RegisterSpace + 1);
}
DescriptorTable.NumDescriptorRanges = (UINT)ranges.size();
DescriptorTable.pDescriptorRanges = &ranges[0];
}
else if(ParameterType == D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS)
{
maxSpaceIndex = RDCMAX(maxSpaceIndex, Constants.RegisterSpace + 1);
}
else
{
maxSpaceIndex = RDCMAX(maxSpaceIndex, Descriptor.RegisterSpace + 1);
}
}
void MakeFrom(const D3D12_ROOT_PARAMETER &param, UINT &numSpaces)
{
ParameterType = param.ParameterType;
ShaderVisibility = param.ShaderVisibility;
// copy the POD ones first
Descriptor.Flags = D3D12_ROOT_DESCRIPTOR_FLAG_DATA_VOLATILE;
Descriptor.RegisterSpace = param.Descriptor.RegisterSpace;
Descriptor.ShaderRegister = param.Descriptor.ShaderRegister;
Constants = param.Constants;
if(ParameterType == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE)
{
ranges.resize(param.DescriptorTable.NumDescriptorRanges);
for(size_t i = 0; i < ranges.size(); i++)
{
ranges[i].RangeType = param.DescriptorTable.pDescriptorRanges[i].RangeType;
ranges[i].NumDescriptors = param.DescriptorTable.pDescriptorRanges[i].NumDescriptors;
ranges[i].BaseShaderRegister = param.DescriptorTable.pDescriptorRanges[i].BaseShaderRegister;
ranges[i].RegisterSpace = param.DescriptorTable.pDescriptorRanges[i].RegisterSpace;
ranges[i].Flags = D3D12_DESCRIPTOR_RANGE_FLAG_DESCRIPTORS_VOLATILE |
D3D12_DESCRIPTOR_RANGE_FLAG_DATA_VOLATILE;
ranges[i].OffsetInDescriptorsFromTableStart =
param.DescriptorTable.pDescriptorRanges[i].OffsetInDescriptorsFromTableStart;
numSpaces = RDCMAX(numSpaces, ranges[i].RegisterSpace + 1);
}
DescriptorTable.NumDescriptorRanges = (UINT)ranges.size();
DescriptorTable.pDescriptorRanges = &ranges[0];
}
else if(ParameterType == D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS)
{
numSpaces = RDCMAX(numSpaces, Constants.RegisterSpace + 1);
}
else
{
numSpaces = RDCMAX(numSpaces, Descriptor.RegisterSpace + 1);
}
}
rdcarray<D3D12_DESCRIPTOR_RANGE1> ranges;
};
DECLARE_REFLECTION_STRUCT(D3D12RootSignatureParameter);
struct D3D12RootSignature
{
uint32_t maxSpaceIndex = 0;
uint32_t dwordLength = 0;
D3D12_ROOT_SIGNATURE_FLAGS Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE;
rdcarray<D3D12RootSignatureParameter> Parameters;
rdcarray<D3D12_STATIC_SAMPLER_DESC> StaticSamplers;
};
DECLARE_REFLECTION_STRUCT(D3D12RootSignature);
struct D3D12CommandSignature
{
bool graphics = true;
UINT numDraws = 0;
UINT ByteStride = 0;
rdcarray<D3D12_INDIRECT_ARGUMENT_DESC> arguments;
};
#define IMPLEMENT_FUNCTION_SERIALISED(ret, func, ...) \
ret func(__VA_ARGS__); \
template <typename SerialiserType> \
bool CONCAT(Serialise_, func(SerialiserType &ser, __VA_ARGS__));
#define INSTANTIATE_FUNCTION_SERIALISED(ret, parent, func, ...) \
template bool parent::CONCAT(Serialise_, func(ReadSerialiser &ser, __VA_ARGS__)); \
template bool parent::CONCAT(Serialise_, func(WriteSerialiser &ser, __VA_ARGS__));
#define CACHE_THREAD_SERIALISER() WriteSerialiser &ser = GetThreadSerialiser();
#define SERIALISE_TIME_CALL(...) \
{ \
WriteSerialiser &ser = GetThreadSerialiser(); \
ser.ChunkMetadata().timestampMicro = Timing::GetTick(); \
__VA_ARGS__; \
ser.ChunkMetadata().durationMicro = Timing::GetTick() - ser.ChunkMetadata().timestampMicro; \
}
// A handy macros to say "is the serialiser reading and we're doing replay-mode stuff?"
// The reason we check both is that checking the first allows the compiler to eliminate the other
// path at compile-time, and the second because we might be just struct-serialising in which case we
// should be doing no work to restore states.
// Writing is unambiguously during capture mode, so we don't have to check both in that case.
#define IsReplayingAndReading() (ser.IsReading() && IsReplayMode(m_State))
// this is special - these serialise overloads will fetch the ID during capture, serialise the ID
// directly as-if it were the original type, then on replay load up the resource if available.
// Really this is only one type of serialisation, but we declare a couple of overloads to account
// for resources being accessed through different interfaces in different functions
#define SERIALISE_D3D_INTERFACES() \
SERIALISE_INTERFACE(ID3D12Object); \
SERIALISE_INTERFACE(ID3D12DeviceChild); \
SERIALISE_INTERFACE(ID3D12Pageable); \
SERIALISE_INTERFACE(ID3D12CommandList); \
SERIALISE_INTERFACE(ID3D12GraphicsCommandList); \
SERIALISE_INTERFACE(ID3D12GraphicsCommandList1); \
SERIALISE_INTERFACE(ID3D12GraphicsCommandList2); \
SERIALISE_INTERFACE(ID3D12GraphicsCommandList3); \
SERIALISE_INTERFACE(ID3D12GraphicsCommandList4); \
SERIALISE_INTERFACE(ID3D12GraphicsCommandList5); \
SERIALISE_INTERFACE(ID3D12RootSignature); \
SERIALISE_INTERFACE(ID3D12Resource); \
SERIALISE_INTERFACE(ID3D12QueryHeap); \
SERIALISE_INTERFACE(ID3D12PipelineState); \
SERIALISE_INTERFACE(ID3D12Heap); \
SERIALISE_INTERFACE(ID3D12Fence); \
SERIALISE_INTERFACE(ID3D12DescriptorHeap); \
SERIALISE_INTERFACE(ID3D12CommandSignature); \
SERIALISE_INTERFACE(ID3D12CommandQueue); \
SERIALISE_INTERFACE(ID3D12CommandAllocator);
#define SERIALISE_INTERFACE(iface) DECLARE_REFLECTION_STRUCT(iface *)
SERIALISE_D3D_INTERFACES();
// a thin utility wrapper around a UINT64, that serialises a BufferLocation as an Id + Offset.
struct D3D12BufferLocation
{
D3D12BufferLocation(UINT64 l) : Location(l) {}
operator UINT64() const { return Location; }
UINT64 Location;
};
DECLARE_REFLECTION_STRUCT(D3D12BufferLocation);
DECLARE_REFLECTION_STRUCT(D3D12_CPU_DESCRIPTOR_HANDLE);
DECLARE_REFLECTION_STRUCT(D3D12_GPU_DESCRIPTOR_HANDLE);
inline bool operator==(const D3D12_CPU_DESCRIPTOR_HANDLE &l, const D3D12_CPU_DESCRIPTOR_HANDLE &r)
{
return l.ptr == r.ptr;
}
// expanded version of D3D12_GRAPHICS_PIPELINE_STATE_DESC / D3D12_COMPUTE_PIPELINE_STATE_DESC with
// all subobjects. No enums suitable to make this a stream though.
struct D3D12_EXPANDED_PIPELINE_STATE_STREAM_DESC
{
D3D12_EXPANDED_PIPELINE_STATE_STREAM_DESC() = default;
// construct from the normal graphics descriptor
D3D12_EXPANDED_PIPELINE_STATE_STREAM_DESC(const D3D12_GRAPHICS_PIPELINE_STATE_DESC &graphics);
// construct from the normal compute descriptor
D3D12_EXPANDED_PIPELINE_STATE_STREAM_DESC(const D3D12_COMPUTE_PIPELINE_STATE_DESC &compute);
// construct from the stream descriptor
D3D12_EXPANDED_PIPELINE_STATE_STREAM_DESC(const D3D12_PIPELINE_STATE_STREAM_DESC &stream);
// graphics properties
ID3D12RootSignature *pRootSignature = NULL;
D3D12_SHADER_BYTECODE VS = {};
D3D12_SHADER_BYTECODE PS = {};
D3D12_SHADER_BYTECODE DS = {};
D3D12_SHADER_BYTECODE HS = {};
D3D12_SHADER_BYTECODE GS = {};
D3D12_STREAM_OUTPUT_DESC StreamOutput = {};
D3D12_BLEND_DESC BlendState = {};
UINT SampleMask = 0;
D3D12_RASTERIZER_DESC RasterizerState = {};
D3D12_DEPTH_STENCIL_DESC1 DepthStencilState = {};
D3D12_INPUT_LAYOUT_DESC InputLayout = {};
D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue;
D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType;
D3D12_RT_FORMAT_ARRAY RTVFormats = {};
DXGI_FORMAT DSVFormat = DXGI_FORMAT_UNKNOWN;
DXGI_SAMPLE_DESC SampleDesc = {};
UINT NodeMask = 0;
D3D12_CACHED_PIPELINE_STATE CachedPSO = {};
D3D12_PIPELINE_STATE_FLAGS Flags = D3D12_PIPELINE_STATE_FLAG_NONE;
D3D12_VIEW_INSTANCING_DESC ViewInstancing = {};
// unique compute properties (many are duplicated above)
D3D12_SHADER_BYTECODE CS = {};
};
DECLARE_REFLECTION_STRUCT(D3D12_EXPANDED_PIPELINE_STATE_STREAM_DESC);
// subobject headers have to be aligned to pointer boundaries
#define SUBOBJECT_HEADER(subobj) \
D3D12_PIPELINE_STATE_SUBOBJECT_TYPE alignas(void *) CONCAT(header, subobj) = \
CONCAT(D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_, subobj);
// similar to D3D12_EXPANDED_PIPELINE_STATE_STREAM_DESC but a packed version that can be passed
// through a D3D12_PIPELINE_STATE_STREAM_DESC. Keeps members private to ensure it's only used for
// that.
struct D3D12_PACKED_PIPELINE_STATE_STREAM_DESC
{
public:
D3D12_PACKED_PIPELINE_STATE_STREAM_DESC() = default;
D3D12_PACKED_PIPELINE_STATE_STREAM_DESC(const D3D12_EXPANDED_PIPELINE_STATE_STREAM_DESC &expanded)
{
*this = expanded;
}
// unwrap in place
void Unwrap();
// initialise from an expanded descriptor
D3D12_PACKED_PIPELINE_STATE_STREAM_DESC &operator=(
const D3D12_EXPANDED_PIPELINE_STATE_STREAM_DESC &expanded);
const D3D12_PIPELINE_STATE_STREAM_DESC *AsDescStream()
{
if(m_ComputeStreamData.CS.BytecodeLength > 0)
{
m_StreamDesc.pPipelineStateSubobjectStream = &m_ComputeStreamData;
m_StreamDesc.SizeInBytes = sizeof(m_ComputeStreamData);
return &m_StreamDesc;
}
else
{
m_StreamDesc.pPipelineStateSubobjectStream = &m_GraphicsStreamData;
m_StreamDesc.SizeInBytes = sizeof(m_GraphicsStreamData);
return &m_StreamDesc;
}
}
private:
struct
{
// graphics properties
SUBOBJECT_HEADER(ROOT_SIGNATURE);
ID3D12RootSignature *pRootSignature = NULL;
SUBOBJECT_HEADER(INPUT_LAYOUT);
D3D12_INPUT_LAYOUT_DESC InputLayout = {};
SUBOBJECT_HEADER(VS);
D3D12_SHADER_BYTECODE VS = {};
SUBOBJECT_HEADER(PS);
D3D12_SHADER_BYTECODE PS = {};
SUBOBJECT_HEADER(DS);
D3D12_SHADER_BYTECODE DS = {};
SUBOBJECT_HEADER(HS);
D3D12_SHADER_BYTECODE HS = {};
SUBOBJECT_HEADER(GS);
D3D12_SHADER_BYTECODE GS = {};
SUBOBJECT_HEADER(STREAM_OUTPUT);
D3D12_STREAM_OUTPUT_DESC StreamOutput = {};
SUBOBJECT_HEADER(CACHED_PSO);
D3D12_CACHED_PIPELINE_STATE CachedPSO = {};
SUBOBJECT_HEADER(VIEW_INSTANCING);
D3D12_VIEW_INSTANCING_DESC ViewInstancing = {};
SUBOBJECT_HEADER(RASTERIZER);
D3D12_RASTERIZER_DESC RasterizerState = {};
SUBOBJECT_HEADER(RENDER_TARGET_FORMATS);
D3D12_RT_FORMAT_ARRAY RTVFormats = {};
SUBOBJECT_HEADER(DEPTH_STENCIL_FORMAT);
DXGI_FORMAT DSVFormat = DXGI_FORMAT_UNKNOWN;
SUBOBJECT_HEADER(PRIMITIVE_TOPOLOGY);
D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED;
SUBOBJECT_HEADER(IB_STRIP_CUT_VALUE);
D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue = D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_DISABLED;
SUBOBJECT_HEADER(NODE_MASK);
UINT NodeMask = 0;
SUBOBJECT_HEADER(SAMPLE_MASK);
UINT SampleMask = 0;
SUBOBJECT_HEADER(FLAGS);
D3D12_PIPELINE_STATE_FLAGS Flags = D3D12_PIPELINE_STATE_FLAG_NONE;
SUBOBJECT_HEADER(DEPTH_STENCIL1);
D3D12_DEPTH_STENCIL_DESC1 DepthStencilState = {};
#if ENABLED(RDOC_X64)
UINT pad0;
#endif
SUBOBJECT_HEADER(BLEND);
D3D12_BLEND_DESC BlendState = {};
#if ENABLED(RDOC_X64)
UINT pad1;
#endif
SUBOBJECT_HEADER(SAMPLE_DESC);
DXGI_SAMPLE_DESC SampleDesc = {};
} m_GraphicsStreamData;
struct
{
// compute properties
SUBOBJECT_HEADER(ROOT_SIGNATURE);
ID3D12RootSignature *pRootSignature = NULL;
SUBOBJECT_HEADER(CS);
D3D12_SHADER_BYTECODE CS = {};
SUBOBJECT_HEADER(NODE_MASK);
UINT NodeMask = 0;
SUBOBJECT_HEADER(CACHED_PSO);
D3D12_CACHED_PIPELINE_STATE CachedPSO = {};
SUBOBJECT_HEADER(FLAGS);
D3D12_PIPELINE_STATE_FLAGS Flags = D3D12_PIPELINE_STATE_FLAG_NONE;
} m_ComputeStreamData;
D3D12_PIPELINE_STATE_STREAM_DESC m_StreamDesc;
};
#undef SUBOBJECT_HEADER
DECLARE_REFLECTION_ENUM(D3D12_COMMAND_LIST_TYPE);
DECLARE_REFLECTION_ENUM(D3D12_HEAP_TYPE);
DECLARE_REFLECTION_ENUM(D3D12_CPU_PAGE_PROPERTY);
DECLARE_REFLECTION_ENUM(D3D12_MEMORY_POOL);
DECLARE_REFLECTION_ENUM(D3D12_QUERY_TYPE);
DECLARE_REFLECTION_ENUM(D3D12_QUERY_HEAP_TYPE);
DECLARE_REFLECTION_ENUM(D3D12_DESCRIPTOR_HEAP_TYPE);
DECLARE_REFLECTION_ENUM(D3D12_DESCRIPTOR_HEAP_FLAGS);
DECLARE_REFLECTION_ENUM(D3D12_PREDICATION_OP);
DECLARE_REFLECTION_ENUM(D3D12_CLEAR_FLAGS);
DECLARE_REFLECTION_ENUM(D3D12_DSV_DIMENSION);
DECLARE_REFLECTION_ENUM(D3D12_UAV_DIMENSION);
DECLARE_REFLECTION_ENUM(D3D12_SRV_DIMENSION);
DECLARE_REFLECTION_ENUM(D3D12_RTV_DIMENSION);
DECLARE_REFLECTION_ENUM(D3D12_DSV_FLAGS);
DECLARE_REFLECTION_ENUM(D3D12_BUFFER_SRV_FLAGS);
DECLARE_REFLECTION_ENUM(D3D12_BUFFER_UAV_FLAGS);
DECLARE_REFLECTION_ENUM(D3D12_RESOURCE_STATES);
DECLARE_REFLECTION_ENUM(D3D12_HEAP_FLAGS);
DECLARE_REFLECTION_ENUM(D3D12_FENCE_FLAGS);
DECLARE_REFLECTION_ENUM(D3D12_PRIMITIVE_TOPOLOGY_TYPE);
DECLARE_REFLECTION_ENUM(D3D12_PRIMITIVE_TOPOLOGY);
DECLARE_REFLECTION_ENUM(D3D12_INDIRECT_ARGUMENT_TYPE);
DECLARE_REFLECTION_ENUM(D3D12_PIPELINE_STATE_FLAGS);
DECLARE_REFLECTION_ENUM(D3D12_RESOURCE_BARRIER_TYPE);
DECLARE_REFLECTION_ENUM(D3D12_RESOURCE_BARRIER_FLAGS);
DECLARE_REFLECTION_ENUM(D3D12_INPUT_CLASSIFICATION);
DECLARE_REFLECTION_ENUM(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE);
DECLARE_REFLECTION_ENUM(D3D12_RESOURCE_DIMENSION);
DECLARE_REFLECTION_ENUM(D3D12_TEXTURE_LAYOUT);
DECLARE_REFLECTION_ENUM(D3D12_RESOURCE_FLAGS);
DECLARE_REFLECTION_ENUM(D3D12_COMMAND_QUEUE_FLAGS);
DECLARE_REFLECTION_ENUM(D3D12_TEXTURE_COPY_TYPE);
DECLARE_REFLECTION_ENUM(D3D12_FILL_MODE);
DECLARE_REFLECTION_ENUM(D3D12_CULL_MODE);
DECLARE_REFLECTION_ENUM(D3D12_FILTER);
DECLARE_REFLECTION_ENUM(D3D12_COMPARISON_FUNC);
DECLARE_REFLECTION_ENUM(D3D12_TEXTURE_ADDRESS_MODE);
DECLARE_REFLECTION_ENUM(D3D12_CONSERVATIVE_RASTERIZATION_MODE);
DECLARE_REFLECTION_ENUM(D3D12_LOGIC_OP);
DECLARE_REFLECTION_ENUM(D3D12_BLEND);
DECLARE_REFLECTION_ENUM(D3D12_BLEND_OP);
DECLARE_REFLECTION_ENUM(D3D12_STENCIL_OP);
DECLARE_REFLECTION_ENUM(D3D12_COLOR_WRITE_ENABLE);
DECLARE_REFLECTION_ENUM(D3D12_DEPTH_WRITE_MASK);
DECLARE_REFLECTION_ENUM(D3D12_VIEW_INSTANCING_FLAGS);
DECLARE_REFLECTION_ENUM(D3D12_RESOLVE_MODE);
DECLARE_REFLECTION_ENUM(D3D12_WRITEBUFFERIMMEDIATE_MODE);
DECLARE_REFLECTION_ENUM(D3D12_COMMAND_LIST_FLAGS);
DECLARE_REFLECTION_ENUM(D3D12_RENDER_PASS_FLAGS);
DECLARE_REFLECTION_ENUM(D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE);
DECLARE_REFLECTION_ENUM(D3D12_RENDER_PASS_ENDING_ACCESS_TYPE);
DECLARE_REFLECTION_ENUM(D3D12_SHADING_RATE);
DECLARE_REFLECTION_ENUM(D3D12_SHADING_RATE_COMBINER);
DECLARE_REFLECTION_ENUM(D3D12_ROOT_SIGNATURE_FLAGS);
DECLARE_REFLECTION_ENUM(D3D12_ROOT_PARAMETER_TYPE);
DECLARE_REFLECTION_ENUM(D3D12_ROOT_DESCRIPTOR_FLAGS);
DECLARE_REFLECTION_ENUM(D3D12_SHADER_VISIBILITY);
DECLARE_REFLECTION_ENUM(D3D12_STATIC_BORDER_COLOR);
DECLARE_REFLECTION_ENUM(D3D12_DESCRIPTOR_RANGE_TYPE);
DECLARE_REFLECTION_ENUM(D3D12_DESCRIPTOR_RANGE_FLAGS);
DECLARE_REFLECTION_STRUCT(D3D12_RESOURCE_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_COMMAND_QUEUE_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_SHADER_BYTECODE);
DECLARE_REFLECTION_STRUCT(D3D12_SO_DECLARATION_ENTRY);
DECLARE_REFLECTION_STRUCT(D3D12_STREAM_OUTPUT_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_RASTERIZER_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_DEPTH_STENCILOP_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_DEPTH_STENCIL_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_INPUT_ELEMENT_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_INPUT_LAYOUT_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_RENDER_TARGET_BLEND_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_BLEND_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_CACHED_PIPELINE_STATE);
DECLARE_REFLECTION_STRUCT(D3D12_GRAPHICS_PIPELINE_STATE_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_COMPUTE_PIPELINE_STATE_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_INDEX_BUFFER_VIEW);
DECLARE_REFLECTION_STRUCT(D3D12_VERTEX_BUFFER_VIEW);
DECLARE_REFLECTION_STRUCT(D3D12_STREAM_OUTPUT_BUFFER_VIEW);
DECLARE_REFLECTION_STRUCT(D3D12_RESOURCE_TRANSITION_BARRIER);
DECLARE_REFLECTION_STRUCT(D3D12_RESOURCE_ALIASING_BARRIER);
DECLARE_REFLECTION_STRUCT(D3D12_RESOURCE_UAV_BARRIER);
DECLARE_REFLECTION_STRUCT(D3D12_RESOURCE_BARRIER);
DECLARE_REFLECTION_STRUCT(D3D12_HEAP_PROPERTIES);
DECLARE_REFLECTION_STRUCT(D3D12_HEAP_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_DESCRIPTOR_HEAP_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_INDIRECT_ARGUMENT_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_COMMAND_SIGNATURE_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_QUERY_HEAP_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_SAMPLER_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_CONSTANT_BUFFER_VIEW_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_BUFFER_SRV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX1D_SRV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX1D_ARRAY_SRV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX2D_SRV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX2D_ARRAY_SRV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX2DMS_SRV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX2DMS_ARRAY_SRV);
DECLARE_REFLECTION_STRUCT(D3D12_TEXCUBE_SRV);
DECLARE_REFLECTION_STRUCT(D3D12_TEXCUBE_ARRAY_SRV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX3D_SRV);
DECLARE_REFLECTION_STRUCT(D3D12_SHADER_RESOURCE_VIEW_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_BUFFER_RTV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX1D_RTV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX1D_ARRAY_RTV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX2D_RTV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX2D_ARRAY_RTV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX2DMS_RTV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX2DMS_ARRAY_RTV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX3D_RTV);
DECLARE_REFLECTION_STRUCT(D3D12_RENDER_TARGET_VIEW_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_TEX1D_DSV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX1D_ARRAY_DSV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX2D_DSV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX2D_ARRAY_DSV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX2DMS_DSV);
DECLARE_REFLECTION_STRUCT(D3D12_TEX2DMS_ARRAY_DSV);
DECLARE_REFLECTION_STRUCT(D3D12_DEPTH_STENCIL_VIEW_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_BUFFER_UAV);
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_TEX3D_UAV);
DECLARE_REFLECTION_STRUCT(D3D12_UNORDERED_ACCESS_VIEW_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_DEPTH_STENCIL_VALUE);
DECLARE_REFLECTION_STRUCT(D3D12_CLEAR_VALUE);
DECLARE_REFLECTION_STRUCT(D3D12_PLACED_SUBRESOURCE_FOOTPRINT);
DECLARE_REFLECTION_STRUCT(D3D12_SUBRESOURCE_FOOTPRINT);
DECLARE_REFLECTION_STRUCT(D3D12_TEXTURE_COPY_LOCATION);
DECLARE_REFLECTION_STRUCT(D3D12_TILED_RESOURCE_COORDINATE);
DECLARE_REFLECTION_STRUCT(D3D12_TILE_REGION_SIZE);
DECLARE_REFLECTION_STRUCT(D3D12_DISCARD_REGION);
DECLARE_REFLECTION_STRUCT(D3D12_RANGE);
DECLARE_REFLECTION_STRUCT(D3D12_RECT);
DECLARE_REFLECTION_STRUCT(D3D12_BOX);
DECLARE_REFLECTION_STRUCT(D3D12_VIEWPORT);
DECLARE_REFLECTION_STRUCT(D3D12_RT_FORMAT_ARRAY);
DECLARE_REFLECTION_STRUCT(D3D12_DEPTH_STENCIL_DESC1);
DECLARE_REFLECTION_STRUCT(D3D12_VIEW_INSTANCE_LOCATION);
DECLARE_REFLECTION_STRUCT(D3D12_VIEW_INSTANCING_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_SAMPLE_POSITION);
DECLARE_REFLECTION_STRUCT(D3D12_RANGE_UINT64);
DECLARE_REFLECTION_STRUCT(D3D12_SUBRESOURCE_RANGE_UINT64);
DECLARE_REFLECTION_STRUCT(D3D12_WRITEBUFFERIMMEDIATE_PARAMETER);
DECLARE_REFLECTION_STRUCT(D3D12_DRAW_ARGUMENTS);
DECLARE_REFLECTION_STRUCT(D3D12_DRAW_INDEXED_ARGUMENTS);
DECLARE_REFLECTION_STRUCT(D3D12_DISPATCH_ARGUMENTS);
DECLARE_REFLECTION_STRUCT(D3D12_RENDER_PASS_BEGINNING_ACCESS_CLEAR_PARAMETERS);
DECLARE_REFLECTION_STRUCT(D3D12_RENDER_PASS_BEGINNING_ACCESS);
DECLARE_REFLECTION_STRUCT(D3D12_RENDER_PASS_ENDING_ACCESS_RESOLVE_SUBRESOURCE_PARAMETERS);
DECLARE_REFLECTION_STRUCT(D3D12_RENDER_PASS_ENDING_ACCESS_RESOLVE_PARAMETERS);
DECLARE_REFLECTION_STRUCT(D3D12_RENDER_PASS_ENDING_ACCESS);
DECLARE_REFLECTION_STRUCT(D3D12_RENDER_PASS_RENDER_TARGET_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_RENDER_PASS_DEPTH_STENCIL_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_STATIC_SAMPLER_DESC);
DECLARE_REFLECTION_STRUCT(D3D12_DESCRIPTOR_RANGE1);
DECLARE_REFLECTION_STRUCT(D3D12_ROOT_DESCRIPTOR_TABLE1);
DECLARE_REFLECTION_STRUCT(D3D12_ROOT_CONSTANTS);
DECLARE_REFLECTION_STRUCT(D3D12_ROOT_DESCRIPTOR1);
DECLARE_DESERIALISE_TYPE(D3D12_DISCARD_REGION);
DECLARE_DESERIALISE_TYPE(D3D12_GRAPHICS_PIPELINE_STATE_DESC);
DECLARE_DESERIALISE_TYPE(D3D12_COMPUTE_PIPELINE_STATE_DESC);
DECLARE_DESERIALISE_TYPE(D3D12_COMMAND_SIGNATURE_DESC);
DECLARE_DESERIALISE_TYPE(D3D12_EXPANDED_PIPELINE_STATE_STREAM_DESC);
DECLARE_DESERIALISE_TYPE(D3D12_RENDER_PASS_RENDER_TARGET_DESC);
DECLARE_DESERIALISE_TYPE(D3D12_RENDER_PASS_DEPTH_STENCIL_DESC);
enum class D3D12Chunk : uint32_t
{
SetName = (uint32_t)SystemChunk::FirstDriverChunk,
PushMarker,
SetMarker,
PopMarker,
SetShaderDebugPath,
CreateSwapBuffer,
Device_CreateCommandQueue,
Device_CreateCommandAllocator,
Device_CreateCommandList,
Device_CreateGraphicsPipeline,
Device_CreateComputePipeline,
Device_CreateDescriptorHeap,
Device_CreateRootSignature,
Device_CreateCommandSignature,
Device_CreateHeap,
Device_CreateCommittedResource,
Device_CreatePlacedResource,
Device_CreateQueryHeap,
Device_CreateFence,
Device_CreateReservedResource,
Device_CreateConstantBufferView,
Device_CreateShaderResourceView,
Device_CreateUnorderedAccessView,
Device_CreateRenderTargetView,
Device_CreateDepthStencilView,
Device_CreateSampler,
Device_CopyDescriptors,
Device_CopyDescriptorsSimple,
Queue_ExecuteCommandLists,
Queue_Signal,
Queue_Wait,
Queue_UpdateTileMappings,
Queue_CopyTileMappings,
List_Close,
List_Reset,
List_ResourceBarrier,
List_BeginQuery,
List_EndQuery,
List_ResolveQueryData,
List_SetPredication,
List_DrawIndexedInstanced,
List_DrawInstanced,
List_Dispatch,
List_ExecuteIndirect,
List_ExecuteBundle,
List_CopyBufferRegion,
List_CopyTextureRegion,
List_CopyResource,
List_ResolveSubresource,
List_ClearRenderTargetView,
List_ClearDepthStencilView,
List_ClearUnorderedAccessViewUint,
List_ClearUnorderedAccessViewFloat,
List_DiscardResource,
List_IASetPrimitiveTopology,
List_IASetIndexBuffer,
List_IASetVertexBuffers,
List_SOSetTargets,
List_RSSetViewports,
List_RSSetScissorRects,
List_SetPipelineState,
List_SetDescriptorHeaps,
List_OMSetRenderTargets,
List_OMSetStencilRef,
List_OMSetBlendFactor,
List_SetGraphicsRootDescriptorTable,
List_SetGraphicsRootSignature,
List_SetGraphicsRoot32BitConstant,
List_SetGraphicsRoot32BitConstants,
List_SetGraphicsRootConstantBufferView,
List_SetGraphicsRootShaderResourceView,
List_SetGraphicsRootUnorderedAccessView,
List_SetComputeRootDescriptorTable,
List_SetComputeRootSignature,
List_SetComputeRoot32BitConstant,
List_SetComputeRoot32BitConstants,
List_SetComputeRootConstantBufferView,
List_SetComputeRootShaderResourceView,
List_SetComputeRootUnorderedAccessView,
List_CopyTiles,
Resource_Unmap,
Resource_WriteToSubresource,
List_IndirectSubCommand,
Queue_BeginEvent,
Queue_SetMarker,
Queue_EndEvent,
Device_CreatePipelineState,
Device_CreateHeapFromAddress,
Device_CreateHeapFromFileMapping,
List_AtomicCopyBufferUINT,
List_AtomicCopyBufferUINT64,
List_OMSetDepthBounds,
List_ResolveSubresourceRegion,
List_SetSamplePositions,
List_SetViewInstanceMask,
List_WriteBufferImmediate,
Device_OpenSharedHandle,
Device_CreateCommandList1,
Device_CreateCommittedResource1,
Device_CreateHeap1,
List_BeginRenderPass,
List_EndRenderPass,
List_RSSetShadingRate,
List_RSSetShadingRateImage,
Device_ExternalDXGIResource,
Swapchain_Present,
List_ClearState,
CompatDevice_CreateSharedResource,
CompatDevice_CreateSharedHeap,
Max,
};