Add operator== and operator< to many interface structs

* This will enable the last few python list emulation functions, like
  index (which needs operator== to find objects) and sort (which
  obviously needs operator< to sort).
This commit is contained in:
baldurk
2017-12-13 22:43:03 +00:00
parent 0b527fab49
commit a75a036a12
11 changed files with 1696 additions and 33 deletions
@@ -32,6 +32,7 @@ struct ICaptureContext;
DOCUMENT("Information about a single resource bound to a slot in an API-specific way.");
struct BoundResource
{
DOCUMENT("");
BoundResource()
{
Id = ResourceId();
@@ -47,6 +48,23 @@ struct BoundResource
typeHint = CompType::Typeless;
}
bool operator==(const BoundResource &o) const
{
return Id == o.Id && HighestMip == o.HighestMip && FirstSlice == o.FirstSlice &&
typeHint == o.typeHint;
}
bool operator<(const BoundResource &o) const
{
if(Id != o.Id)
return Id < o.Id;
if(HighestMip != o.HighestMip)
return HighestMip < o.HighestMip;
if(FirstSlice != o.FirstSlice)
return FirstSlice < o.FirstSlice;
if(typeHint != o.typeHint)
return typeHint < o.typeHint;
return false;
}
DOCUMENT("A :class:`~renderdoc.ResourceId` identifying the bound resource.");
ResourceId Id;
DOCUMENT("For textures, the highest mip level available on this binding, or -1 for all mips");
@@ -66,6 +84,7 @@ support resource arrays, there will only be one bound resource.
)");
struct BoundResourceArray
{
DOCUMENT("");
BoundResourceArray() = default;
BoundResourceArray(BindpointMap b) : BindPoint(b) {}
BoundResourceArray(BindpointMap b, const rdcarray<BoundResource> &r) : BindPoint(b), Resources(r)
@@ -88,6 +107,21 @@ DECLARE_REFLECTION_STRUCT(BoundResourceArray);
DOCUMENT("Information about a single vertex or index buffer binding.");
struct BoundBuffer
{
DOCUMENT("");
bool operator==(const BoundBuffer &o) const
{
return Buffer == o.Buffer && ByteOffset == o.ByteOffset && ByteStride == o.ByteStride;
}
bool operator<(const BoundBuffer &o) const
{
if(Buffer != o.Buffer)
return Buffer < o.Buffer;
if(ByteOffset != o.ByteOffset)
return ByteOffset < o.ByteOffset;
if(ByteStride != o.ByteStride)
return ByteStride < o.ByteStride;
return false;
}
DOCUMENT("A :class:`~renderdoc.ResourceId` identifying the buffer.");
ResourceId Buffer;
DOCUMENT("The offset in bytes from the start of the buffer to the data.");
@@ -114,6 +148,38 @@ DECLARE_REFLECTION_STRUCT(BoundCBuffer);
DOCUMENT("Information about a vertex input attribute feeding the vertex shader.");
struct VertexInputAttribute
{
DOCUMENT("");
bool operator==(const VertexInputAttribute &o) const
{
return Name == o.Name && VertexBuffer == o.VertexBuffer &&
RelativeByteOffset == o.RelativeByteOffset && PerInstance == o.PerInstance &&
InstanceRate == o.InstanceRate && Format == o.Format &&
!memcmp(&GenericValue, &o.GenericValue, sizeof(GenericValue)) &&
GenericEnabled == o.GenericEnabled && Used == o.Used;
}
bool operator<(const VertexInputAttribute &o) const
{
if(Name != o.Name)
return Name < o.Name;
if(VertexBuffer != o.VertexBuffer)
return VertexBuffer < o.VertexBuffer;
if(RelativeByteOffset != o.RelativeByteOffset)
return RelativeByteOffset < o.RelativeByteOffset;
if(PerInstance != o.PerInstance)
return PerInstance < o.PerInstance;
if(InstanceRate != o.InstanceRate)
return InstanceRate < o.InstanceRate;
if(Format != o.Format)
return Format < o.Format;
if(memcmp(&GenericValue, &o.GenericValue, sizeof(GenericValue)) < 0)
return true;
if(GenericEnabled != o.GenericEnabled)
return GenericEnabled < o.GenericEnabled;
if(Used != o.Used)
return Used < o.Used;
return false;
}
DOCUMENT("The name of this input. This may be a variable name or a semantic name.");
rdcstr Name;
DOCUMENT("The index of the vertex buffer used to provide this attribute.");
@@ -31,8 +31,23 @@
DOCUMENT("Describes an external program that can be used to disassemble SPIR-V.");
struct SPIRVDisassembler
{
DOCUMENT("");
SPIRVDisassembler() {}
VARIANT_CAST(SPIRVDisassembler);
bool operator==(const SPIRVDisassembler &o) const
{
return name == o.name && executable == o.executable && args == o.args;
}
bool operator<(const SPIRVDisassembler &o) const
{
if(name != o.name)
return name < o.name;
if(executable != o.executable)
return executable < o.executable;
if(args != o.args)
return args < o.args;
return false;
}
DOCUMENT("The human-readable name of the program.");
rdcstr name;
+40
View File
@@ -58,6 +58,13 @@ struct rdcpair
A first;
B second;
bool operator==(const rdcpair<A, B> &o) const { return first == o.first && second == o.second; }
bool operator<(const rdcpair<A, B> &o) const
{
if(first != o.first)
return first < o.first;
return second < o.second;
}
operator std::tuple<A &, B &>() { return std::tie(first, second); }
};
@@ -97,12 +104,35 @@ struct ItemHelper
for(int32_t i = 0; i < count; i++)
new(first + i) T();
}
static bool equalRange(T *a, T *b, int32_t count)
{
for(int32_t i = 0; i < count; i++)
if(!(a[i] == b[i]))
return false;
return true;
}
static bool lessthanRange(T *a, T *b, int32_t count)
{
for(int32_t i = 0; i < count; i++)
if(a[i] < b[i])
return true;
return false;
}
};
template <typename T>
struct ItemHelper<T, true>
{
static void initRange(T *first, int32_t itemCount) { memset(first, 0, itemCount * sizeof(T)); }
static bool equalRange(T *a, T *b, int32_t count) { return !memcmp(a, b, count * sizeof(T)); }
static bool lessthanRange(T *a, T *b, int32_t count)
{
return memcmp(a, b, count * sizeof(T)) < 0;
}
};
template <typename T>
@@ -156,6 +186,16 @@ public:
// simple accessors
T &operator[](size_t i) { return elems[i]; }
const T &operator[](size_t i) const { return elems[i]; }
bool operator==(const rdcarray<T> &o) const
{
return usedCount == o.usedCount && ItemHelper<T>::equalRange(elems, o.elems, usedCount);
}
bool operator<(const rdcarray<T> &o) const
{
if(usedCount != o.usedCount)
return usedCount < o.usedCount;
return ItemHelper<T>::lessthanRange(elems, o.elems, usedCount);
}
T *data() { return elems; }
const T *data() const { return elems; }
T *begin() { return elems ? elems : end(); }
+35
View File
@@ -482,6 +482,23 @@ struct EnvironmentModification
: mod(m), sep(s), name(n), value(v)
{
}
DOCUMENT("");
bool operator==(const EnvironmentModification &o) const
{
return mod == o.mod && sep == o.sep && name == o.name && value == o.value;
}
bool operator<(const EnvironmentModification &o) const
{
if(!(mod == o.mod))
return mod < o.mod;
if(!(sep == o.sep))
return sep < o.sep;
if(!(name == o.name))
return name < o.name;
if(!(value == o.value))
return value < o.value;
return false;
}
DOCUMENT("The :class:`modification <EnvMod>` to use.");
EnvMod mod;
DOCUMENT("The :class:`separator <EnvSep>` to use if needed.");
@@ -497,6 +514,24 @@ DECLARE_REFLECTION_STRUCT(EnvironmentModification);
DOCUMENT("The format for a capture file either supported to read from, or export to");
struct CaptureFileFormat
{
DOCUMENT("");
bool operator==(const CaptureFileFormat &o) const
{
return name == o.name && description == o.description && openSupported == o.openSupported &&
convertSupported == o.convertSupported;
}
bool operator<(const CaptureFileFormat &o) const
{
if(!(name == o.name))
return name < o.name;
if(!(description == o.description))
return description < o.description;
if(!(openSupported == o.openSupported))
return openSupported < o.openSupported;
if(!(convertSupported == o.convertSupported))
return convertSupported < o.convertSupported;
return false;
}
DOCUMENT("The name of the format as a single minimal string, e.g. ``rdc``.");
rdcstr name;
+229
View File
@@ -37,6 +37,31 @@ DOCUMENT(R"(Describes a single D3D11 input layout element for one vertex input.
)");
struct Layout
{
DOCUMENT("");
bool operator==(const Layout &o) const
{
return SemanticName == o.SemanticName && SemanticIndex == o.SemanticIndex &&
Format == o.Format && InputSlot == o.InputSlot && ByteOffset == o.ByteOffset &&
PerInstance == o.PerInstance && InstanceDataStepRate == o.InstanceDataStepRate;
}
bool operator<(const Layout &o) const
{
if(!(SemanticName == o.SemanticName))
return SemanticName < o.SemanticName;
if(!(SemanticIndex == o.SemanticIndex))
return SemanticIndex < o.SemanticIndex;
if(!(Format == o.Format))
return Format < o.Format;
if(!(InputSlot == o.InputSlot))
return InputSlot < o.InputSlot;
if(!(ByteOffset == o.ByteOffset))
return ByteOffset < o.ByteOffset;
if(!(PerInstance == o.PerInstance))
return PerInstance < o.PerInstance;
if(!(InstanceDataStepRate == o.InstanceDataStepRate))
return InstanceDataStepRate < o.InstanceDataStepRate;
return false;
}
DOCUMENT("The semantic name for this input.");
rdcstr SemanticName;
@@ -75,6 +100,21 @@ with the next instance data.
DOCUMENT("Describes a single D3D11 vertex buffer binding.")
struct VB
{
DOCUMENT("");
bool operator==(const VB &o) const
{
return Buffer == o.Buffer && Stride == o.Stride && Offset == o.Offset;
}
bool operator<(const VB &o) const
{
if(!(Buffer == o.Buffer))
return Buffer < o.Buffer;
if(!(Stride == o.Stride))
return Stride < o.Stride;
if(!(Offset == o.Offset))
return Offset < o.Offset;
return false;
}
DOCUMENT("The :class:`ResourceId` of the buffer bound to this slot.");
ResourceId Buffer;
@@ -117,6 +157,48 @@ struct IA
DOCUMENT("Describes the details of a D3D11 resource view - any one of UAV, SRV, RTV or DSV.");
struct View
{
DOCUMENT("");
bool operator==(const View &o) const
{
return Object == o.Object && Resource == o.Resource && Type == o.Type && Format == o.Format &&
Structured == o.Structured && BufferStructCount == o.BufferStructCount &&
ElementSize == o.ElementSize && FirstElement == o.FirstElement &&
NumElements == o.NumElements && Flags == o.Flags && HighestMip == o.HighestMip &&
NumMipLevels == o.NumMipLevels && ArraySize == o.ArraySize &&
FirstArraySlice == o.FirstArraySlice;
}
bool operator<(const View &o) const
{
if(!(Object == o.Object))
return Object < o.Object;
if(!(Resource == o.Resource))
return Resource < o.Resource;
if(!(Type == o.Type))
return Type < o.Type;
if(!(Format == o.Format))
return Format < o.Format;
if(!(Structured == o.Structured))
return Structured < o.Structured;
if(!(BufferStructCount == o.BufferStructCount))
return BufferStructCount < o.BufferStructCount;
if(!(ElementSize == o.ElementSize))
return ElementSize < o.ElementSize;
if(!(FirstElement == o.FirstElement))
return FirstElement < o.FirstElement;
if(!(NumElements == o.NumElements))
return NumElements < o.NumElements;
if(!(Flags == o.Flags))
return Flags < o.Flags;
if(!(HighestMip == o.HighestMip))
return HighestMip < o.HighestMip;
if(!(NumMipLevels == o.NumMipLevels))
return NumMipLevels < o.NumMipLevels;
if(!(ArraySize == o.ArraySize))
return ArraySize < o.ArraySize;
if(!(FirstArraySlice == o.FirstArraySlice))
return FirstArraySlice < o.FirstArraySlice;
return false;
}
DOCUMENT("The :class:`ResourceId` of the view itself.");
ResourceId Object;
@@ -162,6 +244,48 @@ or the structured buffer element size, as appropriate.
DOCUMENT("Describes a sampler state object.");
struct Sampler
{
DOCUMENT("");
bool operator==(const Sampler &o) const
{
return Samp == o.Samp && AddressU == o.AddressU && AddressV == o.AddressV &&
AddressW == o.AddressW && BorderColor[0] == o.BorderColor[0] &&
BorderColor[1] == o.BorderColor[1] && BorderColor[2] == o.BorderColor[2] &&
BorderColor[3] == o.BorderColor[3] && Comparison == o.Comparison && Filter == o.Filter &&
MaxAniso == o.MaxAniso && MaxLOD == o.MaxLOD && MinLOD == o.MinLOD &&
MipLODBias == o.MipLODBias;
}
bool operator<(const Sampler &o) const
{
if(!(Samp == o.Samp))
return Samp < o.Samp;
if(!(AddressU == o.AddressU))
return AddressU < o.AddressU;
if(!(AddressV == o.AddressV))
return AddressV < o.AddressV;
if(!(AddressW == o.AddressW))
return AddressW < o.AddressW;
if(!(BorderColor[0] == o.BorderColor[0]))
return BorderColor[0] < o.BorderColor[0];
if(!(BorderColor[1] == o.BorderColor[1]))
return BorderColor[1] < o.BorderColor[1];
if(!(BorderColor[2] == o.BorderColor[2]))
return BorderColor[2] < o.BorderColor[2];
if(!(BorderColor[3] == o.BorderColor[3]))
return BorderColor[3] < o.BorderColor[3];
if(!(Comparison == o.Comparison))
return Comparison < o.Comparison;
if(!(Filter == o.Filter))
return Filter < o.Filter;
if(!(MaxAniso == o.MaxAniso))
return MaxAniso < o.MaxAniso;
if(!(MaxLOD == o.MaxLOD))
return MaxLOD < o.MaxLOD;
if(!(MinLOD == o.MinLOD))
return MinLOD < o.MinLOD;
if(!(MipLODBias == o.MipLODBias))
return MipLODBias < o.MipLODBias;
return false;
}
DOCUMENT("The :class:`ResourceId` of the sampler state object.");
ResourceId Samp;
DOCUMENT("The :class:`AddressMode` in the U direction.");
@@ -200,6 +324,21 @@ struct Sampler
DOCUMENT("Describes a constant buffer binding.");
struct CBuffer
{
DOCUMENT("");
bool operator==(const CBuffer &o) const
{
return Buffer == o.Buffer && VecOffset == o.VecOffset && VecCount == o.VecCount;
}
bool operator<(const CBuffer &o) const
{
if(!(Buffer == o.Buffer))
return Buffer < o.Buffer;
if(!(VecOffset == o.VecOffset))
return VecOffset < o.VecOffset;
if(!(VecCount == o.VecCount))
return VecCount < o.VecCount;
return false;
}
DOCUMENT("The :class:`ResourceId` of the buffer.");
ResourceId Buffer;
@@ -251,6 +390,16 @@ mapping data.
DOCUMENT("Describes a binding on the D3D11 stream-out stage.");
struct SOBind
{
DOCUMENT("");
bool operator==(const SOBind &o) const { return Buffer == o.Buffer && Offset == o.Offset; }
bool operator<(const SOBind &o) const
{
if(!(Buffer == o.Buffer))
return Buffer < o.Buffer;
if(!(Offset == o.Offset))
return Offset < o.Offset;
return false;
}
DOCUMENT("The :class:`ResourceId` of the buffer.");
ResourceId Buffer;
@@ -268,6 +417,28 @@ struct SO
DOCUMENT("Describes a single D3D11 viewport.");
struct Viewport
{
DOCUMENT("");
bool operator==(const Viewport &o) const
{
return X == o.X && Y == o.Y && Width == o.Width && Height == o.Height &&
MinDepth == o.MinDepth && MaxDepth == o.MaxDepth;
}
bool operator<(const Viewport &o) const
{
if(!(X == o.X))
return X < o.X;
if(!(Y == o.Y))
return Y < o.Y;
if(!(Width == o.Width))
return Width < o.Width;
if(!(Height == o.Height))
return Height < o.Height;
if(!(MinDepth == o.MinDepth))
return MinDepth < o.MinDepth;
if(!(MaxDepth == o.MaxDepth))
return MaxDepth < o.MaxDepth;
return false;
}
Viewport() = default;
Viewport(float TX, float TY, float W, float H, float MN, float MX, bool en)
: X(TX), Y(TY), Width(W), Height(H), MinDepth(MN), MaxDepth(MX), Enabled(en)
@@ -293,6 +464,26 @@ struct Viewport
DOCUMENT("Describes a single D3D11 scissor rect.");
struct Scissor
{
DOCUMENT("");
bool operator==(const Scissor &o) const
{
return left == o.left && top == o.top && right == o.right && bottom == o.bottom &&
Enabled == o.Enabled;
}
bool operator<(const Scissor &o) const
{
if(!(left == o.left))
return left < o.left;
if(!(top == o.top))
return top < o.top;
if(!(right == o.right))
return right < o.right;
if(!(bottom == o.bottom))
return bottom < o.bottom;
if(!(Enabled == o.Enabled))
return Enabled < o.Enabled;
return false;
}
Scissor() = default;
Scissor(int l, int t, int r, int b, bool en) : left(l), top(t), right(r), bottom(b), Enabled(en)
{
@@ -404,6 +595,21 @@ struct DepthStencilState
DOCUMENT("Describes the details of a D3D11 blend operation.");
struct BlendEquation
{
DOCUMENT("");
bool operator==(const BlendEquation &o) const
{
return Source == o.Source && Destination == o.Destination && Operation == o.Operation;
}
bool operator<(const BlendEquation &o) const
{
if(!(Source == o.Source))
return Source < o.Source;
if(!(Destination == o.Destination))
return Destination < o.Destination;
if(!(Operation == o.Operation))
return Operation < o.Operation;
return false;
}
DOCUMENT("The :class:`BlendMultiplier` for the source blend value.");
BlendMultiplier Source = BlendMultiplier::One;
DOCUMENT("The :class:`BlendMultiplier` for the destination blend value.");
@@ -415,6 +621,29 @@ struct BlendEquation
DOCUMENT("Describes the blend configuration for a given D3D11 target.");
struct Blend
{
DOCUMENT("");
bool operator==(const Blend &o) const
{
return Enabled == o.Enabled && LogicEnabled == o.LogicEnabled && m_Blend == o.m_Blend &&
m_AlphaBlend == o.m_AlphaBlend && Logic == o.Logic && WriteMask == o.WriteMask;
}
bool operator<(const Blend &o) const
{
if(!(Enabled == o.Enabled))
return Enabled < o.Enabled;
if(!(LogicEnabled == o.LogicEnabled))
return LogicEnabled < o.LogicEnabled;
if(!(m_Blend == o.m_Blend))
return m_Blend < o.m_Blend;
if(!(m_AlphaBlend == o.m_AlphaBlend))
return m_AlphaBlend < o.m_AlphaBlend;
if(!(Logic == o.Logic))
return Logic < o.Logic;
if(!(WriteMask == o.WriteMask))
return WriteMask < o.WriteMask;
return false;
}
DOCUMENT("A :class:`D3D11_BlendEquation` describing the blending for colour values.");
BlendEquation m_Blend;
DOCUMENT("A :class:`D3D11_BlendEquation` describing the blending for alpha values.");
+297
View File
@@ -36,6 +36,31 @@ DOCUMENT(R"(Describes a single D3D12 input layout element for one vertex input.
)");
struct Layout
{
DOCUMENT("");
bool operator==(const Layout &o) const
{
return SemanticName == o.SemanticName && SemanticIndex == o.SemanticIndex &&
Format == o.Format && InputSlot == o.InputSlot && ByteOffset == o.ByteOffset &&
PerInstance == o.PerInstance && InstanceDataStepRate == o.InstanceDataStepRate;
}
bool operator<(const Layout &o) const
{
if(!(SemanticName == o.SemanticName))
return SemanticName < o.SemanticName;
if(!(SemanticIndex == o.SemanticIndex))
return SemanticIndex < o.SemanticIndex;
if(!(Format == o.Format))
return Format < o.Format;
if(!(InputSlot == o.InputSlot))
return InputSlot < o.InputSlot;
if(!(ByteOffset == o.ByteOffset))
return ByteOffset < o.ByteOffset;
if(!(PerInstance == o.PerInstance))
return PerInstance < o.PerInstance;
if(!(InstanceDataStepRate == o.InstanceDataStepRate))
return InstanceDataStepRate < o.InstanceDataStepRate;
return false;
}
DOCUMENT("The semantic name for this input.");
rdcstr SemanticName;
@@ -74,6 +99,23 @@ with the next instance data.
DOCUMENT("Describes a single D3D12 vertex buffer binding.")
struct VB
{
DOCUMENT("");
bool operator==(const VB &o) const
{
return Buffer == o.Buffer && Stride == o.Stride && Size == o.Size && Offset == o.Offset;
}
bool operator<(const VB &o) const
{
if(!(Buffer == o.Buffer))
return Buffer < o.Buffer;
if(!(Stride == o.Stride))
return Stride < o.Stride;
if(!(Size == o.Size))
return Size < o.Size;
if(!(Offset == o.Offset))
return Offset < o.Offset;
return false;
}
DOCUMENT("The :class:`ResourceId` of the buffer bound to this slot.");
ResourceId Buffer;
@@ -124,6 +166,58 @@ If the value is 0, strip cutting is disabled.
DOCUMENT("Describes the details of a D3D12 resource view - any one of UAV, SRV, RTV or DSV.");
struct View
{
DOCUMENT("");
bool operator==(const View &o) const
{
return Resource == o.Resource && Type == o.Type && Format == o.Format &&
swizzle[0] == o.swizzle[0] && swizzle[1] == o.swizzle[1] && swizzle[2] == o.swizzle[2] &&
swizzle[3] == o.swizzle[3] && BufferFlags == o.BufferFlags &&
BufferStructCount == o.BufferStructCount && ElementSize == o.ElementSize &&
FirstElement == o.FirstElement && NumElements == o.NumElements &&
CounterResource == o.CounterResource && CounterByteOffset == o.CounterByteOffset &&
HighestMip == o.HighestMip && NumMipLevels == o.NumMipLevels &&
ArraySize == o.ArraySize && FirstArraySlice == o.FirstArraySlice;
}
bool operator<(const View &o) const
{
if(!(Resource == o.Resource))
return Resource < o.Resource;
if(!(Type == o.Type))
return Type < o.Type;
if(!(Format == o.Format))
return Format < o.Format;
if(!(swizzle[0] == o.swizzle[0]))
return swizzle[0] < o.swizzle[0];
if(!(swizzle[1] == o.swizzle[1]))
return swizzle[1] < o.swizzle[1];
if(!(swizzle[2] == o.swizzle[2]))
return swizzle[2] < o.swizzle[2];
if(!(swizzle[3] == o.swizzle[3]))
return swizzle[3] < o.swizzle[3];
if(!(BufferFlags == o.BufferFlags))
return BufferFlags < o.BufferFlags;
if(!(BufferStructCount == o.BufferStructCount))
return BufferStructCount < o.BufferStructCount;
if(!(ElementSize == o.ElementSize))
return ElementSize < o.ElementSize;
if(!(FirstElement == o.FirstElement))
return FirstElement < o.FirstElement;
if(!(NumElements == o.NumElements))
return NumElements < o.NumElements;
if(!(CounterResource == o.CounterResource))
return CounterResource < o.CounterResource;
if(!(CounterByteOffset == o.CounterByteOffset))
return CounterByteOffset < o.CounterByteOffset;
if(!(HighestMip == o.HighestMip))
return HighestMip < o.HighestMip;
if(!(NumMipLevels == o.NumMipLevels))
return NumMipLevels < o.NumMipLevels;
if(!(ArraySize == o.ArraySize))
return ArraySize < o.ArraySize;
if(!(FirstArraySlice == o.FirstArraySlice))
return FirstArraySlice < o.FirstArraySlice;
return false;
}
DOCUMENT("``True`` if this view is a root parameter (i.e. not in a table).");
bool Immediate = false;
DOCUMENT("The index in the original root signature that this descriptor came from.");
@@ -176,6 +270,52 @@ or the structured buffer element size, as appropriate.
DOCUMENT("Describes the details of a sampler descriptor.");
struct Sampler
{
DOCUMENT("");
bool operator==(const Sampler &o) const
{
return Immediate == o.Immediate && RootElement == o.RootElement && TableIndex == o.TableIndex &&
AddressU == o.AddressU && AddressV == o.AddressV && AddressW == o.AddressW &&
BorderColor[0] == o.BorderColor[0] && BorderColor[1] == o.BorderColor[1] &&
BorderColor[2] == o.BorderColor[2] && BorderColor[3] == o.BorderColor[3] &&
Comparison == o.Comparison && Filter == o.Filter && MaxAniso == o.MaxAniso &&
MaxLOD == o.MaxLOD && MinLOD == o.MinLOD && MipLODBias == o.MipLODBias;
}
bool operator<(const Sampler &o) const
{
if(!(Immediate == o.Immediate))
return Immediate < o.Immediate;
if(!(RootElement == o.RootElement))
return RootElement < o.RootElement;
if(!(TableIndex == o.TableIndex))
return TableIndex < o.TableIndex;
if(!(AddressU == o.AddressU))
return AddressU < o.AddressU;
if(!(AddressV == o.AddressV))
return AddressV < o.AddressV;
if(!(AddressW == o.AddressW))
return AddressW < o.AddressW;
if(!(BorderColor[0] == o.BorderColor[0]))
return BorderColor[0] < o.BorderColor[0];
if(!(BorderColor[1] == o.BorderColor[1]))
return BorderColor[1] < o.BorderColor[1];
if(!(BorderColor[2] == o.BorderColor[2]))
return BorderColor[2] < o.BorderColor[2];
if(!(BorderColor[3] == o.BorderColor[3]))
return BorderColor[3] < o.BorderColor[3];
if(!(Comparison == o.Comparison))
return Comparison < o.Comparison;
if(!(Filter == o.Filter))
return Filter < o.Filter;
if(!(MaxAniso == o.MaxAniso))
return MaxAniso < o.MaxAniso;
if(!(MaxLOD == o.MaxLOD))
return MaxLOD < o.MaxLOD;
if(!(MinLOD == o.MinLOD))
return MinLOD < o.MinLOD;
if(!(MipLODBias == o.MipLODBias))
return MipLODBias < o.MipLODBias;
return false;
}
DOCUMENT("``True`` if this view is a static sampler (i.e. not in a table).");
bool Immediate = 0;
DOCUMENT("The index in the original root signature that this descriptor came from.");
@@ -219,6 +359,31 @@ struct Sampler
DOCUMENT("Describes the details of a constant buffer view descriptor.");
struct CBuffer
{
DOCUMENT("");
bool operator==(const CBuffer &o) const
{
return Immediate == o.Immediate && RootElement == o.RootElement && TableIndex == o.TableIndex &&
Buffer == o.Buffer && Offset == o.Offset && ByteSize == o.ByteSize &&
RootValues == o.RootValues;
}
bool operator<(const CBuffer &o) const
{
if(!(Immediate == o.Immediate))
return Immediate < o.Immediate;
if(!(RootElement == o.RootElement))
return RootElement < o.RootElement;
if(!(TableIndex == o.TableIndex))
return TableIndex < o.TableIndex;
if(!(Buffer == o.Buffer))
return Buffer < o.Buffer;
if(!(Offset == o.Offset))
return Offset < o.Offset;
if(!(ByteSize == o.ByteSize))
return ByteSize < o.ByteSize;
if(!(RootValues == o.RootValues))
return RootValues < o.RootValues;
return false;
}
DOCUMENT("``True`` if this view is a root constant (i.e. not in a table).");
bool Immediate = false;
DOCUMENT("The index in the original root signature that this descriptor came from.");
@@ -242,6 +407,24 @@ struct CBuffer
DOCUMENT("Contains all of the registers in a single register space mapped to by a root signature.");
struct RegisterSpace
{
DOCUMENT("");
bool operator==(const RegisterSpace &o) const
{
return ConstantBuffers == o.ConstantBuffers && Samplers == o.Samplers && SRVs == o.SRVs &&
UAVs == o.UAVs;
}
bool operator<(const RegisterSpace &o) const
{
if(!(ConstantBuffers == o.ConstantBuffers))
return ConstantBuffers < o.ConstantBuffers;
if(!(Samplers == o.Samplers))
return Samplers < o.Samplers;
if(!(SRVs == o.SRVs))
return SRVs < o.SRVs;
if(!(UAVs == o.UAVs))
return UAVs < o.UAVs;
return false;
}
DOCUMENT("List of :class:`D3D12_CBuffer` containing the constant buffers.");
rdcarray<CBuffer> ConstantBuffers;
DOCUMENT("List of :class:`D3D12_Sampler` containing the samplers.");
@@ -275,6 +458,26 @@ mapping data.
DOCUMENT("Describes a binding on the D3D12 stream-out stage.");
struct SOBind
{
DOCUMENT("");
bool operator==(const SOBind &o) const
{
return Buffer == o.Buffer && Offset == o.Offset && Size == o.Size &&
WrittenCountBuffer == o.WrittenCountBuffer && WrittenCountOffset == o.WrittenCountOffset;
}
bool operator<(const SOBind &o) const
{
if(!(Buffer == o.Buffer))
return Buffer < o.Buffer;
if(!(Offset == o.Offset))
return Offset < o.Offset;
if(!(Size == o.Size))
return Size < o.Size;
if(!(WrittenCountBuffer == o.WrittenCountBuffer))
return WrittenCountBuffer < o.WrittenCountBuffer;
if(!(WrittenCountOffset == o.WrittenCountOffset))
return WrittenCountOffset < o.WrittenCountOffset;
return false;
}
DOCUMENT("The :class:`ResourceId` of the buffer.");
ResourceId Buffer;
DOCUMENT(
@@ -300,6 +503,28 @@ struct Streamout
DOCUMENT("Describes a single D3D12 viewport.");
struct Viewport
{
DOCUMENT("");
bool operator==(const Viewport &o) const
{
return X == o.X && Y == o.Y && Width == o.Width && Height == o.Height &&
MinDepth == o.MinDepth && MaxDepth == o.MaxDepth;
}
bool operator<(const Viewport &o) const
{
if(!(X == o.X))
return X < o.X;
if(!(Y == o.Y))
return Y < o.Y;
if(!(Width == o.Width))
return Width < o.Width;
if(!(Height == o.Height))
return Height < o.Height;
if(!(MinDepth == o.MinDepth))
return MinDepth < o.MinDepth;
if(!(MaxDepth == o.MaxDepth))
return MaxDepth < o.MaxDepth;
return false;
}
Viewport() = default;
Viewport(float TX, float TY, float W, float H, float MN, float MX)
: X(TX), Y(TY), Width(W), Height(H), MinDepth(MN), MaxDepth(MX)
@@ -323,6 +548,23 @@ struct Viewport
DOCUMENT("Describes a single D3D12 scissor rect.");
struct Scissor
{
DOCUMENT("");
bool operator==(const Scissor &o) const
{
return left == o.left && top == o.top && right == o.right && bottom == o.bottom;
}
bool operator<(const Scissor &o) const
{
if(!(left == o.left))
return left < o.left;
if(!(top == o.top))
return top < o.top;
if(!(right == o.right))
return right < o.right;
if(!(bottom == o.bottom))
return bottom < o.bottom;
return false;
}
Scissor() = default;
Scissor(int l, int t, int r, int b) : left(l), top(t), right(r), bottom(b) {}
DOCUMENT("Top-left X co-ordinate of the viewport.");
@@ -427,6 +669,21 @@ struct DepthStencilState
DOCUMENT("Describes the details of a D3D12 blend operation.");
struct BlendEquation
{
DOCUMENT("");
bool operator==(const BlendEquation &o) const
{
return Source == o.Source && Destination == o.Destination && Operation == o.Operation;
}
bool operator<(const BlendEquation &o) const
{
if(!(Source == o.Source))
return Source < o.Source;
if(!(Destination == o.Destination))
return Destination < o.Destination;
if(!(Operation == o.Operation))
return Operation < o.Operation;
return false;
}
DOCUMENT("The :class:`BlendMultiplier` for the source blend value.");
BlendMultiplier Source = BlendMultiplier::One;
DOCUMENT("The :class:`BlendMultiplier` for the destination blend value.");
@@ -438,6 +695,28 @@ struct BlendEquation
DOCUMENT("Describes the blend configuration for a given D3D12 target.");
struct Blend
{
DOCUMENT("");
bool operator==(const Blend &o) const
{
return Enabled == o.Enabled && LogicEnabled == o.LogicEnabled && m_Blend == o.m_Blend &&
m_AlphaBlend == o.m_AlphaBlend && Logic == o.Logic && WriteMask == o.WriteMask;
}
bool operator<(const Blend &o) const
{
if(!(Enabled == o.Enabled))
return Enabled < o.Enabled;
if(!(LogicEnabled == o.LogicEnabled))
return LogicEnabled < o.LogicEnabled;
if(!(m_Blend == o.m_Blend))
return m_Blend < o.m_Blend;
if(!(m_AlphaBlend == o.m_AlphaBlend))
return m_AlphaBlend < o.m_AlphaBlend;
if(!(Logic == o.Logic))
return Logic < o.Logic;
if(!(WriteMask == o.WriteMask))
return WriteMask < o.WriteMask;
return false;
}
DOCUMENT("A :class:`D3D12_BlendEquation` describing the blending for colour values.");
BlendEquation m_Blend;
DOCUMENT("A :class:`D3D12_BlendEquation` describing the blending for alpha values.");
@@ -500,6 +779,14 @@ struct OM
DOCUMENT("Describes the current state that a sub-resource is in.");
struct ResourceState
{
DOCUMENT("");
bool operator==(const ResourceState &o) const { return name == o.name; }
bool operator<(const ResourceState &o) const
{
if(!(name == o.name))
return name < o.name;
return false;
}
DOCUMENT("A human-readable name for the current state.");
rdcstr name;
};
@@ -507,6 +794,16 @@ struct ResourceState
DOCUMENT("Contains the current state of a given resource.");
struct ResourceData
{
DOCUMENT("");
bool operator==(const ResourceData &o) const { return id == o.id && states == o.states; }
bool operator<(const ResourceData &o) const
{
if(!(id == o.id))
return id < o.id;
if(!(states == o.states))
return states < o.states;
return false;
}
DOCUMENT("The :class:`ResourceId` of the resource.");
ResourceId id;
+204 -8
View File
@@ -52,8 +52,25 @@ DECLARE_REFLECTION_STRUCT(FloatVector);
DOCUMENT("Properties of a path on a remote filesystem.");
struct PathEntry
{
DOCUMENT("");
PathEntry() : flags(PathProperty::NoFlags), lastmod(0), size(0) {}
PathEntry(const char *fn, PathProperty f) : filename(fn), flags(f), lastmod(0), size(0) {}
bool operator==(const PathEntry &o) const
{
return filename == o.filename && flags == o.flags && lastmod == o.lastmod && size == o.size;
}
bool operator<(const PathEntry &o) const
{
if(!(filename == o.filename))
return filename < o.filename;
if(!(flags == o.flags))
return flags < o.flags;
if(!(lastmod == o.lastmod))
return lastmod < o.lastmod;
if(!(size == o.size))
return size < o.size;
return false;
}
DOCUMENT("The filename of this path. This contains only the filename, not the full path.");
rdcstr filename;
@@ -102,6 +119,7 @@ extern "C" RENDERDOC_API void RENDERDOC_CC RENDERDOC_ResourceFormatName(const Re
DOCUMENT("Description of the format of a resource or element.");
struct ResourceFormat
{
DOCUMENT("");
ResourceFormat()
{
type = ResourceFormatType::Undefined;
@@ -113,14 +131,28 @@ struct ResourceFormat
srgbCorrected = false;
}
DOCUMENT("Compares two ``ResourceFormat`` objects for equality.");
bool operator==(const ResourceFormat &r) const
{
return type == r.type && compCount == r.compCount && compByteWidth == r.compByteWidth &&
compType == r.compType && bgraOrder == r.bgraOrder && srgbCorrected == r.srgbCorrected;
}
bool operator<(const ResourceFormat &r) const
{
if(type != r.type)
return type < r.type;
if(compCount != r.compCount)
return compCount < r.compCount;
if(compByteWidth != r.compByteWidth)
return compByteWidth < r.compByteWidth;
if(compType != r.compType)
return compType < r.compType;
if(bgraOrder != r.bgraOrder)
return bgraOrder < r.bgraOrder;
if(srgbCorrected != r.srgbCorrected)
return srgbCorrected < r.srgbCorrected;
return false;
}
DOCUMENT("Compares two ``ResourceFormat`` objects for inequality.");
bool operator!=(const ResourceFormat &r) const { return !(*this == r); }
DOCUMENT(R"(:return: The name of the format.
:rtype: str
@@ -159,6 +191,23 @@ DECLARE_REFLECTION_STRUCT(ResourceFormat);
DOCUMENT("The details of a texture filter in a sampler.");
struct TextureFilter
{
DOCUMENT("");
bool operator==(const TextureFilter &o) const
{
return minify == o.magnify && minify == o.magnify && mip == o.mip && func == o.func;
}
bool operator<(const TextureFilter &o) const
{
if(!(minify == o.magnify))
return minify < o.magnify;
if(!(minify == o.magnify))
return minify < o.magnify;
if(!(mip == o.mip))
return mip < o.mip;
if(!(func == o.func))
return func < o.func;
return false;
}
DOCUMENT("The :class:`FilterMode` to use when minifying the texture.");
FilterMode minify = FilterMode::NoFilter;
DOCUMENT("The :class:`FilterMode` to use when magnifying the texture.");
@@ -174,6 +223,9 @@ DECLARE_REFLECTION_STRUCT(TextureFilter);
DOCUMENT("A description of any type of resource.");
struct ResourceDescription
{
DOCUMENT("");
bool operator==(const ResourceDescription &o) const { return ID == o.ID; }
bool operator<(const ResourceDescription &o) const { return ID < o.ID; }
DOCUMENT("The unique :class:`ResourceId` that identifies this resource.");
ResourceId ID;
@@ -225,6 +277,21 @@ DECLARE_REFLECTION_STRUCT(ResourceDescription);
DOCUMENT("A description of a buffer resource.");
struct BufferDescription
{
DOCUMENT("");
bool operator==(const BufferDescription &o) const
{
return ID == o.ID && creationFlags == o.creationFlags && length == o.length;
}
bool operator<(const BufferDescription &o) const
{
if(!(ID == o.ID))
return ID < o.ID;
if(!(creationFlags == o.creationFlags))
return creationFlags < o.creationFlags;
if(!(length == o.length))
return length < o.length;
return false;
}
DOCUMENT("The unique :class:`ResourceId` that identifies this buffer.");
ResourceId ID;
@@ -240,6 +307,47 @@ DECLARE_REFLECTION_STRUCT(BufferDescription);
DOCUMENT("A description of a texture resource.");
struct TextureDescription
{
DOCUMENT("");
bool operator==(const TextureDescription &o) const
{
return format == o.format && dimension == o.dimension && resType == o.resType &&
width == o.width && height == o.height && depth == o.depth && ID == o.ID &&
cubemap == o.cubemap && mips == o.mips && arraysize == o.arraysize &&
creationFlags == o.creationFlags && msQual == o.msQual && msSamp == o.msSamp &&
byteSize == o.byteSize;
}
bool operator<(const TextureDescription &o) const
{
if(!(format == o.format))
return format < o.format;
if(!(dimension == o.dimension))
return dimension < o.dimension;
if(!(resType == o.resType))
return resType < o.resType;
if(!(width == o.width))
return width < o.width;
if(!(height == o.height))
return height < o.height;
if(!(depth == o.depth))
return depth < o.depth;
if(!(ID == o.ID))
return ID < o.ID;
if(!(cubemap == o.cubemap))
return cubemap < o.cubemap;
if(!(mips == o.mips))
return mips < o.mips;
if(!(arraysize == o.arraysize))
return arraysize < o.arraysize;
if(!(creationFlags == o.creationFlags))
return creationFlags < o.creationFlags;
if(!(msQual == o.msQual))
return msQual < o.msQual;
if(!(msSamp == o.msSamp))
return msSamp < o.msSamp;
if(!(byteSize == o.byteSize))
return byteSize < o.byteSize;
return false;
}
DOCUMENT("The :class:`ResourceFormat` that describes the format of each pixel in the texture.");
ResourceFormat format;
@@ -288,6 +396,9 @@ DECLARE_REFLECTION_STRUCT(TextureDescription);
DOCUMENT("An individual API-level event, generally corresponds one-to-one with an API call.");
struct APIEvent
{
DOCUMENT("");
bool operator==(const APIEvent &o) const { return eventID == o.eventID; }
bool operator<(const APIEvent &o) const { return eventID < o.eventID; }
DOCUMENT(R"(The API event's Event ID (EID).
This is a 1-based count of API events in the capture. The EID is used as a reference point in
@@ -323,6 +434,28 @@ DECLARE_REFLECTION_STRUCT(APIEvent);
DOCUMENT("A debugging message from the API validation or internal analysis and error detection.");
struct DebugMessage
{
DOCUMENT("");
bool operator==(const DebugMessage &o) const
{
return eventID == o.eventID && category == o.category && severity == o.severity &&
source == o.source && messageID == o.messageID && description == o.description;
}
bool operator<(const DebugMessage &o) const
{
if(!(eventID == o.eventID))
return eventID < o.eventID;
if(!(category == o.category))
return category < o.category;
if(!(severity == o.severity))
return severity < o.severity;
if(!(source == o.source))
return source < o.source;
if(!(messageID == o.messageID))
return messageID < o.messageID;
if(!(description == o.description))
return description < o.description;
return false;
}
DOCUMENT("The :data:`EID <APIEvent.eventID>` where this debug message was found.");
uint32_t eventID;
@@ -774,18 +907,17 @@ DECLARE_REFLECTION_STRUCT(FrameDescription);
DOCUMENT("Describes a particular use of a resource at a specific :data:`EID <APIEvent.eventID>`.");
struct EventUsage
{
DOCUMENT("");
EventUsage() : eventID(0), usage(ResourceUsage::Unused) {}
EventUsage(uint32_t e, ResourceUsage u) : eventID(e), usage(u) {}
EventUsage(uint32_t e, ResourceUsage u, ResourceId v) : eventID(e), usage(u), view(v) {}
DOCUMENT("Compares two ``EventUsage`` objects for less-than.");
bool operator<(const EventUsage &o) const
{
if(eventID != o.eventID)
if(!(eventID == o.eventID))
return eventID < o.eventID;
return usage < o.usage;
}
DOCUMENT("Compares two ``EventUsage`` objects for equality.");
bool operator==(const EventUsage &o) const { return eventID == o.eventID && usage == o.usage; }
DOCUMENT("The :data:`EID <APIEvent.eventID>` where this usage happened.");
uint32_t eventID;
@@ -834,7 +966,9 @@ struct DrawcallDescription
outputs[i] = ResourceId();
depthOut = ResourceId();
}
DOCUMENT("");
bool operator==(const DrawcallDescription &o) const { return eventID == o.eventID; }
bool operator<(const DrawcallDescription &o) const { return eventID < o.eventID; }
DOCUMENT("The :data:`EID <APIEvent.eventID>` that actually produced the drawcall.");
uint32_t eventID;
DOCUMENT("A 1-based index of this drawcall relative to other drawcalls.");
@@ -1061,9 +1195,9 @@ struct CounterResult
DOCUMENT("Compares two ``CounterResult`` objects for less-than.");
bool operator<(const CounterResult &o) const
{
if(eventID != o.eventID)
if(!(eventID == o.eventID))
return eventID < o.eventID;
if(counterID != o.counterID)
if(!(counterID == o.counterID))
return counterID < o.counterID;
// don't compare values, just consider equal
@@ -1107,6 +1241,21 @@ DECLARE_REFLECTION_STRUCT(PixelValue);
DOCUMENT("The value of pixel output at a particular event.");
struct ModificationValue
{
DOCUMENT("");
bool operator==(const ModificationValue &o) const
{
return !memcmp(&col, &o.col, sizeof(col)) && depth == o.depth && stencil == o.stencil;
}
bool operator<(const ModificationValue &o) const
{
if(memcmp(&col, &o.col, sizeof(col)) < 0)
return true;
if(!(depth == o.depth))
return depth < o.depth;
if(!(stencil == o.stencil))
return stencil < o.stencil;
return false;
}
DOCUMENT("The colour value.");
PixelValue col;
@@ -1122,6 +1271,53 @@ DECLARE_REFLECTION_STRUCT(ModificationValue);
DOCUMENT("An attempt to modify a pixel by a particular event.");
struct PixelModification
{
DOCUMENT("");
bool operator==(const PixelModification &o) const
{
return eventID == o.eventID && directShaderWrite == o.directShaderWrite &&
unboundPS == o.unboundPS && fragIndex == o.fragIndex && primitiveID == o.primitiveID &&
preMod == o.preMod && shaderOut == o.shaderOut && postMod == o.postMod &&
sampleMasked == o.sampleMasked && backfaceCulled == o.backfaceCulled &&
depthClipped == o.depthClipped && viewClipped == o.viewClipped &&
scissorClipped == o.scissorClipped && shaderDiscarded == o.shaderDiscarded &&
depthTestFailed == o.depthTestFailed && stencilTestFailed == o.stencilTestFailed;
}
bool operator<(const PixelModification &o) const
{
if(!(eventID == o.eventID))
return eventID < o.eventID;
if(!(directShaderWrite == o.directShaderWrite))
return directShaderWrite < o.directShaderWrite;
if(!(unboundPS == o.unboundPS))
return unboundPS < o.unboundPS;
if(!(fragIndex == o.fragIndex))
return fragIndex < o.fragIndex;
if(!(primitiveID == o.primitiveID))
return primitiveID < o.primitiveID;
if(!(preMod == o.preMod))
return preMod < o.preMod;
if(!(shaderOut == o.shaderOut))
return shaderOut < o.shaderOut;
if(!(postMod == o.postMod))
return postMod < o.postMod;
if(!(sampleMasked == o.sampleMasked))
return sampleMasked < o.sampleMasked;
if(!(backfaceCulled == o.backfaceCulled))
return backfaceCulled < o.backfaceCulled;
if(!(depthClipped == o.depthClipped))
return depthClipped < o.depthClipped;
if(!(viewClipped == o.viewClipped))
return viewClipped < o.viewClipped;
if(!(scissorClipped == o.scissorClipped))
return scissorClipped < o.scissorClipped;
if(!(shaderDiscarded == o.shaderDiscarded))
return shaderDiscarded < o.shaderDiscarded;
if(!(depthTestFailed == o.depthTestFailed))
return depthTestFailed < o.depthTestFailed;
if(!(stencilTestFailed == o.stencilTestFailed))
return stencilTestFailed < o.stencilTestFailed;
return false;
}
DOCUMENT("The :data:`EID <APIEvent.eventID>` where the modification happened.");
uint32_t eventID;
+255
View File
@@ -36,6 +36,27 @@ DOCUMENT(R"(Describes the configuration for a single vertex attribute.
)");
struct VertexAttribute
{
DOCUMENT("");
bool operator==(const VertexAttribute &o) const
{
return Enabled == o.Enabled && Format == o.Format &&
!memcmp(&GenericValue, &o.GenericValue, sizeof(GenericValue)) &&
BufferSlot == o.BufferSlot && RelativeOffset == o.RelativeOffset;
}
bool operator<(const VertexAttribute &o) const
{
if(!(Enabled == o.Enabled))
return Enabled < o.Enabled;
if(!(Format == o.Format))
return Format < o.Format;
if(memcmp(&GenericValue, &o.GenericValue, sizeof(GenericValue)) < 0)
return true;
if(!(BufferSlot == o.BufferSlot))
return BufferSlot < o.BufferSlot;
if(!(RelativeOffset == o.RelativeOffset))
return RelativeOffset < o.RelativeOffset;
return false;
}
DOCUMENT("``True`` if this vertex attribute is enabled.");
bool Enabled = false;
DOCUMENT("The :class:`ResourceFormat` of the vertex attribute.");
@@ -55,6 +76,23 @@ struct VertexAttribute
DOCUMENT("Describes a single OpenGL vertex buffer binding.")
struct VB
{
DOCUMENT("");
bool operator==(const VB &o) const
{
return Buffer == o.Buffer && Stride == o.Stride && Offset == o.Offset && Divisor == o.Divisor;
}
bool operator<(const VB &o) const
{
if(!(Buffer == o.Buffer))
return Buffer < o.Buffer;
if(!(Stride == o.Stride))
return Stride < o.Stride;
if(!(Offset == o.Offset))
return Offset < o.Offset;
if(!(Divisor == o.Divisor))
return Divisor < o.Divisor;
return false;
}
DOCUMENT("The :class:`ResourceId` of the buffer bound to this slot.");
ResourceId Buffer;
@@ -145,6 +183,36 @@ struct FixedVertexProcessing
DOCUMENT("Describes the details of a texture.");
struct Texture
{
DOCUMENT("");
bool operator==(const Texture &o) const
{
return Resource == o.Resource && FirstSlice == o.FirstSlice && HighestMip == o.HighestMip &&
ResType == o.ResType && Swizzle[0] == o.Swizzle[0] && Swizzle[1] == o.Swizzle[1] &&
Swizzle[2] == o.Swizzle[2] && Swizzle[3] == o.Swizzle[3] &&
DepthReadChannel == o.DepthReadChannel;
}
bool operator<(const Texture &o) const
{
if(!(Resource == o.Resource))
return Resource < o.Resource;
if(!(FirstSlice == o.FirstSlice))
return FirstSlice < o.FirstSlice;
if(!(HighestMip == o.HighestMip))
return HighestMip < o.HighestMip;
if(!(ResType == o.ResType))
return ResType < o.ResType;
if(!(Swizzle[0] == o.Swizzle[0]))
return Swizzle[0] < o.Swizzle[0];
if(!(Swizzle[1] == o.Swizzle[1]))
return Swizzle[1] < o.Swizzle[1];
if(!(Swizzle[2] == o.Swizzle[2]))
return Swizzle[2] < o.Swizzle[2];
if(!(Swizzle[3] == o.Swizzle[3]))
return Swizzle[3] < o.Swizzle[3];
if(!(DepthReadChannel == o.DepthReadChannel))
return DepthReadChannel < o.DepthReadChannel;
return false;
}
DOCUMENT("The :class:`ResourceId` of the underlying resource the view refers to.");
ResourceId Resource;
DOCUMENT("Valid for texture arrays or 3D textures - the first slice available.");
@@ -171,6 +239,50 @@ struct Texture
DOCUMENT("Describes the sampler properties of a texture.");
struct Sampler
{
DOCUMENT("");
bool operator==(const Sampler &o) const
{
return Samp == o.Samp && AddressS == o.AddressS && AddressT == o.AddressT &&
AddressR == o.AddressR && BorderColor[0] == o.BorderColor[0] &&
BorderColor[1] == o.BorderColor[1] && BorderColor[2] == o.BorderColor[2] &&
BorderColor[3] == o.BorderColor[3] && Comparison == o.Comparison && Filter == o.Filter &&
SeamlessCube == o.SeamlessCube && MaxAniso == o.MaxAniso && MaxLOD == o.MaxLOD &&
MinLOD == o.MinLOD && MipLODBias == o.MipLODBias;
}
bool operator<(const Sampler &o) const
{
if(!(Samp == o.Samp))
return Samp < o.Samp;
if(!(AddressS == o.AddressS))
return AddressS < o.AddressS;
if(!(AddressT == o.AddressT))
return AddressT < o.AddressT;
if(!(AddressR == o.AddressR))
return AddressR < o.AddressR;
if(!(BorderColor[0] == o.BorderColor[0]))
return BorderColor[0] < o.BorderColor[0];
if(!(BorderColor[1] == o.BorderColor[1]))
return BorderColor[1] < o.BorderColor[1];
if(!(BorderColor[2] == o.BorderColor[2]))
return BorderColor[2] < o.BorderColor[2];
if(!(BorderColor[3] == o.BorderColor[3]))
return BorderColor[3] < o.BorderColor[3];
if(!(Comparison == o.Comparison))
return Comparison < o.Comparison;
if(!(Filter == o.Filter))
return Filter < o.Filter;
if(!(SeamlessCube == o.SeamlessCube))
return SeamlessCube < o.SeamlessCube;
if(!(MaxAniso == o.MaxAniso))
return MaxAniso < o.MaxAniso;
if(!(MaxLOD == o.MaxLOD))
return MaxLOD < o.MaxLOD;
if(!(MinLOD == o.MinLOD))
return MinLOD < o.MinLOD;
if(!(MipLODBias == o.MipLODBias))
return MipLODBias < o.MipLODBias;
return false;
}
DOCUMENT("The :class:`ResourceId` of the sampler object, if a separate one is set.");
ResourceId Samp;
DOCUMENT("The :class:`AddressMode` in the S direction.");
@@ -211,6 +323,21 @@ struct Sampler
DOCUMENT("Describes the properties of a buffer.");
struct Buffer
{
DOCUMENT("");
bool operator==(const Buffer &o) const
{
return Resource == o.Resource && Offset == o.Offset && Size == o.Size;
}
bool operator<(const Buffer &o) const
{
if(!(Resource == o.Resource))
return Resource < o.Resource;
if(!(Offset == o.Offset))
return Offset < o.Offset;
if(!(Size == o.Size))
return Size < o.Size;
return false;
}
DOCUMENT("The :class:`ResourceId` of the buffer object.");
ResourceId Resource;
DOCUMENT("The byte offset from the start of the buffer.");
@@ -222,6 +349,33 @@ struct Buffer
DOCUMENT("Describes the properties of a load/store image.");
struct ImageLoadStore
{
DOCUMENT("");
bool operator==(const ImageLoadStore &o) const
{
return Resource == o.Resource && Level == o.Level && Layered == o.Layered && Layer == o.Layer &&
ResType == o.ResType && readAllowed == o.readAllowed && writeAllowed == o.writeAllowed &&
Format == o.Format;
}
bool operator<(const ImageLoadStore &o) const
{
if(!(Resource == o.Resource))
return Resource < o.Resource;
if(!(Level == o.Level))
return Level < o.Level;
if(!(Layered == o.Layered))
return Layered < o.Layered;
if(!(Layer == o.Layer))
return Layer < o.Layer;
if(!(ResType == o.ResType))
return ResType < o.ResType;
if(!(readAllowed == o.readAllowed))
return readAllowed < o.readAllowed;
if(!(writeAllowed == o.writeAllowed))
return writeAllowed < o.writeAllowed;
if(!(Format == o.Format))
return Format < o.Format;
return false;
}
DOCUMENT("The :class:`ResourceId` of the texture object.");
ResourceId Resource;
DOCUMENT("The mip of the texture that's used in the attachment.");
@@ -262,6 +416,28 @@ struct Feedback
DOCUMENT("Describes a single OpenGL viewport.");
struct Viewport
{
DOCUMENT("");
bool operator==(const Viewport &o) const
{
return Left == o.Left && Bottom == o.Bottom && Width == o.Width && Height == o.Height &&
MinDepth == o.MinDepth && MaxDepth == o.MaxDepth;
}
bool operator<(const Viewport &o) const
{
if(!(Left == o.Left))
return Left < o.Left;
if(!(Bottom == o.Bottom))
return Bottom < o.Bottom;
if(!(Width == o.Width))
return Width < o.Width;
if(!(Height == o.Height))
return Height < o.Height;
if(!(MinDepth == o.MinDepth))
return MinDepth < o.MinDepth;
if(!(MaxDepth == o.MaxDepth))
return MaxDepth < o.MaxDepth;
return false;
}
DOCUMENT("The X co-ordinate of the left side of the viewport.");
float Left = 0.0f;
DOCUMENT("The Y co-ordinate of the bottom side of the viewport.");
@@ -279,6 +455,26 @@ struct Viewport
DOCUMENT("Describes a single OpenGL scissor region.");
struct Scissor
{
DOCUMENT("");
bool operator==(const Scissor &o) const
{
return Left == o.Left && Bottom == o.Bottom && Width == o.Width && Height == o.Height &&
Enabled == o.Enabled;
}
bool operator<(const Scissor &o) const
{
if(!(Left == o.Left))
return Left < o.Left;
if(!(Bottom == o.Bottom))
return Bottom < o.Bottom;
if(!(Width == o.Width))
return Width < o.Width;
if(!(Height == o.Height))
return Height < o.Height;
if(!(Enabled == o.Enabled))
return Enabled < o.Enabled;
return false;
}
DOCUMENT("The X co-ordinate of the left side of the scissor region.");
int32_t Left = 0;
DOCUMENT("The Y co-ordinate of the bottom side of the scissor region.");
@@ -416,6 +612,30 @@ struct StencilState
DOCUMENT("Describes the state of a framebuffer attachment.");
struct Attachment
{
DOCUMENT("");
bool operator==(const Attachment &o) const
{
return Obj == o.Obj && Layer == o.Layer && Mip == o.Mip && Swizzle[0] == o.Swizzle[0] &&
Swizzle[1] == o.Swizzle[1] && Swizzle[2] == o.Swizzle[2] && Swizzle[3] == o.Swizzle[3];
}
bool operator<(const Attachment &o) const
{
if(!(Obj == o.Obj))
return Obj < o.Obj;
if(!(Layer == o.Layer))
return Layer < o.Layer;
if(!(Mip == o.Mip))
return Mip < o.Mip;
if(!(Swizzle[0] == o.Swizzle[0]))
return Swizzle[0] < o.Swizzle[0];
if(!(Swizzle[1] == o.Swizzle[1]))
return Swizzle[1] < o.Swizzle[1];
if(!(Swizzle[2] == o.Swizzle[2]))
return Swizzle[2] < o.Swizzle[2];
if(!(Swizzle[3] == o.Swizzle[3]))
return Swizzle[3] < o.Swizzle[3];
return false;
}
DOCUMENT("The :class:`ResourceId` of the texture bound to this attachment.");
ResourceId Obj;
DOCUMENT("The slice of the texture that's used in the attachment.");
@@ -448,6 +668,21 @@ struct FBO
DOCUMENT("Describes the details of an OpenGL blend operation.");
struct BlendEquation
{
DOCUMENT("");
bool operator==(const BlendEquation &o) const
{
return Source == o.Source && Destination == o.Destination && Operation == o.Operation;
}
bool operator<(const BlendEquation &o) const
{
if(!(Source == o.Source))
return Source < o.Source;
if(!(Destination == o.Destination))
return Destination < o.Destination;
if(!(Operation == o.Operation))
return Operation < o.Operation;
return false;
}
DOCUMENT("The :class:`BlendMultiplier` for the source blend value.");
BlendMultiplier Source = BlendMultiplier::One;
DOCUMENT("The :class:`BlendMultiplier` for the destination blend value.");
@@ -459,6 +694,26 @@ struct BlendEquation
DOCUMENT("Describes the blend configuration for a given OpenGL attachment.");
struct Blend
{
DOCUMENT("");
bool operator==(const Blend &o) const
{
return Enabled == o.Enabled && m_Blend == o.m_Blend && m_AlphaBlend == o.m_AlphaBlend &&
Logic == o.Logic && WriteMask == o.WriteMask;
}
bool operator<(const Blend &o) const
{
if(!(Enabled == o.Enabled))
return Enabled < o.Enabled;
if(!(m_Blend == o.m_Blend))
return m_Blend < o.m_Blend;
if(!(m_AlphaBlend == o.m_AlphaBlend))
return m_AlphaBlend < o.m_AlphaBlend;
if(!(Logic == o.Logic))
return Logic < o.Logic;
if(!(WriteMask == o.WriteMask))
return WriteMask < o.WriteMask;
return false;
}
DOCUMENT("A :class:`GL_BlendEquation` describing the blending for colour values.");
BlendEquation m_Blend;
DOCUMENT("A :class:`GL_BlendEquation` describing the blending for alpha values.");
+250 -22
View File
@@ -114,6 +114,7 @@ data bytes when they are specified to be column-major in the API/shader metadata
)");
struct ShaderVariable
{
DOCUMENT("");
ShaderVariable()
{
name = "";
@@ -165,6 +166,32 @@ struct ShaderVariable
value.u.z = z;
value.u.w = w;
}
bool operator==(const ShaderVariable &o) const
{
return rows == o.rows && columns == o.columns && name == o.name && type == o.type &&
displayAsHex == o.displayAsHex && !memcmp(&value, &o.value, sizeof(value)) &&
isStruct == o.isStruct && members == o.members;
}
bool operator<(const ShaderVariable &o) const
{
if(!(rows == o.rows))
return rows < o.rows;
if(!(columns == o.columns))
return columns < o.columns;
if(!(name == o.name))
return name < o.name;
if(!(type == o.type))
return type < o.type;
if(!(displayAsHex == o.displayAsHex))
return displayAsHex < o.displayAsHex;
if(memcmp(&value, &o.value, sizeof(value)) < 0)
return true;
if(!(isStruct == o.isStruct))
return isStruct < o.isStruct;
if(!(members == o.members))
return members < o.members;
return false;
}
DOCUMENT("The number of rows in this matrix.");
uint32_t rows;
@@ -196,6 +223,26 @@ with all mutable variable contents.
)");
struct ShaderDebugState
{
DOCUMENT("");
bool operator==(const ShaderDebugState &o) const
{
return registers == o.registers && outputs == o.outputs && indexableTemps == o.indexableTemps &&
nextInstruction == o.nextInstruction && flags == o.flags;
}
bool operator<(const ShaderDebugState &o) const
{
if(!(registers == o.registers))
return registers < o.registers;
if(!(outputs == o.outputs))
return outputs < o.outputs;
if(!(indexableTemps == o.indexableTemps))
return indexableTemps < o.indexableTemps;
if(!(nextInstruction == o.nextInstruction))
return nextInstruction < o.nextInstruction;
if(!(flags == o.flags))
return flags < o.flags;
return false;
}
DOCUMENT("The temporary variables for this shader as a list of :class:`ShaderValue`.");
rdcarray<ShaderVariable> registers;
DOCUMENT("The output variables for this shader as a list of :class:`ShaderValue`.");
@@ -247,18 +294,45 @@ between shader stages.
)");
struct SigParameter
{
SigParameter()
: semanticIndex(0),
needSemanticIndex(false),
regIndex(0),
systemValue(ShaderBuiltin::Undefined),
compType(CompType::Float),
regChannelMask(0),
channelUsedMask(0),
compCount(0),
stream(0),
arrayIndex(~0U)
DOCUMENT("");
bool operator==(const SigParameter &o) const
{
return varName == o.varName && semanticName == o.semanticName &&
semanticIdxName == o.semanticIdxName && semanticIndex == o.semanticIndex &&
regIndex == o.regIndex && systemValue == o.systemValue && compType == o.compType &&
regChannelMask == o.regChannelMask && channelUsedMask == o.channelUsedMask &&
needSemanticIndex == o.needSemanticIndex && compCount == o.compCount &&
stream == o.stream && arrayIndex == o.arrayIndex;
}
bool operator<(const SigParameter &o) const
{
if(!(varName == o.varName))
return varName < o.varName;
if(!(semanticName == o.semanticName))
return semanticName < o.semanticName;
if(!(semanticIdxName == o.semanticIdxName))
return semanticIdxName < o.semanticIdxName;
if(!(semanticIndex == o.semanticIndex))
return semanticIndex < o.semanticIndex;
if(!(regIndex == o.regIndex))
return regIndex < o.regIndex;
if(!(systemValue == o.systemValue))
return systemValue < o.systemValue;
if(!(compType == o.compType))
return compType < o.compType;
if(!(regChannelMask == o.regChannelMask))
return regChannelMask < o.regChannelMask;
if(!(channelUsedMask == o.channelUsedMask))
return channelUsedMask < o.channelUsedMask;
if(!(needSemanticIndex == o.needSemanticIndex))
return needSemanticIndex < o.needSemanticIndex;
if(!(compCount == o.compCount))
return compCount < o.compCount;
if(!(stream == o.stream))
return stream < o.stream;
if(!(arrayIndex == o.arrayIndex))
return arrayIndex < o.arrayIndex;
return false;
}
DOCUMENT("The name of this variable - may not be present in the metadata for all APIs.");
@@ -268,40 +342,40 @@ struct SigParameter
DOCUMENT("The combined semantic name and index.");
rdcstr semanticIdxName;
DOCUMENT("The semantic index of this variable - see :data:`semanticName`.");
uint32_t semanticIndex;
uint32_t semanticIndex = 0;
DOCUMENT(R"(The index of the shader register/binding used to store this signature element.
This may be :data:`NoIndex` if the element is system-generated and not consumed by another shader
stage. See :data:`systemValue`.
)");
uint32_t regIndex;
uint32_t regIndex = 0;
DOCUMENT("The :class:`ShaderBuiltin` value that this element contains.");
ShaderBuiltin systemValue;
ShaderBuiltin systemValue = ShaderBuiltin::Undefined;
DOCUMENT("The :class:`component type <CompType>` of data that this element stores.");
CompType compType;
CompType compType = CompType::Float;
DOCUMENT(R"(A bitmask indicating which components in the shader register are stored, for APIs that
pack signatures together.
)");
uint8_t regChannelMask;
uint8_t regChannelMask = 0;
DOCUMENT(R"(A bitmask indicating which components in the shader register are actually used by the
shader itself, for APIs that pack signatures together.
)");
uint8_t channelUsedMask;
uint8_t channelUsedMask = 0;
DOCUMENT("A convenience flag - ``True`` if the semantic name is unique and no index is needed.");
bool needSemanticIndex;
bool needSemanticIndex = false;
DOCUMENT("The number of components used to store this element. See :data:`compType`.");
uint32_t compCount;
uint32_t compCount = 0;
DOCUMENT(
"Selects a stream for APIs that provide multiple output streams for the same named output.");
uint32_t stream;
uint32_t stream = 0;
DOCUMENT("If this element is part of an array, indicates the index, or :data:`NoIndex` if not.");
uint32_t arrayIndex;
uint32_t arrayIndex = ~0U;
static const uint32_t NoIndex = ~0U;
};
@@ -313,6 +387,31 @@ struct ShaderConstant;
DOCUMENT("Describes the storage characteristics for a basic :class:`ShaderConstant` in memory.");
struct ShaderVariableDescriptor
{
DOCUMENT("");
bool operator==(const ShaderVariableDescriptor &o) const
{
return type == o.type && rows == o.rows && cols == o.cols &&
rowMajorStorage == o.rowMajorStorage && elements == o.elements &&
arrayStride == o.arrayStride && name == o.name;
}
bool operator<(const ShaderVariableDescriptor &o) const
{
if(!(type == o.type))
return type < o.type;
if(!(rows == o.rows))
return rows < o.rows;
if(!(cols == o.cols))
return cols < o.cols;
if(!(rowMajorStorage == o.rowMajorStorage))
return rowMajorStorage < o.rowMajorStorage;
if(!(elements == o.elements))
return elements < o.elements;
if(!(arrayStride == o.arrayStride))
return arrayStride < o.arrayStride;
if(!(name == o.name))
return name < o.name;
return false;
}
DOCUMENT("The :class:`VarType` that this basic constant stores.");
VarType type;
DOCUMENT("The number of rows in this matrix.");
@@ -334,6 +433,19 @@ DECLARE_REFLECTION_STRUCT(ShaderVariableDescriptor);
DOCUMENT("Describes the type and members of a :class:`ShaderConstant`.");
struct ShaderVariableType
{
DOCUMENT("");
bool operator==(const ShaderVariableType &o) const
{
return descriptor == o.descriptor && members == o.members;
}
bool operator<(const ShaderVariableType &o) const
{
if(!(descriptor == o.descriptor))
return descriptor < o.descriptor;
if(!(members == o.members))
return members < o.members;
return false;
}
DOCUMENT("The :class:`ShaderVariableDescriptor` that describes the current constant.");
ShaderVariableDescriptor descriptor;
@@ -346,6 +458,16 @@ DECLARE_REFLECTION_STRUCT(ShaderVariableType);
DOCUMENT("Describes the offset of a constant in memory in terms of 16 byte vectors.");
struct ShaderRegister
{
DOCUMENT("");
bool operator==(const ShaderRegister &o) const { return vec == o.vec && comp == o.comp; }
bool operator<(const ShaderRegister &o) const
{
if(!(vec == o.vec))
return vec < o.vec;
if(!(comp == o.comp))
return comp < o.comp;
return false;
}
DOCUMENT("The index of the 16 byte vector where this register begins");
uint32_t vec;
DOCUMENT("The 4 byte component within that vector where this register begins");
@@ -357,6 +479,23 @@ DECLARE_REFLECTION_STRUCT(ShaderRegister);
DOCUMENT("Contains the detail of a constant within a :class:`ConstantBlock` in memory.");
struct ShaderConstant
{
DOCUMENT("");
bool operator==(const ShaderConstant &o) const
{
return name == o.name && reg == o.reg && defaultValue == o.defaultValue && type == o.type;
}
bool operator<(const ShaderConstant &o) const
{
if(!(name == o.name))
return name < o.name;
if(!(reg == o.reg))
return reg < o.reg;
if(!(defaultValue == o.defaultValue))
return defaultValue < o.defaultValue;
if(!(type == o.type))
return type < o.type;
return false;
}
DOCUMENT("The name of this constant");
rdcstr name;
DOCUMENT(
@@ -378,6 +517,26 @@ information.
)");
struct ConstantBlock
{
DOCUMENT("");
bool operator==(const ConstantBlock &o) const
{
return name == o.name && variables == o.variables && bindPoint == o.bindPoint &&
byteSize == o.byteSize && bufferBacked == o.bufferBacked;
}
bool operator<(const ConstantBlock &o) const
{
if(!(name == o.name))
return name < o.name;
if(!(variables == o.variables))
return variables < o.variables;
if(!(bindPoint == o.bindPoint))
return bindPoint < o.bindPoint;
if(!(byteSize == o.byteSize))
return byteSize < o.byteSize;
if(!(bufferBacked == o.bufferBacked))
return bufferBacked < o.bufferBacked;
return false;
}
DOCUMENT("The name of this constant block, may be empty on some APIs.");
rdcstr name;
DOCUMENT("The constants contained within this block as a list of :class:`ShaderConstant`.");
@@ -405,6 +564,19 @@ relevant.
)");
struct ShaderSampler
{
DOCUMENT("");
bool operator==(const ShaderSampler &o) const
{
return name == o.name && bindPoint == o.bindPoint;
}
bool operator<(const ShaderSampler &o) const
{
if(!(name == o.name))
return name < o.name;
if(!(bindPoint == o.bindPoint))
return bindPoint < o.bindPoint;
return false;
}
DOCUMENT("The name of this sampler.");
rdcstr name;
@@ -424,6 +596,28 @@ directly by means of the API resource binding system.
)");
struct ShaderResource
{
DOCUMENT("");
bool operator==(const ShaderResource &o) const
{
return resType == o.resType && name == o.name && variableType == o.variableType &&
bindPoint == o.bindPoint && IsTexture == o.IsTexture && IsReadOnly == o.IsReadOnly;
}
bool operator<(const ShaderResource &o) const
{
if(!(resType == o.resType))
return resType < o.resType;
if(!(name == o.name))
return name < o.name;
if(!(variableType == o.variableType))
return variableType < o.variableType;
if(!(bindPoint == o.bindPoint))
return bindPoint < o.bindPoint;
if(!(IsTexture == o.IsTexture))
return IsTexture < o.IsTexture;
if(!(IsReadOnly == o.IsReadOnly))
return IsReadOnly < o.IsReadOnly;
return false;
}
DOCUMENT("The :class:`TextureDim` that describes the type of this resource.");
TextureDim resType;
@@ -454,6 +648,16 @@ DECLARE_REFLECTION_STRUCT(ShaderResource);
DOCUMENT("Describes an entry point in a shader.");
struct ShaderEntryPoint
{
DOCUMENT("");
bool operator==(const ShaderEntryPoint &o) const { return name == o.name && stage == o.stage; }
bool operator<(const ShaderEntryPoint &o) const
{
if(!(name == o.name))
return name < o.name;
if(!(stage == o.stage))
return stage < o.stage;
return false;
}
DOCUMENT("The name of the entry point.");
rdcstr name;
@@ -466,6 +670,16 @@ DECLARE_REFLECTION_STRUCT(ShaderEntryPoint);
DOCUMENT("Contains a single flag used at compile-time on a shader.");
struct ShaderCompileFlag
{
DOCUMENT("");
bool operator==(const ShaderCompileFlag &o) const { return Name == o.Name && Value == o.Value; }
bool operator<(const ShaderCompileFlag &o) const
{
if(!(Name == o.Name))
return Name < o.Name;
if(!(Value == o.Value))
return Value < o.Value;
return false;
}
DOCUMENT("The name of the compile flag.");
rdcstr Name;
@@ -490,6 +704,19 @@ DECLARE_REFLECTION_STRUCT(ShaderCompileFlags);
DOCUMENT("Contains a source file available in a debug-compiled shader.");
struct ShaderSourceFile
{
DOCUMENT("");
bool operator==(const ShaderSourceFile &o) const
{
return Filename == o.Filename && Contents == o.Contents;
}
bool operator<(const ShaderSourceFile &o) const
{
if(!(Filename == o.Filename))
return Filename < o.Filename;
if(!(Contents == o.Contents))
return Contents < o.Contents;
return false;
}
DOCUMENT("The filename of this source file.");
rdcstr Filename;
@@ -576,6 +803,7 @@ See :class:`ShaderBindpointMapping` for how this mapping works in detail.
)");
struct BindpointMap
{
DOCUMENT("");
BindpointMap()
{
bindset = 0;
@@ -594,7 +822,7 @@ struct BindpointMap
bool operator<(const BindpointMap &o) const
{
if(bindset != o.bindset)
if(!(bindset == o.bindset))
return bindset < o.bindset;
return bind < o.bind;
}
+304 -2
View File
@@ -29,6 +29,84 @@ namespace VKPipe
DOCUMENT("The contents of a single binding element within a descriptor set, possibly in an array.");
struct BindingElement
{
DOCUMENT("");
bool operator==(const BindingElement &o) const
{
return view == o.view && res == o.res && sampler == o.sampler &&
immutableSampler == o.immutableSampler && viewfmt == o.viewfmt &&
swizzle[0] == o.swizzle[0] && swizzle[1] == o.swizzle[1] && swizzle[2] == o.swizzle[2] &&
swizzle[3] == o.swizzle[3] && baseMip == o.baseMip && baseLayer == o.baseLayer &&
numMip == o.numMip && numLayer == o.numLayer && offset == o.offset && size == o.size &&
Filter == o.Filter && AddressU == o.AddressU && AddressV == o.AddressV &&
AddressW == o.AddressW && mipBias == o.mipBias && maxAniso == o.maxAniso &&
comparison == o.comparison && minlod == o.minlod && maxlod == o.maxlod &&
BorderColor[0] == o.BorderColor[0] && BorderColor[1] == o.BorderColor[1] &&
BorderColor[2] == o.BorderColor[2] && BorderColor[3] == o.BorderColor[3] &&
unnormalized == o.unnormalized;
}
bool operator<(const BindingElement &o) const
{
if(!(view == o.view))
return view < o.view;
if(!(res == o.res))
return res < o.res;
if(!(sampler == o.sampler))
return sampler < o.sampler;
if(!(immutableSampler == o.immutableSampler))
return immutableSampler < o.immutableSampler;
if(!(viewfmt == o.viewfmt))
return viewfmt < o.viewfmt;
if(!(swizzle[0] == o.swizzle[0]))
return swizzle[0] < o.swizzle[0];
if(!(swizzle[1] == o.swizzle[1]))
return swizzle[1] < o.swizzle[1];
if(!(swizzle[2] == o.swizzle[2]))
return swizzle[2] < o.swizzle[2];
if(!(swizzle[3] == o.swizzle[3]))
return swizzle[3] < o.swizzle[3];
if(!(baseMip == o.baseMip))
return baseMip < o.baseMip;
if(!(baseLayer == o.baseLayer))
return baseLayer < o.baseLayer;
if(!(numMip == o.numMip))
return numMip < o.numMip;
if(!(numLayer == o.numLayer))
return numLayer < o.numLayer;
if(!(offset == o.offset))
return offset < o.offset;
if(!(size == o.size))
return size < o.size;
if(!(Filter == o.Filter))
return Filter < o.Filter;
if(!(AddressU == o.AddressU))
return AddressU < o.AddressU;
if(!(AddressV == o.AddressV))
return AddressV < o.AddressV;
if(!(AddressW == o.AddressW))
return AddressW < o.AddressW;
if(!(mipBias == o.mipBias))
return mipBias < o.mipBias;
if(!(maxAniso == o.maxAniso))
return maxAniso < o.maxAniso;
if(!(comparison == o.comparison))
return comparison < o.comparison;
if(!(minlod == o.minlod))
return minlod < o.minlod;
if(!(maxlod == o.maxlod))
return maxlod < o.maxlod;
if(!(BorderColor[0] == o.BorderColor[0]))
return BorderColor[0] < o.BorderColor[0];
if(!(BorderColor[1] == o.BorderColor[1]))
return BorderColor[1] < o.BorderColor[1];
if(!(BorderColor[2] == o.BorderColor[2]))
return BorderColor[2] < o.BorderColor[2];
if(!(BorderColor[3] == o.BorderColor[3]))
return BorderColor[3] < o.BorderColor[3];
if(!(unnormalized == o.unnormalized))
return unnormalized < o.unnormalized;
return false;
}
DOCUMENT("The :class:`ResourceId` of the current view object, if one is in use.");
ResourceId view; // bufferview, imageview, attachmentview
DOCUMENT("The :class:`ResourceId` of the current underlying buffer or image object.");
@@ -95,6 +173,24 @@ struct BindingElement
DOCUMENT("The contents of a single binding within a descriptor set, either arrayed or not.");
struct DescriptorBinding
{
DOCUMENT("");
bool operator==(const DescriptorBinding &o) const
{
return descriptorCount == o.descriptorCount && type == o.type && stageFlags == o.stageFlags &&
binds == o.binds;
}
bool operator<(const DescriptorBinding &o) const
{
if(!(descriptorCount == o.descriptorCount))
return descriptorCount < o.descriptorCount;
if(!(type == o.type))
return type < o.type;
if(!(stageFlags == o.stageFlags))
return stageFlags < o.stageFlags;
if(!(binds == o.binds))
return binds < o.binds;
return false;
}
DOCUMENT(R"(How many descriptors are in this binding array.
If this binding is empty/non-existant this value will be ``0``.
)");
@@ -113,6 +209,21 @@ If :data:`descriptorCount` is 1 then this isn't an array, and this list has only
DOCUMENT("The contents of a descriptor set.");
struct DescriptorSet
{
DOCUMENT("");
bool operator==(const DescriptorSet &o) const
{
return layout == o.layout && descset == o.descset && bindings == o.bindings;
}
bool operator<(const DescriptorSet &o) const
{
if(!(layout == o.layout))
return layout < o.layout;
if(!(descset == o.descset))
return descset < o.descset;
if(!(bindings == o.bindings))
return bindings < o.bindings;
return false;
}
DOCUMENT("The :class:`ResourceId` of the descriptor set layout that matches this set.");
ResourceId layout;
DOCUMENT("The :class:`ResourceId` of the descriptor set object.");
@@ -159,6 +270,24 @@ struct InputAssembly
DOCUMENT("Describes the configuration of a single vertex attribute.");
struct VertexAttribute
{
DOCUMENT("");
bool operator==(const VertexAttribute &o) const
{
return location == o.location && binding == o.binding && format == o.format &&
byteoffset == o.byteoffset;
}
bool operator<(const VertexAttribute &o) const
{
if(!(location == o.location))
return location < o.location;
if(!(binding == o.binding))
return binding < o.binding;
if(!(format == o.format))
return format < o.format;
if(!(byteoffset == o.byteoffset))
return byteoffset < o.byteoffset;
return false;
}
DOCUMENT("The location in the shader that is bound to this attribute.");
uint32_t location = 0;
DOCUMENT("The vertex binding where data will be sourced from.");
@@ -174,6 +303,22 @@ struct VertexAttribute
DOCUMENT("Describes a vertex binding.");
struct VertexBinding
{
DOCUMENT("");
bool operator==(const VertexBinding &o) const
{
return vbufferBinding == o.vbufferBinding && bytestride == o.bytestride &&
perInstance == o.perInstance;
}
bool operator<(const VertexBinding &o) const
{
if(!(vbufferBinding == o.vbufferBinding))
return vbufferBinding < o.vbufferBinding;
if(!(bytestride == o.bytestride))
return bytestride < o.bytestride;
if(!(perInstance == o.perInstance))
return perInstance < o.perInstance;
return false;
}
DOCUMENT("The vertex binding where data will be sourced from.");
uint32_t vbufferBinding = 0;
DOCUMENT("The byte stride between the start of one set of vertex data and the next.");
@@ -185,6 +330,16 @@ struct VertexBinding
DOCUMENT("Describes a single Vulkan vertex buffer binding.")
struct VB
{
DOCUMENT("");
bool operator==(const VB &o) const { return buffer == o.buffer && offset == o.offset; }
bool operator<(const VB &o) const
{
if(!(buffer == o.buffer))
return buffer < o.buffer;
if(!(offset == o.offset))
return offset < o.offset;
return false;
}
DOCUMENT("The :class:`ResourceId` of the buffer bound to this slot.");
ResourceId buffer;
DOCUMENT("The byte offset from the start of the buffer to the beginning of the vertex data.");
@@ -205,6 +360,16 @@ struct VertexInput
DOCUMENT("The provided value for a specialization constant.");
struct SpecInfo
{
DOCUMENT("");
bool operator==(const SpecInfo &o) const { return specID == o.specID && data == o.data; }
bool operator<(const SpecInfo &o) const
{
if(!(specID == o.specID))
return specID < o.specID;
if(!(data == o.data))
return data < o.data;
return false;
}
DOCUMENT("The specialization ID");
uint32_t specID = 0;
DOCUMENT("A ``bytes`` with the contents of the constant.");
@@ -243,6 +408,28 @@ struct Tessellation
DOCUMENT("Describes a single Vulkan viewport.");
struct Viewport
{
DOCUMENT("");
bool operator==(const Viewport &o) const
{
return x == o.x && y == o.y && width == o.width && height == o.height &&
minDepth == o.minDepth && maxDepth == o.maxDepth;
}
bool operator<(const Viewport &o) const
{
if(!(x == o.x))
return x < o.x;
if(!(y == o.y))
return y < o.y;
if(!(width == o.width))
return width < o.width;
if(!(height == o.height))
return height < o.height;
if(!(minDepth == o.minDepth))
return minDepth < o.minDepth;
if(!(maxDepth == o.maxDepth))
return maxDepth < o.maxDepth;
return false;
}
DOCUMENT("The X co-ordinate of the viewport.");
float x = 0.0f;
DOCUMENT("The Y co-ordinate of the viewport.");
@@ -260,6 +447,23 @@ struct Viewport
DOCUMENT("Describes a single Vulkan scissor region.");
struct Scissor
{
DOCUMENT("");
bool operator==(const Scissor &o) const
{
return x == o.x && y == o.y && width == o.width && height == o.height;
}
bool operator<(const Scissor &o) const
{
if(!(x == o.x))
return x < o.x;
if(!(y == o.y))
return y < o.y;
if(!(width == o.width))
return width < o.width;
if(!(height == o.height))
return height < o.height;
return false;
}
DOCUMENT("The X co-ordinate of the scissor region.");
int32_t x = 0;
DOCUMENT("The Y co-ordinate of the scissor region.");
@@ -273,6 +477,9 @@ struct Scissor
DOCUMENT("Describes a combined viewport and scissor region.");
struct ViewportScissor
{
DOCUMENT("");
bool operator==(const ViewportScissor &o) const { return vp == o.vp && scissor == o.scissor; }
bool operator<(const ViewportScissor &o) const { return vp == o.vp && scissor == o.scissor; }
DOCUMENT("The :class:`VK_Viewport`.");
Viewport vp;
DOCUMENT("The :class:`VK_Scissor`.");
@@ -332,6 +539,21 @@ struct MultiSample
DOCUMENT("Describes the details of a Vulkan blend operation.");
struct BlendEquation
{
DOCUMENT("");
bool operator==(const BlendEquation &o) const
{
return Source == o.Source && Destination == o.Destination && Operation == o.Operation;
}
bool operator<(const BlendEquation &o) const
{
if(!(Source == o.Source))
return Source < o.Source;
if(!(Destination == o.Destination))
return Destination < o.Destination;
if(!(Operation == o.Operation))
return Operation < o.Operation;
return false;
}
DOCUMENT("The :class:`BlendMultiplier` for the source blend value.");
BlendMultiplier Source = BlendMultiplier::One;
DOCUMENT("The :class:`BlendMultiplier` for the destination blend value.");
@@ -343,14 +565,32 @@ struct BlendEquation
DOCUMENT("Describes the blend configuration for a given Vulkan attachment.");
struct Blend
{
DOCUMENT("``True`` if blending is enabled for this attachment.");
bool blendEnable = false;
DOCUMENT("");
bool operator==(const Blend &o) const
{
return blendEnable == o.blendEnable && blend == o.blend && alphaBlend == o.alphaBlend &&
writeMask == o.writeMask;
}
bool operator<(const Blend &o) const
{
if(!(blendEnable == o.blendEnable))
return blendEnable < o.blendEnable;
if(!(blend == o.blend))
return blend < o.blend;
if(!(alphaBlend == o.alphaBlend))
return alphaBlend < o.alphaBlend;
if(!(writeMask == o.writeMask))
return writeMask < o.writeMask;
return false;
}
DOCUMENT("A :class:`VK_BlendEquation` describing the blending for colour values.");
BlendEquation blend;
DOCUMENT("A :class:`VK_BlendEquation` describing the blending for alpha values.");
BlendEquation alphaBlend;
DOCUMENT("``True`` if blending is enabled for this attachment.");
bool blendEnable = false;
DOCUMENT("The mask for writes to the attachment.");
uint8_t writeMask = 0;
};
@@ -447,6 +687,40 @@ If there is no depth-stencil attachment, this index is ``-1``.
DOCUMENT("Describes a single attachment in a framebuffer object.");
struct Attachment
{
DOCUMENT("");
bool operator==(const Attachment &o) const
{
return view == o.view && img == o.img && viewfmt == o.viewfmt && swizzle[0] == o.swizzle[0] &&
swizzle[1] == o.swizzle[1] && swizzle[2] == o.swizzle[2] && swizzle[3] == o.swizzle[3] &&
baseMip == o.baseMip && baseLayer == o.baseLayer && numMip == o.numMip &&
numLayer == o.numLayer;
}
bool operator<(const Attachment &o) const
{
if(!(view == o.view))
return view < o.view;
if(!(img == o.img))
return img < o.img;
if(!(viewfmt == o.viewfmt))
return viewfmt < o.viewfmt;
if(!(swizzle[0] == o.swizzle[0]))
return swizzle[0] < o.swizzle[0];
if(!(swizzle[1] == o.swizzle[1]))
return swizzle[1] < o.swizzle[1];
if(!(swizzle[2] == o.swizzle[2]))
return swizzle[2] < o.swizzle[2];
if(!(swizzle[3] == o.swizzle[3]))
return swizzle[3] < o.swizzle[3];
if(!(baseMip == o.baseMip))
return baseMip < o.baseMip;
if(!(baseLayer == o.baseLayer))
return baseLayer < o.baseLayer;
if(!(numMip == o.numMip))
return numMip < o.numMip;
if(!(numLayer == o.numLayer))
return numLayer < o.numLayer;
return false;
}
DOCUMENT("The :class:`ResourceId` of the image view itself.");
ResourceId view;
DOCUMENT("The :class:`ResourceId` of the underlying image that the view refers to.");
@@ -511,6 +785,26 @@ struct CurrentPass
DOCUMENT("Contains the layout of a range of subresources in an image.");
struct ImageLayout
{
DOCUMENT("");
bool operator==(const ImageLayout &o) const
{
return baseMip == o.baseMip && baseLayer == o.baseLayer && numMip == o.numMip &&
numLayer == o.numLayer && name == o.name;
}
bool operator<(const ImageLayout &o) const
{
if(!(baseMip == o.baseMip))
return baseMip < o.baseMip;
if(!(baseLayer == o.baseLayer))
return baseLayer < o.baseLayer;
if(!(numMip == o.numMip))
return numMip < o.numMip;
if(!(numLayer == o.numLayer))
return numLayer < o.numLayer;
if(!(name == o.name))
return name < o.name;
return false;
}
DOCUMENT("The first mip level used in the range.");
uint32_t baseMip = 0;
DOCUMENT("For 3D textures and texture arrays, the first slice used in the range.");
@@ -526,6 +820,14 @@ struct ImageLayout
DOCUMENT("Contains the current layout of all subresources in the image.");
struct ImageData
{
DOCUMENT("");
bool operator==(const ImageData &o) const { return image == o.image; }
bool operator<(const ImageData &o) const
{
if(!(image == o.image))
return image < o.image;
return false;
}
DOCUMENT("The :class:`ResourceId` of the image.");
ResourceId image;
+1 -1
View File
@@ -2034,7 +2034,7 @@ void DoSerialise(SerialiserType &ser, VKPipe::Blend &el)
SERIALISE_MEMBER(alphaBlend);
SERIALISE_MEMBER(writeMask);
SIZE_CHECK(32);
SIZE_CHECK(28);
}
template <typename SerialiserType>