Finish the vulkan pipeline display

This commit is contained in:
baldurk
2016-02-07 18:43:49 +01:00
parent e838f0841d
commit 70b1d241b0
8 changed files with 1025 additions and 1143 deletions
+1 -1
View File
@@ -15,7 +15,7 @@ Current Support
* A single VkInstance/VkQueue/VkDevice triple is supported.
* Capture and replay of single-frame captures.
* On replay you can step into each vkQueueSubmit call to see the command buffers submitted, and step into them to browse through the commands.
* The pipeline state will be displayed at each command, roughly showing the data contained in each member of the pipeline createinfo struct, as well as dynamic state.
* The pipeline state will be displayed at each command, showing the data contained in each member of the pipeline createinfo struct, as well as dynamic state.
* Simple disassembly/reflection of SPIR-V to determine which descriptors to read for read-only resources and uniform buffers. The uniform buffers will be listed separately and the member variables filled out.
* Simple display of most 2D textures with mips in the texture viewer.
* Threading should be pretty efficient - no heavy locks on common paths (outside of creation/deletion)
+1 -1
View File
@@ -181,7 +181,7 @@ struct VulkanPipelineState
blendConst[0] = blendConst[1] = blendConst[2] = blendConst[3] = 0.0f;
}
bool32 alphaToCoverageEnable, logicOpEnable;
bool32 alphaToCoverageEnable, alphaToOneEnable, logicOpEnable;
rdctype::str logicOp;
struct Attachment
+3 -2
View File
@@ -793,6 +793,7 @@ template<>
void Serialiser::Serialise(const char *name, VulkanPipelineState::ColorBlend &el)
{
Serialise("", el.alphaToCoverageEnable);
Serialise("", el.alphaToOneEnable);
Serialise("", el.logicOpEnable);
Serialise("", el.logicOp);
@@ -800,7 +801,7 @@ void Serialiser::Serialise(const char *name, VulkanPipelineState::ColorBlend &el
SerialisePODArray<4>("", el.blendConst);
SIZE_CHECK(VulkanPipelineState::ColorBlend, 40);
SIZE_CHECK(VulkanPipelineState::ColorBlend, 44);
}
template<>
@@ -879,7 +880,7 @@ void Serialiser::Serialise(const char *name, VulkanPipelineState &el)
Serialise("", el.DS);
Serialise("", el.Pass);
SIZE_CHECK(VulkanPipelineState, 736);
SIZE_CHECK(VulkanPipelineState, 744);
}
#pragma endregion Vulkan pipeline state
+3
View File
@@ -1617,6 +1617,8 @@ void VulkanReplay::SavePipelineState()
{
dst.bindings[b].binds[a].view = ResourceId();
dst.bindings[b].binds[a].res = rm->GetOriginalID(VKMGR()->GetNonDispWrapper(info->bufferInfo.buffer)->id);
dst.bindings[b].binds[a].offset = info->bufferInfo.offset;
dst.bindings[b].binds[a].size = info->bufferInfo.range;
}
}
}
@@ -1686,6 +1688,7 @@ void VulkanReplay::SavePipelineState()
// Color Blend
m_VulkanPipelineState.CB.logicOpEnable = p.logicOpEnable;
m_VulkanPipelineState.CB.alphaToCoverageEnable = p.alphaToCoverageEnable;
m_VulkanPipelineState.CB.alphaToOneEnable = p.alphaToOneEnable;
m_VulkanPipelineState.CB.logicOp = ToStr::Get(p.logicOp);
create_array_uninit(m_VulkanPipelineState.CB.attachments, p.attachments.size());
@@ -226,6 +226,7 @@ namespace renderdoc
public class ColorBlend
{
public bool alphaToCoverageEnable;
public bool alphaToOneEnable;
public bool logicOpEnable;
[CustomMarshalAs(CustomUnmanagedType.UTF8TemplatedString)]
File diff suppressed because it is too large Load Diff
@@ -135,36 +135,35 @@ namespace renderdocui.Windows.PipelineState
cullMode.Text = "Front";
frontCCW.Image = tick;
scissorEnable.Image = tick;
lineAAEnable.Image = tick;
multisampleEnable.Image = tick;
depthClip.Image = tick;
depthBias.Text = "0";
depthBias.Text = "0.0";
depthBiasClamp.Text = "0.0";
slopeScaledBias.Text = "0.0";
depthClip.Image = tick;
rasterizerDiscard.Image = tick;
lineWidth.Text = "1.0";
sampleCount.Text = "1";
sampleShading.Image = tick;
minSampleShading.Text = "0.0";
sampleMask.Text = "FFFFFFFF";
viewports.Nodes.Clear();
scissors.Nodes.Clear();
targetOutputs.Nodes.Clear();
blendOperations.Nodes.Clear();
alphaToCoverage.Image = tick;
independentBlend.Image = tick;
blendFactor.Text = "0.00, 0.00, 0.00, 0.00";
sampleMask.Text = "FFFFFFFF";
logicOp.Text = "-";
alphaToOne.Image = tick;
depthEnable.Image = tick;
depthFunc.Text = "GREATER_EQUAL";
depthWrite.Image = tick;
stencilEnable.Image = tick;
stencilReadMask.Text = "FF";
stencilWriteMask.Text = "FF";
stencilRef.Text = "FF";
depthBounds.Text = "0.0-1.0";
depthBounds.Image = null;
stencilFuncs.Nodes.Clear();
@@ -207,17 +206,23 @@ namespace renderdocui.Windows.PipelineState
else
shader.Text = stage.ShaderName;
if (shaderDetails != null && shaderDetails.DebugInfo.entryFunc.Length > 0 && shaderDetails.DebugInfo.files.Length > 0)
if (shaderDetails != null && shaderDetails.DebugInfo.entryFunc.Length > 0)
{
string shaderfn = "";
if (shaderDetails.DebugInfo.files.Length > 0 || shaderDetails.DebugInfo.entryFunc != "main")
shader.Text = shaderDetails.DebugInfo.entryFunc + "()";
int entryFile = shaderDetails.DebugInfo.entryFile;
if (entryFile < 0 || entryFile >= shaderDetails.DebugInfo.files.Length)
entryFile = 0;
if (shaderDetails.DebugInfo.files.Length > 0)
{
string shaderfn = "";
shaderfn = shaderDetails.DebugInfo.files[entryFile].BaseFilename;
int entryFile = shaderDetails.DebugInfo.entryFile;
if (entryFile < 0 || entryFile >= shaderDetails.DebugInfo.files.Length)
entryFile = 0;
shader.Text = shaderDetails.DebugInfo.entryFunc + "()" + " - " + shaderfn;
shaderfn = shaderDetails.DebugInfo.files[entryFile].BaseFilename;
shader.Text += " - " + shaderfn;
}
}
int vs = 0;
@@ -452,10 +457,9 @@ namespace renderdocui.Windows.PipelineState
var cross = global::renderdocui.Properties.Resources.cross;
bool[] usedBindings = new bool[128];
bool[] usedVBuffers = new bool[128];
for (int i = 0; i < 128; i++)
usedBindings[i] = usedVBuffers[i] = false;
usedBindings[i] = false;
////////////////////////////////////////////////
// Vertex Input
@@ -513,33 +517,6 @@ namespace renderdocui.Windows.PipelineState
m_BindNodes.Clear();
vs = viBindings.VScrollValue();
viBindings.Nodes.Clear();
viBindings.BeginUpdate();
if (state.VI.binds != null)
{
foreach (var a in state.VI.binds)
{
if (showDisabled.Checked || usedBindings[a.vbufferBinding])
{
var node = viBindings.Nodes.Add(new object[] { a.vbufferBinding, a.bytestride, a.perInstance ? "Instance" : "Vertex" });
usedVBuffers[a.vbufferBinding] = true;
node.Image = global::renderdocui.Properties.Resources.action;
node.HoverImage = global::renderdocui.Properties.Resources.action_hover;
if (!usedBindings[a.vbufferBinding])
InactiveRow(node);
m_BindNodes.Add(node);
}
}
}
viBindings.NodesSelection.Clear();
viBindings.EndUpdate();
viBindings.SetVScrollValue(vs);
PrimitiveTopology topo = draw != null ? draw.topology : PrimitiveTopology.Unknown;
topology.Text = topo.ToString();
@@ -550,6 +527,8 @@ namespace renderdocui.Windows.PipelineState
topology.Text = string.Format("PatchList ({0} Control Points)", numCPs);
}
primRestart.Visible = state.IA.primitiveRestartEnable;
switch (topo)
{
case PrimitiveTopology.PointList:
@@ -612,7 +591,7 @@ namespace renderdocui.Windows.PipelineState
}
}
var node = viBuffers.Nodes.Add(new object[] { "Index", name, state.IA.ibuffer.offs, length });
var node = viBuffers.Nodes.Add(new object[] { "Index", name, "Index", state.IA.ibuffer.offs, draw.indexByteWidth, length });
node.Image = global::renderdocui.Properties.Resources.action;
node.HoverImage = global::renderdocui.Properties.Resources.action_hover;
@@ -629,7 +608,7 @@ namespace renderdocui.Windows.PipelineState
{
if (ibufferUsed || showEmpty.Checked)
{
var node = viBuffers.Nodes.Add(new object[] { "Index", "No Buffer Set", "-", "-" });
var node = viBuffers.Nodes.Add(new object[] { "Index", "No Buffer Set", "-", "-", "-", "-" });
node.Image = global::renderdocui.Properties.Resources.action;
node.HoverImage = global::renderdocui.Properties.Resources.action_hover;
@@ -646,11 +625,19 @@ namespace renderdocui.Windows.PipelineState
if (state.VI.vbuffers != null)
{
int i = 0;
foreach (var v in state.VI.vbuffers)
for(int i=0; i < Math.Max(state.VI.vbuffers.Length, state.VI.binds.Length); i++)
{
bool filledSlot = (v.buffer != ResourceId.Null);
bool usedSlot = (usedVBuffers[i]);
var vbuff = (i < state.VI.vbuffers.Length ? state.VI.vbuffers[i] : null);
VulkanPipelineState.VertexInput.Binding bind = null;
for (int b = 0; b < state.VI.binds.Length; b++)
{
if (state.VI.binds[b].vbufferBinding == i)
bind = state.VI.binds[b];
}
bool filledSlot = ((vbuff != null && vbuff.buffer != ResourceId.Null) || bind != null);
bool usedSlot = (usedBindings[i]);
// show if
if (usedSlot || // it's referenced by the shader - regardless of empty or not
@@ -658,30 +645,49 @@ namespace renderdocui.Windows.PipelineState
(showEmpty.Checked && !filledSlot) // it's empty, and we have "show empty"
)
{
string name = "Buffer " + v.buffer.ToString();
string name = "No Buffer";
string rate = "-";
UInt32 length = 1;
UInt64 offset = 0;
UInt32 stride = 0;
for (int t = 0; t < bufs.Length; t++)
if (vbuff != null)
{
if (bufs[t].ID == v.buffer)
name = "Buffer " + vbuff.buffer.ToString();
offset = vbuff.offset;
for (int t = 0; t < bufs.Length; t++)
{
name = bufs[t].name;
length = bufs[t].length;
if (bufs[t].ID == vbuff.buffer)
{
name = bufs[t].name;
length = bufs[t].length;
}
}
}
if (bind != null)
{
stride = bind.bytestride;
rate = bind.perInstance ? "Instance" : "Vertex";
}
else
{
name += ", No Binding";
}
TreelistView.Node node = null;
if(filledSlot)
node = viBuffers.Nodes.Add(new object[] { i, name, v.offset, length });
node = viBuffers.Nodes.Add(new object[] { i, name, rate, offset, stride, length });
else
node = viBuffers.Nodes.Add(new object[] { i, "No Buffer Set", "-", "-" });
node = viBuffers.Nodes.Add(new object[] { i, "No Binding", "-", "-", "-", "-" });
node.Image = global::renderdocui.Properties.Resources.action;
node.HoverImage = global::renderdocui.Properties.Resources.action_hover;
node.Tag = v.buffer;
node.Tag = vbuff != null ? vbuff.buffer : ResourceId.Null;
if (!filledSlot)
if (!filledSlot || bind == null || vbuff == null)
EmptyRow(node);
if (!usedSlot)
@@ -689,8 +695,6 @@ namespace renderdocui.Windows.PipelineState
m_VBNodes.Add(node);
}
i++;
}
}
viBuffers.NodesSelection.Clear();
@@ -714,6 +718,14 @@ namespace renderdocui.Windows.PipelineState
int vs2 = scissors.VScrollValue();
scissors.BeginUpdate();
scissors.Nodes.Clear();
if (state.Pass.renderpass.obj != ResourceId.Null)
{
scissors.Nodes.Add(new object[] { "Render Area",
state.Pass.renderArea.x, state.Pass.renderArea.y,
state.Pass.renderArea.width, state.Pass.renderArea.height });
}
{
int i = 0;
foreach (var v in state.VP.viewportScissors)
@@ -744,17 +756,19 @@ namespace renderdocui.Windows.PipelineState
cullMode.Text = state.RS.CullMode.ToString();
frontCCW.Image = state.RS.FrontCCW ? tick : cross;
// VKTODOLOW update these states
scissorEnable.Image = tick;
lineAAEnable.Image = tick;
multisampleEnable.Image = tick;
depthClip.Image = state.RS.depthClipEnable ? tick : cross;
depthBias.Text = state.RS.depthBias.ToString();
depthBias.Text = Formatter.Format(state.RS.depthBias);
depthBiasClamp.Text = Formatter.Format(state.RS.depthBiasClamp);
slopeScaledBias.Text = Formatter.Format(state.RS.slopeScaledDepthBias);
forcedSampleCount.Text = "1";
depthClip.Image = state.RS.depthClipEnable ? tick : cross;
rasterizerDiscard.Image = state.RS.rasterizerDiscardEnable ? tick : cross;
lineWidth.Text = Formatter.Format(state.RS.lineWidth);
sampleCount.Text = state.MSAA.rasterSamples.ToString();
sampleShading.Image = state.MSAA.sampleShadingEnable ? tick : cross;
minSampleShading.Text = Formatter.Format(state.MSAA.minSampleShading);
sampleMask.Text = state.MSAA.sampleMask.ToString("X8");
////////////////////////////////////////////////
// Output Merger
@@ -859,7 +873,6 @@ namespace renderdocui.Windows.PipelineState
{
var node = blendOperations.Nodes.Add(new object[] { i,
true,
state.CB.logicOpEnable,
blend.m_Blend.Source,
blend.m_Blend.Destination,
@@ -869,8 +882,6 @@ namespace renderdocui.Windows.PipelineState
blend.m_AlphaBlend.Destination,
blend.m_AlphaBlend.Operation,
state.CB.LogicOp,
((blend.WriteMask & 0x1) == 0 ? "_" : "R") +
((blend.WriteMask & 0x2) == 0 ? "_" : "G") +
((blend.WriteMask & 0x4) == 0 ? "_" : "B") +
@@ -892,32 +903,48 @@ namespace renderdocui.Windows.PipelineState
blendOperations.EndUpdate();
blendOperations.SetVScrollValue(vs);
alphaToCoverage.Image = state.CB.alphaToCoverageEnable ? tick : cross;
independentBlend.Image = tick;
blendFactor.Text = state.CB.blendConst[0].ToString("F2") + ", " +
state.CB.blendConst[1].ToString("F2") + ", " +
state.CB.blendConst[2].ToString("F2") + ", " +
state.CB.blendConst[3].ToString("F2");
sampleMask.Text = state.MSAA.sampleMask.ToString("X8");
logicOp.Text = state.CB.logicOpEnable ? state.CB.LogicOp : "-";
alphaToOne.Image = state.CB.alphaToOneEnable ? tick : cross;
depthEnable.Image = state.DS.depthTestEnable ? tick : cross;
depthFunc.Text = state.DS.depthCompareOp;
depthWrite.Image = state.DS.depthWriteEnable ? tick : cross;
stencilEnable.Image = state.DS.stencilTestEnable ? tick : cross;
stencilReadMask.Text = state.DS.front.compareMask.ToString("X2");
stencilWriteMask.Text = state.DS.front.writeMask.ToString("X2");
stencilRef.Text = state.DS.front.stencilref.ToString("X2");
if (state.DS.depthBoundsEnable)
{
depthBounds.Text = Formatter.Format(state.DS.minDepthBounds) + "-" + Formatter.Format(state.DS.maxDepthBounds);
depthBounds.Image = null;
}
else
{
depthBounds.Text = "";
depthBounds.Image = cross;
}
stencilFuncs.BeginUpdate();
stencilFuncs.Nodes.Clear();
stencilFuncs.Nodes.Add(new object[] { "Front", state.DS.front.func, state.DS.front.failOp,
state.DS.front.depthFailOp, state.DS.front.passOp });
stencilFuncs.Nodes.Add(new object[] { "Back", state.DS.back.func, state.DS.back.failOp,
state.DS.back.depthFailOp, state.DS.back.passOp });
if (state.DS.stencilTestEnable)
{
stencilFuncs.Nodes.Add(new object[] { "Front", state.DS.front.func, state.DS.front.failOp,
state.DS.front.depthFailOp, state.DS.front.passOp,
state.DS.front.writeMask.ToString("X2"),
state.DS.front.compareMask.ToString("X2"),
state.DS.front.stencilref.ToString("X2")});
stencilFuncs.Nodes.Add(new object[] { "Back", state.DS.back.func, state.DS.back.failOp,
state.DS.back.depthFailOp, state.DS.back.passOp,
state.DS.back.writeMask.ToString("X2"),
state.DS.back.compareMask.ToString("X2"),
state.DS.back.stencilref.ToString("X2")});
}
else
{
stencilFuncs.Nodes.Add(new object[] { "Front", "-", "-", "-", "-", "-", "-", "-" });
stencilFuncs.Nodes.Add(new object[] { "Back", "-", "-", "-", "-", "-", "-", "-" });
}
stencilFuncs.EndUpdate();
stencilFuncs.NodesSelection.Clear();
@@ -1677,7 +1704,6 @@ namespace renderdocui.Windows.PipelineState
}
viAttrs.Invalidate();
viBindings.Invalidate();
viBuffers.Invalidate();
}
@@ -1705,25 +1731,6 @@ namespace renderdocui.Windows.PipelineState
}
}
private void iabinds_MouseMove(object sender, MouseEventArgs e)
{
if (m_Core.CurVulkanPipelineState == null) return;
Point mousePoint = viBindings.PointToClient(Cursor.Position);
var hoverNode = viBindings.CalcHitNode(mousePoint);
ia_MouseLeave(sender, e);
if (hoverNode != null)
{
int idx = m_BindNodes.IndexOf(hoverNode);
if (idx >= 0)
HighlightIABind((uint)idx);
else
hoverNode.DefaultBackColor = SystemColors.ControlLight;
}
}
private void iabuffers_MouseMove(object sender, MouseEventArgs e)
{
if (m_Core.CurVulkanPipelineState == null) return;
@@ -1751,11 +1758,7 @@ namespace renderdocui.Windows.PipelineState
foreach (var n in viAttrs.Nodes)
n.DefaultBackColor = Color.Transparent;
foreach (var n in viBindings.Nodes)
n.DefaultBackColor = Color.Transparent;
viAttrs.Invalidate();
viBindings.Invalidate();
viBuffers.Invalidate();
}
@@ -135,7 +135,33 @@
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>239, 17</value>
</metadata>
<metadata name="groupBox42.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="label7.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="label25.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<metadata name="label26.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="sampleShading.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHCSURBVDhPpZFZL0NBHMW94X4Xe6vW2BJSa6ql1OWW
Wkvjheptq9VSgliuR7GvkdhiDSLxqJYKn0F8CdVj5oqG9tri4TeZOfM//5k5EwHgX0iKf0FS/A7tUqlQ
PlvofF+HFXxH5WKJYNo3oG2Hg1LI4akmWShFxUKx0LHXgIl7NzyXVujXtMgaSLFJFoeimS8SjLt6jN25
MHrnRP16FbI9qUhzyKKCRcYzLq/lmG36aKSo54oEeuURnxPDPod4cqZb4U/tTYqi+2/mUy6j+Yh94i9M
4DYrOt/NJCyhdbsOw7e9GLq1g1utRIYr2Z9iTxTNYoO2k7r85sOax0EvjzFfH3RrKj8Jq1M1oxxt2WIx
eGOH55pH7YoG6X1yv8KWEDSLDZoOdNGG3WqYz9sx+TAAj9cK454epgMD+r0WuK8tYJfVSHPKXpKtn81i
AzqwG2qGnAzToUF859CNDa4rM1xeM3RL5TSsgJyPDzNTghMSFqOaVqJxswbuqx44LrtQvaACCSsgt8RJ
mimfFsqpXKZgPJtcWQPtfBlIWAFZT+yXZkqYQP6XyexXgIT1nGSOjQzdD0VSJGExid0xP5opkuLvQcQr
vqKpPDRN9lYAAAAASUVORK5CYII=
</value>
</data>
<data name="frontCCW.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
@@ -176,7 +202,7 @@
vqKpPDRN9lYAAAAASUVORK5CYII=
</value>
</data>
<data name="multisampleEnable.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<data name="rasterizerDiscard.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHCSURBVDhPpZFZL0NBHMW94X4Xe6vW2BJSa6ql1OWW
@@ -190,52 +216,7 @@
vqKpPDRN9lYAAAAASUVORK5CYII=
</value>
</data>
<data name="scissorEnable.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHCSURBVDhPpZFZL0NBHMW94X4Xe6vW2BJSa6ql1OWW
Wkvjheptq9VSgliuR7GvkdhiDSLxqJYKn0F8CdVj5oqG9tri4TeZOfM//5k5EwHgX0iKf0FS/A7tUqlQ
PlvofF+HFXxH5WKJYNo3oG2Hg1LI4akmWShFxUKx0LHXgIl7NzyXVujXtMgaSLFJFoeimS8SjLt6jN25
MHrnRP16FbI9qUhzyKKCRcYzLq/lmG36aKSo54oEeuURnxPDPod4cqZb4U/tTYqi+2/mUy6j+Yh94i9M
4DYrOt/NJCyhdbsOw7e9GLq1g1utRIYr2Z9iTxTNYoO2k7r85sOax0EvjzFfH3RrKj8Jq1M1oxxt2WIx
eGOH55pH7YoG6X1yv8KWEDSLDZoOdNGG3WqYz9sx+TAAj9cK454epgMD+r0WuK8tYJfVSHPKXpKtn81i
AzqwG2qGnAzToUF859CNDa4rM1xeM3RL5TSsgJyPDzNTghMSFqOaVqJxswbuqx44LrtQvaACCSsgt8RJ
mimfFsqpXKZgPJtcWQPtfBlIWAFZT+yXZkqYQP6XyexXgIT1nGSOjQzdD0VSJGExid0xP5opkuLvQcQr
vqKpPDRN9lYAAAAASUVORK5CYII=
</value>
</data>
<data name="lineAAEnable.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHCSURBVDhPpZFZL0NBHMW94X4Xe6vW2BJSa6ql1OWW
Wkvjheptq9VSgliuR7GvkdhiDSLxqJYKn0F8CdVj5oqG9tri4TeZOfM//5k5EwHgX0iKf0FS/A7tUqlQ
PlvofF+HFXxH5WKJYNo3oG2Hg1LI4akmWShFxUKx0LHXgIl7NzyXVujXtMgaSLFJFoeimS8SjLt6jN25
MHrnRP16FbI9qUhzyKKCRcYzLq/lmG36aKSo54oEeuURnxPDPod4cqZb4U/tTYqi+2/mUy6j+Yh94i9M
4DYrOt/NJCyhdbsOw7e9GLq1g1utRIYr2Z9iTxTNYoO2k7r85sOax0EvjzFfH3RrKj8Jq1M1oxxt2WIx
eGOH55pH7YoG6X1yv8KWEDSLDZoOdNGG3WqYz9sx+TAAj9cK454epgMD+r0WuK8tYJfVSHPKXpKtn81i
AzqwG2qGnAzToUF859CNDa4rM1xeM3RL5TSsgJyPDzNTghMSFqOaVqJxswbuqx44LrtQvaACCSsgt8RJ
mimfFsqpXKZgPJtcWQPtfBlIWAFZT+yXZkqYQP6XyexXgIT1nGSOjQzdD0VSJGExid0xP5opkuLvQcQr
vqKpPDRN9lYAAAAASUVORK5CYII=
</value>
</data>
<metadata name="groupBox42.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>False</value>
</metadata>
<data name="independentBlend.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHCSURBVDhPpZFZL0NBHMW94X4Xe6vW2BJSa6ql1OWW
Wkvjheptq9VSgliuR7GvkdhiDSLxqJYKn0F8CdVj5oqG9tri4TeZOfM//5k5EwHgX0iKf0FS/A7tUqlQ
PlvofF+HFXxH5WKJYNo3oG2Hg1LI4akmWShFxUKx0LHXgIl7NzyXVujXtMgaSLFJFoeimS8SjLt6jN25
MHrnRP16FbI9qUhzyKKCRcYzLq/lmG36aKSo54oEeuURnxPDPod4cqZb4U/tTYqi+2/mUy6j+Yh94i9M
4DYrOt/NJCyhdbsOw7e9GLq1g1utRIYr2Z9iTxTNYoO2k7r85sOax0EvjzFfH3RrKj8Jq1M1oxxt2WIx
eGOH55pH7YoG6X1yv8KWEDSLDZoOdNGG3WqYz9sx+TAAj9cK454epgMD+r0WuK8tYJfVSHPKXpKtn81i
AzqwG2qGnAzToUF859CNDa4rM1xeM3RL5TSsgJyPDzNTghMSFqOaVqJxswbuqx44LrtQvaACCSsgt8RJ
mimfFsqpXKZgPJtcWQPtfBlIWAFZT+yXZkqYQP6XyexXgIT1nGSOjQzdD0VSJGExid0xP5opkuLvQcQr
vqKpPDRN9lYAAAAASUVORK5CYII=
</value>
</data>
<data name="alphaToCoverage.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<data name="alphaToOne.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHCSURBVDhPpZFZL0NBHMW94X4Xe6vW2BJSa6ql1OWW
@@ -275,20 +256,6 @@
AzqwG2qGnAzToUF859CNDa4rM1xeM3RL5TSsgJyPDzNTghMSFqOaVqJxswbuqx44LrtQvaACCSsgt8RJ
mimfFsqpXKZgPJtcWQPtfBlIWAFZT+yXZkqYQP6XyexXgIT1nGSOjQzdD0VSJGExid0xP5opkuLvQcQr
vqKpPDRN9lYAAAAASUVORK5CYII=
</value>
</data>
<data name="stencilEnable.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHCSURBVDhPpZFZL0NBHMW94X4Xe6vW2BJSa6ql1OWW
Wkvjheptq9VSgliuR7GvkdhiDSLxqJYKn0F8CdVj5oqG9tri4TeZOfM//5k5EwHgX0iKf0FS/A7tUqlQ
PlvofF+HFXxH5WKJYNo3oG2Hg1LI4akmWShFxUKx0LHXgIl7NzyXVujXtMgaSLFJFoeimS8SjLt6jN25
MHrnRP16FbI9qUhzyKKCRcYzLq/lmG36aKSo54oEeuURnxPDPod4cqZb4U/tTYqi+2/mUy6j+Yh94i9M
4DYrOt/NJCyhdbsOw7e9GLq1g1utRIYr2Z9iTxTNYoO2k7r85sOax0EvjzFfH3RrKj8Jq1M1oxxt2WIx
eGOH55pH7YoG6X1yv8KWEDSLDZoOdNGG3WqYz9sx+TAAj9cK454epgMD+r0WuK8tYJfVSHPKXpKtn81i
AzqwG2qGnAzToUF859CNDa4rM1xeM3RL5TSsgJyPDzNTghMSFqOaVqJxswbuqx44LrtQvaACCSsgt8RJ
mimfFsqpXKZgPJtcWQPtfBlIWAFZT+yXZkqYQP6XyexXgIT1nGSOjQzdD0VSJGExid0xP5opkuLvQcQr
vqKpPDRN9lYAAAAASUVORK5CYII=
</value>
</data>
<metadata name="rightclickMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">