mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-10-19 18:41:13 +00:00
Set up display of blend equations (and logic, overriding)
This commit is contained in:
1 parent
f459c63380
commit
1265b5bc6e
8 files changed
+1295
-1154
No files matched your search
@@ -126,8 +126,36 @@ struct GLPipelineState
|
||||
|
||||
ResourceId FBO;
|
||||
|
||||
bool32 FramebufferSRGB;
|
||||
|
||||
rdctype::array<ResourceId> Color;
|
||||
ResourceId Depth;
|
||||
ResourceId Stencil;
|
||||
|
||||
struct BlendState
|
||||
{
|
||||
BlendState()
|
||||
{ BlendFactor[0] = BlendFactor[1] = BlendFactor[2] = BlendFactor[3] = 0.0f; }
|
||||
|
||||
struct RTBlend
|
||||
{
|
||||
RTBlend() : Enabled(false), WriteMask(0) {}
|
||||
struct BlendOp
|
||||
{
|
||||
rdctype::str Source;
|
||||
rdctype::str Destination;
|
||||
rdctype::str Operation;
|
||||
} m_Blend, m_AlphaBlend;
|
||||
|
||||
rdctype::str LogicOp;
|
||||
|
||||
bool32 Enabled;
|
||||
byte WriteMask;
|
||||
};
|
||||
rdctype::array<RTBlend> Blends;
|
||||
|
||||
float BlendFactor[4];
|
||||
} m_Blending;
|
||||
|
||||
} m_FB;
|
||||
};
|
||||
@@ -448,6 +448,45 @@ GLuint GetBoundVertexBuffer(const GLHookSet &gl, GLuint i)
|
||||
return buffer;
|
||||
}
|
||||
|
||||
const char *BlendString(GLenum blendenum)
|
||||
{
|
||||
switch(blendenum)
|
||||
{
|
||||
case GL_FUNC_ADD: return "ADD";
|
||||
case GL_FUNC_SUBTRACT: return "SUBTRACT";
|
||||
case GL_FUNC_REVERSE_SUBTRACT: return "INV_SUBTRACT";
|
||||
case GL_MIN: return "MIN";
|
||||
case GL_MAX: return "MAX";
|
||||
case GL_ZERO: return "ZERO";
|
||||
case GL_ONE: return "ONE";
|
||||
case GL_SRC_COLOR: return "SRC_COLOR";
|
||||
case GL_ONE_MINUS_SRC_COLOR: return "INV_SRC_COLOR";
|
||||
case GL_DST_COLOR: return "DST_COLOR";
|
||||
case GL_ONE_MINUS_DST_COLOR: return "INV_DST_COLOR";
|
||||
case GL_SRC_ALPHA: return "SRC_ALPHA";
|
||||
case GL_ONE_MINUS_SRC_ALPHA: return "INV_SRC_ALPHA";
|
||||
case GL_DST_ALPHA: return "DST_ALPHA";
|
||||
case GL_ONE_MINUS_DST_ALPHA: return "INV_DST_ALPHA";
|
||||
case GL_CONSTANT_COLOR: return "CONST_COLOR";
|
||||
case GL_ONE_MINUS_CONSTANT_COLOR: return "INV_CONST_COLOR";
|
||||
case GL_CONSTANT_ALPHA: return "CONST_ALPHA";
|
||||
case GL_ONE_MINUS_CONSTANT_ALPHA: return "INV_CONST_ALPHA";
|
||||
case GL_SRC_ALPHA_SATURATE: return "SRC_ALPHA_SAT";
|
||||
case GL_SRC1_COLOR: return "SRC1_COL";
|
||||
case GL_ONE_MINUS_SRC1_COLOR: return "INV_SRC1_COL";
|
||||
case GL_SRC1_ALPHA: return "SRC1_ALPHA";
|
||||
case GL_ONE_MINUS_SRC1_ALPHA: return "INV_SRC1_ALPHA";
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
static string unknown = ToStr::Get(blendenum).substr(3); // 3 = strlen("GL_");
|
||||
|
||||
RDCERR("Unknown blend enum: %s", unknown.c_str());
|
||||
|
||||
return unknown.c_str();
|
||||
}
|
||||
|
||||
ResourceFormat MakeResourceFormat(WrappedOpenGL &gl, GLenum target, GLenum fmt)
|
||||
{
|
||||
ResourceFormat ret;
|
||||
|
||||
@@ -87,6 +87,7 @@ GLenum ShaderEnum(size_t idx);
|
||||
ResourceFormat MakeResourceFormat(WrappedOpenGL &gl, GLenum target, GLenum fmt);
|
||||
GLenum MakeGLFormat(WrappedOpenGL &gl, GLenum target, ResourceFormat fmt);
|
||||
PrimitiveTopology MakePrimitiveTopology(const GLHookSet &gl, GLenum Topo);
|
||||
const char *BlendString(GLenum blendenum);
|
||||
|
||||
GLuint GetBoundVertexBuffer(const GLHookSet &gl, GLuint idx);
|
||||
|
||||
|
||||
@@ -1359,6 +1359,34 @@ void GLReplay::SavePipelineState()
|
||||
|
||||
pipe.m_FB.Depth = rm->GetOriginalID(rm->GetID(rbDepth ? RenderbufferRes(ctx, curDepth) : TextureRes(ctx, curDepth)));
|
||||
pipe.m_FB.Stencil = rm->GetOriginalID(rm->GetID(rbStencil ? RenderbufferRes(ctx, curStencil) : TextureRes(ctx, curStencil)));
|
||||
|
||||
memcpy(pipe.m_FB.m_Blending.BlendFactor, rs.BlendColor, sizeof(rs.BlendColor));
|
||||
|
||||
pipe.m_FB.FramebufferSRGB = rs.Enabled[GLRenderState::eEnabled_FramebufferSRGB];
|
||||
|
||||
RDCCOMPILE_ASSERT(ARRAY_COUNT(rs.Blends) == ARRAY_COUNT(rs.ColorMasks), "Color masks and blends mismatched");
|
||||
create_array_uninit(pipe.m_FB.m_Blending.Blends, ARRAY_COUNT(rs.Blends));
|
||||
for(size_t i=0; i < ARRAY_COUNT(rs.Blends); i++)
|
||||
{
|
||||
pipe.m_FB.m_Blending.Blends[i].Enabled = rs.Blends[i].Enabled;
|
||||
pipe.m_FB.m_Blending.Blends[i].LogicOp = "";
|
||||
if(rs.LogicOp != eGL_NONE && rs.LogicOp != eGL_COPY && rs.Enabled[GLRenderState::eEnabled_ColorLogicOp])
|
||||
pipe.m_FB.m_Blending.Blends[i].LogicOp = ToStr::Get(rs.LogicOp).substr(3); // 3 == strlen("GL_")
|
||||
|
||||
pipe.m_FB.m_Blending.Blends[i].m_Blend.Source = BlendString(rs.Blends[i].SourceRGB);
|
||||
pipe.m_FB.m_Blending.Blends[i].m_Blend.Destination = BlendString(rs.Blends[i].DestinationRGB);
|
||||
pipe.m_FB.m_Blending.Blends[i].m_Blend.Operation = BlendString(rs.Blends[i].EquationRGB);
|
||||
|
||||
pipe.m_FB.m_Blending.Blends[i].m_AlphaBlend.Source = BlendString(rs.Blends[i].SourceAlpha);
|
||||
pipe.m_FB.m_Blending.Blends[i].m_AlphaBlend.Destination = BlendString(rs.Blends[i].DestinationAlpha);
|
||||
pipe.m_FB.m_Blending.Blends[i].m_AlphaBlend.Operation = BlendString(rs.Blends[i].EquationAlpha);
|
||||
|
||||
pipe.m_FB.m_Blending.Blends[i].WriteMask = 0;
|
||||
if(rs.ColorMasks[i].red) pipe.m_FB.m_Blending.Blends[i].WriteMask |= 1;
|
||||
if(rs.ColorMasks[i].green) pipe.m_FB.m_Blending.Blends[i].WriteMask |= 2;
|
||||
if(rs.ColorMasks[i].blue) pipe.m_FB.m_Blending.Blends[i].WriteMask |= 4;
|
||||
if(rs.ColorMasks[i].alpha) pipe.m_FB.m_Blending.Blends[i].WriteMask |= 8;
|
||||
}
|
||||
}
|
||||
|
||||
void GLReplay::FillCBufferValue(WrappedOpenGL &gl, GLuint prog, bool bufferBacked, bool rowMajor,
|
||||
|
||||
@@ -157,10 +157,46 @@ namespace renderdoc
|
||||
{
|
||||
public ResourceId FBO;
|
||||
|
||||
bool FramebufferSRGB;
|
||||
|
||||
[CustomMarshalAs(CustomUnmanagedType.TemplatedArray)]
|
||||
public ResourceId[] Color;
|
||||
public ResourceId Depth;
|
||||
public ResourceId Stencil;
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public class BlendState
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public class RTBlend
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public class BlendOp
|
||||
{
|
||||
[CustomMarshalAs(CustomUnmanagedType.UTF8TemplatedString)]
|
||||
public string Source;
|
||||
[CustomMarshalAs(CustomUnmanagedType.UTF8TemplatedString)]
|
||||
public string Destination;
|
||||
[CustomMarshalAs(CustomUnmanagedType.UTF8TemplatedString)]
|
||||
public string Operation;
|
||||
};
|
||||
[CustomMarshalAs(CustomUnmanagedType.CustomClass)]
|
||||
public BlendOp m_Blend, m_AlphaBlend;
|
||||
|
||||
[CustomMarshalAs(CustomUnmanagedType.UTF8TemplatedString)]
|
||||
public string LogicOp;
|
||||
|
||||
public bool Enabled;
|
||||
public byte WriteMask;
|
||||
};
|
||||
[CustomMarshalAs(CustomUnmanagedType.TemplatedArray)]
|
||||
public RTBlend[] Blends;
|
||||
|
||||
[CustomMarshalAs(CustomUnmanagedType.FixedArray, FixedLength = 4)]
|
||||
public float[] BlendFactor;
|
||||
};
|
||||
[CustomMarshalAs(CustomUnmanagedType.CustomClass)]
|
||||
public BlendState m_BlendState;
|
||||
};
|
||||
[CustomMarshalAs(CustomUnmanagedType.CustomClass)]
|
||||
public FrameBuffer m_FB;
|
||||
|
||||
+1057
-1123
File diff suppressed because it is too large.
Load diff
@@ -127,9 +127,6 @@ namespace renderdocui.Windows.PipelineState
|
||||
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";
|
||||
@@ -723,6 +720,7 @@ namespace renderdocui.Windows.PipelineState
|
||||
for (int i = 0; i < 8; i++)
|
||||
targets[i] = false;
|
||||
|
||||
vs = targetOutputs.VScrollValue();
|
||||
targetOutputs.BeginUpdate();
|
||||
targetOutputs.Nodes.Clear();
|
||||
{
|
||||
@@ -841,11 +839,89 @@ namespace renderdocui.Windows.PipelineState
|
||||
}
|
||||
targetOutputs.EndUpdate();
|
||||
targetOutputs.NodesSelection.Clear();
|
||||
targetOutputs.SetVScrollValue(vs);
|
||||
|
||||
vs = blendOperations.VScrollValue();
|
||||
blendOperations.BeginUpdate();
|
||||
blendOperations.Nodes.Clear();
|
||||
{
|
||||
bool logic = (state.m_FB.m_BlendState.Blends[0].LogicOp != "");
|
||||
|
||||
int i = 0;
|
||||
foreach (var blend in state.m_FB.m_BlendState.Blends)
|
||||
{
|
||||
bool filledSlot = (blend.Enabled == true || targets[i]);
|
||||
bool usedSlot = (targets[i]);
|
||||
|
||||
// if logic operation is enabled, blending is disabled
|
||||
if (logic)
|
||||
filledSlot = (i == 0);
|
||||
|
||||
// show if
|
||||
if (usedSlot || // it's referenced by the shader - regardless of empty or not
|
||||
(showDisabled.Checked && !usedSlot && filledSlot) || // it's bound, but not referenced, and we have "show disabled"
|
||||
(showEmpty.Checked && !filledSlot) // it's empty, and we have "show empty"
|
||||
)
|
||||
{
|
||||
TreelistView.Node node = null;
|
||||
if (i == 0 && logic)
|
||||
{
|
||||
node = blendOperations.Nodes.Add(new object[] { i,
|
||||
true,
|
||||
|
||||
"-",
|
||||
"-",
|
||||
blend.LogicOp,
|
||||
|
||||
"-",
|
||||
"-",
|
||||
"-",
|
||||
|
||||
((blend.WriteMask & 0x1) == 0 ? "_" : "R") +
|
||||
((blend.WriteMask & 0x2) == 0 ? "_" : "G") +
|
||||
((blend.WriteMask & 0x4) == 0 ? "_" : "B") +
|
||||
((blend.WriteMask & 0x8) == 0 ? "_" : "A")
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
node = blendOperations.Nodes.Add(new object[] { i,
|
||||
blend.Enabled,
|
||||
|
||||
blend.m_Blend.Source,
|
||||
blend.m_Blend.Destination,
|
||||
blend.m_Blend.Operation,
|
||||
|
||||
blend.m_AlphaBlend.Source,
|
||||
blend.m_AlphaBlend.Destination,
|
||||
blend.m_AlphaBlend.Operation,
|
||||
|
||||
((blend.WriteMask & 0x1) == 0 ? "_" : "R") +
|
||||
((blend.WriteMask & 0x2) == 0 ? "_" : "G") +
|
||||
((blend.WriteMask & 0x4) == 0 ? "_" : "B") +
|
||||
((blend.WriteMask & 0x8) == 0 ? "_" : "A")
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
if (!filledSlot)
|
||||
EmptyRow(node);
|
||||
|
||||
if (!usedSlot)
|
||||
InactiveRow(node);
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
blendOperations.NodesSelection.Clear();
|
||||
blendOperations.EndUpdate();
|
||||
blendOperations.SetVScrollValue(vs);
|
||||
|
||||
blendFactor.Text = state.m_FB.m_BlendState.BlendFactor[0].ToString("F2") + ", " +
|
||||
state.m_FB.m_BlendState.BlendFactor[1].ToString("F2") + ", " +
|
||||
state.m_FB.m_BlendState.BlendFactor[2].ToString("F2") + ", " +
|
||||
state.m_FB.m_BlendState.BlendFactor[3].ToString("F2");
|
||||
|
||||
stencilFuncs.BeginUpdate();
|
||||
stencilFuncs.Nodes.Clear();
|
||||
|
||||
@@ -126,6 +126,15 @@
|
||||
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>140, 17</value>
|
||||
</metadata>
|
||||
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>140, 17</value>
|
||||
</metadata>
|
||||
<metadata name="groupBox2.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="groupBox44.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="groupBox2.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
@@ -135,6 +144,21 @@
|
||||
<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="label1.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="label15.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="label16.GenerateMember" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||
<value>False</value>
|
||||
</metadata>
|
||||
<metadata name="label17.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="frontCCW.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
@@ -221,34 +245,6 @@
|
||||
<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">
|
||||
<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="depthEnable.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
|
||||
@@ -294,4 +290,7 @@
|
||||
<metadata name="rightclickMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>239, 17</value>
|
||||
</metadata>
|
||||
</root>
|
||||
Reference in new issue
Block a user