| <?xml version="1.0" encoding="utf-8" ?> |
| <AutoVisualizer |
| xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> |
| <Type Name="gfx::Point"> |
| <AlternativeType Name="gfx::PointF"/> |
| <DisplayString>({x_}, {y_})</DisplayString> |
| </Type> |
| <Type Name="gfx::Size"> |
| <AlternativeType Name="gfx::SizeF"/> |
| <DisplayString>({width_}, {height_})</DisplayString> |
| </Type> |
| <Type Name="gfx::Rect"> |
| <AlternativeType Name="gfx::RectF"/> |
| <DisplayString>({origin_.x_}, {origin_.y_}) x ({size_.width_}, {size_.height_})</DisplayString> |
| </Type> |
| <Type Name="gfx::Matrix44"> |
| <Expand> |
| <ArrayItems> |
| <!-- Matrix44 is stored column-major, "Backward" makes the index appear as [row,col]. --> |
| <Direction>Backward</Direction> |
| <Rank>2</Rank> |
| <Size>4</Size> |
| <ValuePointer>matrix_[0]</ValuePointer> |
| </ArrayItems> |
| </Expand> |
| </Type> |
| <Type Name="gfx::AxisTransform2d"> |
| <DisplayString>({scale_.x_}, {scale_.y_}) + ({translation_.x_}, {translation_.y_})</DisplayString> |
| </Type> |
| <Type Name="gfx::Transform"> |
| <DisplayString Condition="full_matrix_">{{ full_matrix_={full_matrix_} }}</DisplayString> |
| <DisplayString Condition="!full_matrix_">{{ axis_2d_={axis_2d_} }}</DisplayString> |
| <Expand> |
| <ExpandedItem Condition="full_matrix_ == true">matrix_</ExpandedItem> |
| <ExpandedItem Condition="!full_matrix_">axis_2d_</ExpandedItem> |
| </Expand> |
| </Type> |
| <Type Name="gpu::Mailbox"> |
| <!-- Special case when `IsZero` --> |
| <DisplayString Condition="name[0] == 0 && name[1] == 0 && name[2] == 0 && name[3] == 0 |
| && name[4] == 0 && name[5] == 0 && name[6] == 0 && name[7] == 0 |
| && name[8] == 0 && name[9] == 0 && name[10] == 0 && name[11] == 0 |
| && name[12] == 0 && name[13] == 0 && name[14] == 0 && name[15] == 0">{{ name=[zero] }}</DisplayString> |
| <!-- Displays the `ToDebugString` output, which is the name, as hex, with the bytes separated with a colon ":". --> |
| <DisplayString>{{ name={name[0],nvoXb}:{name[1],nvoXb}:{name[2],nvoXb}:{name[3],nvoXb}:{name[4],nvoXb}:{name[5],nvoXb}:{name[6],nvoXb}:{name[7],nvoXb}:{name[8],nvoXb}:{name[9],nvoXb}:{name[10],nvoXb}:{name[11],nvoXb}:{name[12],nvoXb}:{name[13],nvoXb}:{name[14],nvoXb}:{name[15],nvoXb} }}</DisplayString> |
| </Type> |
| <Type Name="viz::SharedImageFormat"> |
| <DisplayString Condition="plane_type_ == kSinglePlane">{format_.singleplanar_format}</DisplayString> |
| <DisplayString Condition="plane_type_ == kMultiPlane">{format_.multiplanar_format}</DisplayString> |
| </Type> |
| <Type Name="scoped_refptr<*>"> |
| <SmartPointer Usage="Minimal">ptr_</SmartPointer> |
| <DisplayString Condition="ptr_ == 0">null</DisplayString> |
| <DisplayString>[{((base::subtle::RefCountedBase*)ptr_)->ref_count_}] {(void*)ptr_} {*ptr_}</DisplayString> |
| <Expand> |
| <Item Name="Ptr">ptr_</Item> |
| <Item Name="RefCount" Condition="ptr_ != 0">((base::subtle::RefCountedBase*)ptr_)->ref_count_</Item> |
| <ExpandedItem Condition="ptr_ != 0">ptr_</ExpandedItem> |
| </Expand> |
| </Type> |
| <Type Name="IPC::Message::Header"> |
| <DisplayString>{{Routing: {routing}, Type: {type}}}</DisplayString> |
| <Expand> |
| <Item Name="RoutingId">routing</Item> |
| <Item Name="Type">type</Item> |
| <Synthetic Name="Priority" |
| Condition="(flags & IPC::Message::PRIORITY_MASK) == |
| IPC::Message::PRIORITY_LOW"> |
| <DisplayString>Low</DisplayString> |
| </Synthetic> |
| <Synthetic Name="Priority" |
| Condition="(flags & IPC::Message::PRIORITY_MASK) == |
| IPC::Message::PRIORITY_NORMAL"> |
| <DisplayString>Normal</DisplayString> |
| </Synthetic> |
| <Synthetic Name="Priority" |
| Condition="(flags & IPC::Message::PRIORITY_MASK) == |
| IPC::Message::PRIORITY_HIGH"> |
| <DisplayString>High</DisplayString> |
| </Synthetic> |
| <Synthetic Name="Sync" |
| Condition="(flags & IPC::Message::SYNC_BIT) != 0"> |
| <DisplayString>true</DisplayString> |
| </Synthetic> |
| <Synthetic Name="Sync" |
| Condition="(flags & IPC::Message::SYNC_BIT) == 0"> |
| <DisplayString>false</DisplayString> |
| </Synthetic> |
| <Synthetic Name="Reply" |
| Condition="(flags & IPC::Message::REPLY_BIT) != 0"> |
| <DisplayString>true</DisplayString> |
| </Synthetic> |
| <Synthetic Name="Reply" |
| Condition="(flags & IPC::Message::REPLY_BIT) == 0"> |
| <DisplayString>false</DisplayString> |
| </Synthetic> |
| <Synthetic Name="ReplyError" |
| Condition="(flags & IPC::Message::REPLY_ERROR_BIT) != 0"> |
| <DisplayString>true</DisplayString> |
| </Synthetic> |
| <Synthetic Name="ReplyError" |
| Condition="(flags & IPC::Message::REPLY_ERROR_BIT) == 0"> |
| <DisplayString>false</DisplayString> |
| </Synthetic> |
| <Synthetic Name="Unblock" |
| Condition="(flags & IPC::Message::UNBLOCK_BIT) != 0"> |
| <DisplayString>true</DisplayString> |
| </Synthetic> |
| <Synthetic Name="Unblock" |
| Condition="(flags & IPC::Message::UNBLOCK_BIT) == 0"> |
| <DisplayString>false</DisplayString> |
| </Synthetic> |
| <Synthetic Name="PumpingMessages" |
| Condition="(flags & IPC::Message::PUMPING_MSGS_BIT) != 0"> |
| <DisplayString>true</DisplayString> |
| </Synthetic> |
| <Synthetic Name="PumpingMessages" |
| Condition="(flags & IPC::Message::PUMPING_MSGS_BIT) == 0"> |
| <DisplayString>false</DisplayString> |
| </Synthetic> |
| <Synthetic Name="HasSentTime" |
| Condition="(flags & IPC::Message::HAS_SENT_TIME_BIT) != 0"> |
| <DisplayString>true</DisplayString> |
| </Synthetic> |
| <Synthetic Name="HasSentTime" |
| Condition="(flags & IPC::Message::HAS_SENT_TIME_BIT) == 0"> |
| <DisplayString>false</DisplayString> |
| </Synthetic> |
| </Expand> |
| </Type> |
| <Type Name="IPC::Message"> |
| <DisplayString>{{size = {header_size_+capacity_after_header_}}}</DisplayString> |
| <Expand> |
| <ExpandedItem>*((IPC::Message::Header*)header_),nd</ExpandedItem> |
| <Item Name="Payload">(void*)((char*)header_ + header_size_)</Item> |
| </Expand> |
| </Type> |
| <Type Name="base::FilePath"> |
| <DisplayString>{path_}</DisplayString> |
| </Type> |
| <!-- Handles most classes inside base/time/time.h --> |
| <Type Name="base::time_internal::TimeBase<*>"> |
| <Intrinsic Name="microseconds" Expression="us_.value_" /> |
| <!-- These static constexpr values are not consistently embedded in |
| the PDB. To ensure it works in all build configs, define them directly |
| here. If/when https://github.com/llvm/llvm-project/issues/46924 gets |
| resolved, we can likely remove these in favor of referencing the |
| symbol. --> |
| <Intrinsic Name="kHoursPerDay" Expression="24" /> |
| <Intrinsic Name="kMinutesPerHour" Expression="60" /> |
| <Intrinsic Name="kSecondsPerMinute" Expression="60" /> |
| <Intrinsic Name="kMillisecondsPerSecond" Expression="1000" /> |
| <Intrinsic Name="kMicrosecondsPerMillisecond" Expression="1000" /> |
| <Intrinsic Name="kMicrosecondsPerSecond" Expression="kMicrosecondsPerMillisecond() * kMillisecondsPerSecond()" /> |
| <Intrinsic Name="kMicrosecondsPerMinute" Expression="kMicrosecondsPerSecond() * kSecondsPerMinute()" /> |
| <Intrinsic Name="kMicrosecondsPerHour" Expression="(int64_t)kMicrosecondsPerMinute() * kMinutesPerHour()" /> |
| <Intrinsic Name="kMicrosecondsPerDay" Expression="(int64_t)kMicrosecondsPerHour() * kHoursPerDay()" /> |
| <Intrinsic Name="microseconds_float" Expression="microseconds() * 1.0" /> |
| <DisplayString Condition="microseconds() % kMicrosecondsPerDay() == 0">{microseconds() / kMicrosecondsPerDay()}d</DisplayString> |
| <DisplayString Condition="microseconds() % kMicrosecondsPerHour() == 0">{microseconds() / kMicrosecondsPerHour()}h</DisplayString> |
| <DisplayString Condition="microseconds() % kMicrosecondsPerMinute() == 0">{microseconds() / kMicrosecondsPerMinute()}m</DisplayString> |
| <DisplayString Condition="microseconds() % kMicrosecondsPerSecond() == 0">{microseconds() / kMicrosecondsPerSecond()}s</DisplayString> |
| <DisplayString Condition="microseconds() % kMicrosecondsPerMillisecond() == 0">{microseconds() / kMicrosecondsPerMillisecond()}ms</DisplayString> |
| <DisplayString>{microseconds()}us</DisplayString> |
| <Expand> |
| <Item Name="[in days]">microseconds_float() / kMicrosecondsPerDay()</Item> |
| <Item Name="[in hours]">microseconds_float() / kMicrosecondsPerHour()</Item> |
| <Item Name="[in minutes]">microseconds_float() / kMicrosecondsPerMinute()</Item> |
| <Item Name="[in seconds]">microseconds_float() / kMicrosecondsPerSecond()</Item> |
| <Item Name="[in milliseconds]">microseconds_float() / kMicrosecondsPerMillisecond()</Item> |
| <Item Name="[in microseconds]">microseconds()</Item> |
| </Expand> |
| </Type> |
| <Type Name="base::TimeDelta"> |
| <Intrinsic Name="microseconds" Expression="delta_.value_" /> |
| <!-- The below should be identical to the Type definition for base::time_internal::TimeBase<*>. --> |
| <Intrinsic Name="kHoursPerDay" Expression="24" /> |
| <Intrinsic Name="kMinutesPerHour" Expression="60" /> |
| <Intrinsic Name="kSecondsPerMinute" Expression="60" /> |
| <Intrinsic Name="kMillisecondsPerSecond" Expression="1000" /> |
| <Intrinsic Name="kMicrosecondsPerMillisecond" Expression="1000" /> |
| <Intrinsic Name="kMicrosecondsPerSecond" Expression="kMicrosecondsPerMillisecond() * kMillisecondsPerSecond()" /> |
| <Intrinsic Name="kMicrosecondsPerMinute" Expression="kMicrosecondsPerSecond() * kSecondsPerMinute()" /> |
| <Intrinsic Name="kMicrosecondsPerHour" Expression="(int64_t)kMicrosecondsPerMinute() * kMinutesPerHour()" /> |
| <Intrinsic Name="kMicrosecondsPerDay" Expression="(int64_t)kMicrosecondsPerHour() * kHoursPerDay()" /> |
| <Intrinsic Name="microseconds_float" Expression="microseconds() * 1.0" /> |
| <DisplayString Condition="microseconds() % kMicrosecondsPerDay() == 0">{microseconds() / kMicrosecondsPerDay()}d</DisplayString> |
| <DisplayString Condition="microseconds() % kMicrosecondsPerHour() == 0">{microseconds() / kMicrosecondsPerHour()}h</DisplayString> |
| <DisplayString Condition="microseconds() % kMicrosecondsPerMinute() == 0">{microseconds() / kMicrosecondsPerMinute()}m</DisplayString> |
| <DisplayString Condition="microseconds() % kMicrosecondsPerSecond() == 0">{microseconds() / kMicrosecondsPerSecond()}s</DisplayString> |
| <DisplayString Condition="microseconds() % kMicrosecondsPerMillisecond() == 0">{microseconds() / kMicrosecondsPerMillisecond()}ms</DisplayString> |
| <DisplayString>{microseconds()}us</DisplayString> |
| <Expand> |
| <Item Name="[in days]">microseconds_float() / kMicrosecondsPerDay()</Item> |
| <Item Name="[in hours]">microseconds_float() / kMicrosecondsPerHour()</Item> |
| <Item Name="[in minutes]">microseconds_float() / kMicrosecondsPerMinute()</Item> |
| <Item Name="[in seconds]">microseconds_float() / kMicrosecondsPerSecond()</Item> |
| <Item Name="[in milliseconds]">microseconds_float() / kMicrosecondsPerMillisecond()</Item> |
| <Item Name="[in microseconds]">microseconds()</Item> |
| </Expand> |
| </Type> |
| <Type Name="GURL"> |
| <DisplayString>{spec_}</DisplayString> |
| </Type> |
| <Type Name="base::ManualConstructor<*>"> |
| <!-- $T1 expands to the first "*" in the name which is the template |
| type. Use that to cast to the correct value. --> |
| <DisplayString>{*($T1*)space_.data_}</DisplayString> |
| <Expand> |
| <ExpandedItem>*($T1*)space_.data_</ExpandedItem> |
| </Expand> |
| </Type> |
| <!-- This type handles the case where there is one additional "is null" value. --> |
| <Type Name="base::IdType<*,*,*,*,*>"> |
| <Intrinsic Name="is_null" Expression="value_ == $T3 || value_ == $T5" /> |
| <DisplayString Condition="!is_null()">{value_}</DisplayString> |
| <DisplayString>null</DisplayString> |
| <Expand> |
| <Item Name="[value]">value_</Item> |
| <Item Name="[is_null]">is_null()</Item> |
| </Expand> |
| </Type> |
| <!-- This type handles the other cases, with a limitation warning displayed to the user if we see a 6th template value. --> |
| <Type Name="base::IdType<*>"> |
| <Intrinsic Name="is_null" Expression="value_ == $T3" /> |
| <DisplayString Condition="!is_null()">{value_}</DisplayString> |
| <DisplayString>null</DisplayString> |
| <Expand> |
| <Item Name="[value]">value_</Item> |
| <Item Name="[is_null]">is_null()</Item> |
| <!-- We can't handle arbitrary kExtraInvalidValues, so this may be null even if this indicates otherwise. |
| If this is a common scenario, add a more specific Type with the matching number of parameters |
| like we do for five template parameters above. --> |
| <Item Name="more values that may be null (see chrome.natvis)" Optional="true" ExcludeView="simple">$T6</Item> |
| </Expand> |
| </Type> |
| <Type Name="base::internal::flat_tree<*>"> |
| <DisplayString>{body_}</DisplayString> |
| <Expand> |
| <ExpandedItem>body_</ExpandedItem> |
| </Expand> |
| </Type> |
| <Type Name="base::Value"> |
| <Intrinsic Name="index" Expression="(int)data_.__impl_.__index"/> |
| <DisplayString Condition="index() == base::Value::Type::NONE" Optional="true">None</DisplayString> |
| <DisplayString Condition="index() == base::Value::Type::BOOLEAN" Optional="true">Boolean {data_.__impl_.__data.__tail.__head.__value}</DisplayString> |
| <DisplayString Condition="index() == base::Value::Type::INTEGER" Optional="true">Integer {data_.__impl_.__data.__tail.__tail.__head.__value}</DisplayString> |
| <DisplayString Condition="index() == base::Value::Type::DOUBLE" Optional="true">Double {*(double*)&data_.__impl_.__data.__tail.__tail.__tail.__head.__value.v_}</DisplayString> |
| <DisplayString Condition="index() == base::Value::Type::STRING" Optional="true">String {data_.__impl_.__data.__tail.__tail.__tail.__tail.__head.__value,na}</DisplayString> |
| <DisplayString Condition="index() == base::Value::Type::BINARY" Optional="true">Binary {data_.__impl_.__data.__tail.__tail.__tail.__tail.__tail.__head.__value}</DisplayString> |
| <DisplayString Condition="index() == base::Value::Type::DICT" Optional="true">Dict {data_.__impl_.__data.__tail.__tail.__tail.__tail.__tail.__tail.__head.__value}</DisplayString> |
| <DisplayString Condition="index() == base::Value::Type::LIST" Optional="true">List {data_.__impl_.__data.__tail.__tail.__tail.__tail.__tail.__tail.__tail.__head.__value}</DisplayString> |
| <DisplayString>Unknown type</DisplayString> |
| <Expand> |
| <ExpandedItem Condition="index() == base::Value::Type::STRING" Optional="true">data_.__impl_.__data.__tail.__tail.__tail.__tail.__head.__value,na</ExpandedItem> |
| <ExpandedItem Condition="index() == base::Value::Type::BINARY" Optional="true">data_.__impl_.__data.__tail.__tail.__tail.__tail.__tail.__head.__value</ExpandedItem> |
| <ExpandedItem Condition="index() == base::Value::Type::DICT" Optional="true">data_.__impl_.__data.__tail.__tail.__tail.__tail.__tail.__tail.__head.__value</ExpandedItem> |
| <ExpandedItem Condition="index() == base::Value::Type::LIST" Optional="true">data_.__impl_.__data.__tail.__tail.__tail.__tail.__tail.__tail.__tail.__head.__value</ExpandedItem> |
| </Expand> |
| </Type> |
| <Type Name="base::DictValue" > |
| <DisplayString>{storage_}</DisplayString> |
| <Expand> |
| <ExpandedItem>storage_</ExpandedItem> |
| </Expand> |
| </Type> |
| <Type Name="base::LazyInstance<*,*>"> |
| <Intrinsic Name="atomic_value" Expression="*(unsigned long long*)&private_instance_" /> |
| <Intrinsic Name="is_created" Expression="atomic_value() != 0" /> |
| <Intrinsic Name="instance_ptr" Expression="(($T1*)private_buf_)" /> |
| <DisplayString Condition="!is_created()">{{ not created }}</DisplayString> |
| <DisplayString Condition="is_created()">{{ created: {*instance_ptr()} }}</DisplayString> |
| <Expand> |
| <Item Name="[IsCreated]" ExcludeView="simple">is_created()</Item> |
| <Item Name="[instance]" Condition="is_created()">*instance_ptr()</Item> |
| </Expand> |
| </Type> |
| <Type Name="base::ListValue" > |
| <DisplayString>{storage_}</DisplayString> |
| <Expand> |
| <ExpandedItem>storage_</ExpandedItem> |
| </Expand> |
| </Type> |
| <Type Name="base::StrongAlias<*,*>"> |
| <DisplayString>{value_}</DisplayString> |
| </Type> |
| <Type Name="base::span<*>"> |
| <Intrinsic Name="size" Expression="size_" /> |
| <DisplayString>{{ size={size()} }}</DisplayString> |
| <Expand> |
| <ArrayItems> |
| <Size>size()</Size> |
| <ValuePointer>data_</ValuePointer> |
| </ArrayItems> |
| </Expand> |
| </Type> |
| <Type Name="base::WeakPtr<*>"> |
| <Intrinsic Name="ref_is_valid" Expression="ref_.flag_.ptr_ && (uint8_t*)&(ref_.flag_.ptr_->invalidated_.flag_)" /> |
| <Intrinsic Name="was_invalidated" Expression="ptr_ && !ref_is_valid()" /> |
| <Intrinsic Name="value" Expression="*($T1**)&ptr_" /> |
| <SmartPointer Usage="Minimal">value()</SmartPointer> |
| <DisplayString Condition="was_invalidated()">invalidated</DisplayString> |
| <DisplayString Condition="value() == 0">empty</DisplayString> |
| <DisplayString Condition="value() != 0">WeakPtr {value()}</DisplayString> |
| <Expand> |
| <Item Condition="ref_is_valid() && value() != 0" Name="[ptr]">value()</Item> |
| <Item Condition="!ref_is_valid() && value() != 0" Name="[invalidated ptr]">value()</Item> |
| <Item Name="[ref_is_valid]" ExcludeView="simple">ref_is_valid()</Item> |
| <Item Name="[was_invalidated]" Condition="!ref_is_valid()" ExcludeView="simple">was_invalidated()</Item> |
| </Expand> |
| </Type> |
| </AutoVisualizer> |