mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-04 17:10:47 +00:00
935cb113ed
* This is a string type which heavily optimises for immutability and minimal storage. It only contains one pointer to the string data and always reallocates on modify. For compile-time literals it doesn't modify or allocate. * On x64 we use the top bit in a tagged pointer to store a flag of whether it's heap or literal, on other platforms it uses a separate field (meaning another pointer sized value effectively, including padding). * This is best for structured data which tends to use a lot of immutable strings for type/name information, and only a few for actual string data (which are only allocated once and aren't modified after that). Similarly we rarely want to know only the size of any of these strings, we want the whole string so not explicitly storing the size is not a big deal. * Overall this reduces SDObject from 128 bytes to 80 bytes.
118 lines
6.0 KiB
XML
118 lines
6.0 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
|
|
<Type Name="rdcinflexiblestr">
|
|
<DisplayString>{(char*)pointer,s}</DisplayString>
|
|
<StringView>(char*)pointer,s</StringView>
|
|
<Expand>
|
|
<Synthetic Name="[mode]" Condition="is_literal != 0">
|
|
<DisplayString>Compile-Time Literal</DisplayString>
|
|
</Synthetic>
|
|
<Synthetic Name="[mode]" Condition="is_literal == 0">
|
|
<DisplayString>Heap allocated</DisplayString>
|
|
</Synthetic>
|
|
<ArrayItems>
|
|
<Size>strlen((char *)pointer)</Size>
|
|
<ValuePointer>(char *)pointer</ValuePointer>
|
|
</ArrayItems>
|
|
</Expand>
|
|
</Type>
|
|
<Type Name="rdcstr">
|
|
<DisplayString Condition="d.fixed.flags & rdcstr::FIXED_STATE">{d.fixed.str,s}</DisplayString>
|
|
<DisplayString Condition="d.fixed.flags & rdcstr::ALLOC_STATE">{d.alloc.str,s}</DisplayString>
|
|
<DisplayString>{d.arr.str,s}</DisplayString>
|
|
<StringView Condition="d.fixed.flags & rdcstr::FIXED_STATE">d.fixed.str,s</StringView>
|
|
<StringView Condition="d.fixed.flags & rdcstr::ALLOC_STATE">d.alloc.str,s</StringView>
|
|
<StringView>d.arr.str,s</StringView>
|
|
<Expand>
|
|
<Synthetic Name="[mode]" Condition="d.fixed.flags & rdcstr::FIXED_STATE">
|
|
<DisplayString>Compile-Time Literal</DisplayString>
|
|
</Synthetic>
|
|
<Item Name="[size]" ExcludeView="simple" Condition="d.fixed.flags & rdcstr::FIXED_STATE">d.fixed.size</Item>
|
|
<Item Name="[capacity]" ExcludeView="simple" Condition="d.fixed.flags & rdcstr::FIXED_STATE">"N/A"</Item>
|
|
<ArrayItems Condition="d.fixed.flags & rdcstr::FIXED_STATE">
|
|
<Size>d.fixed.size</Size>
|
|
<ValuePointer>d.fixed.str</ValuePointer>
|
|
</ArrayItems>
|
|
|
|
<Synthetic Name="[mode]" Condition="d.fixed.flags & rdcstr::ALLOC_STATE">
|
|
<DisplayString>Heap-allocated String</DisplayString>
|
|
</Synthetic>
|
|
<Item Name="[size]" ExcludeView="simple" Condition="d.fixed.flags & rdcstr::ALLOC_STATE">d.alloc.size</Item>
|
|
<Item Name="[capacity]" ExcludeView="simple" Condition="d.fixed.flags & rdcstr::ALLOC_STATE">d.alloc._capacity & rdcstr::alloc_ptr_rep::CAPACITY_MASK</Item>
|
|
<ArrayItems Condition="d.fixed.flags & rdcstr::ALLOC_STATE">
|
|
<Size>d.alloc.size</Size>
|
|
<ValuePointer>d.alloc.str</ValuePointer>
|
|
</ArrayItems>
|
|
|
|
<Synthetic Name="[mode]" Condition="(d.fixed.flags & (rdcstr::ALLOC_STATE|rdcstr::FIXED_STATE)) == 0">
|
|
<DisplayString>Internal Array Small String</DisplayString>
|
|
</Synthetic>
|
|
<Item Name="[size]" ExcludeView="simple" Condition="(d.fixed.flags & (rdcstr::ALLOC_STATE|rdcstr::FIXED_STATE)) == 0">d.arr._size</Item>
|
|
<Item Name="[capacity]" ExcludeView="simple" Condition="(d.fixed.flags & (rdcstr::ALLOC_STATE|rdcstr::FIXED_STATE)) == 0">d.arr.capacity</Item>
|
|
<ArrayItems Condition="(d.fixed.flags & (rdcstr::ALLOC_STATE|rdcstr::FIXED_STATE)) == 0">
|
|
<Size>d.arr._size</Size>
|
|
<ValuePointer>d.arr.str</ValuePointer>
|
|
</ArrayItems>
|
|
</Expand>
|
|
</Type>
|
|
<Type Name="rdcarray<*>">
|
|
<DisplayString>{{ size={usedCount} }}</DisplayString>
|
|
<Expand>
|
|
<Item Name="[size]" ExcludeView="simple">usedCount</Item>
|
|
<Item Name="[capacity]" ExcludeView="simple">allocatedCount</Item>
|
|
<ArrayItems>
|
|
<Size>usedCount</Size>
|
|
<ValuePointer>elems</ValuePointer>
|
|
</ArrayItems>
|
|
</Expand>
|
|
</Type>
|
|
<Type Name="rdcpair<*>">
|
|
<DisplayString>{{ {first}, {second} }}</DisplayString>
|
|
<Expand>
|
|
<Item Name="first" ExcludeView="simple">first</Item>
|
|
<Item Name="second" ExcludeView="simple">second</Item>
|
|
</Expand>
|
|
</Type>
|
|
<Type Name="SDType">
|
|
<DisplayString>{name}</DisplayString>
|
|
<Expand>
|
|
<Item Name="name">name</Item>
|
|
<Item Name="basetype">basetype</Item>
|
|
<Item Name="byteSize">byteSize</Item>
|
|
<Item Name="flags">flags</Item>
|
|
</Expand>
|
|
</Type>
|
|
<Type Name="SDObject">
|
|
<DisplayString Condition="type.flags & SDTypeFlags::HasCustomString">{name} = {data.str}</DisplayString>
|
|
<DisplayString Condition="type.basetype == SDBasic::String">{name} = {data.str}</DisplayString>
|
|
<DisplayString Condition="type.basetype == SDBasic::UnsignedInteger">{name} = {data.basic.u}</DisplayString>
|
|
<DisplayString Condition="type.basetype == SDBasic::SignedInteger">{name} = {data.basic.i}</DisplayString>
|
|
<DisplayString Condition="type.basetype == SDBasic::Float">{name} = {data.basic.d}</DisplayString>
|
|
<DisplayString Condition="type.basetype == SDBasic::Boolean">{name} = {data.basic.b}</DisplayString>
|
|
<DisplayString Condition="type.basetype == SDBasic::Character">{name} = {data.basic.c}</DisplayString>
|
|
<DisplayString Condition="type.basetype == SDBasic::Resource">{name} = {data.basic.id}</DisplayString>
|
|
<DisplayString Condition="type.basetype == SDBasic::Array">{name} = {type.name}[]</DisplayString>
|
|
<DisplayString>SDObject: {type.name} {name}</DisplayString>
|
|
<Expand>
|
|
<Item Condition="type.basetype == SDBasic::Array" Name="[size]" ExcludeView="simple">data.children.usedCount</Item>
|
|
<ArrayItems Condition="type.basetype == SDBasic::Array || type.basetype == SDBasic::Struct">
|
|
<Size>data.children.usedCount</Size>
|
|
<ValuePointer>data.children.elems</ValuePointer>
|
|
</ArrayItems>
|
|
<Item Condition="type.basetype != SDBasic::Array && type.basetype != SDBasic::Struct" Name="type">type</Item>
|
|
<Item Condition="type.basetype != SDBasic::Array && type.basetype != SDBasic::Struct" Name="name">name</Item>
|
|
<Item Condition="type.basetype != SDBasic::Array && type.basetype != SDBasic::Struct" Name="data">data</Item>
|
|
</Expand>
|
|
</Type>
|
|
<Type Name="SDChunk">
|
|
<DisplayString>SDChunk: {name} ({metadata.chunkID})</DisplayString>
|
|
<Expand>
|
|
<Item Name="metadata" ExcludeView="simple">metadata</Item>
|
|
<Item Name="[size]" ExcludeView="simple">data.children.usedCount</Item>
|
|
<ArrayItems>
|
|
<Size>data.children.usedCount</Size>
|
|
<ValuePointer>data.children.elems</ValuePointer>
|
|
</ArrayItems>
|
|
</Expand>
|
|
</Type>
|
|
</AutoVisualizer> |