Send sampler information through to GL pipeline state for display

This commit is contained in:
baldurk
2015-01-16 02:49:00 +00:00
parent cceddc9b19
commit b059e601c5
8 changed files with 1177 additions and 1042 deletions
+21
View File
@@ -74,6 +74,27 @@ struct GLPipelineState
uint32_t FirstSlice;
};
rdctype::array<Texture> Textures;
struct Sampler
{
Sampler()
: Samp(), MaxAniso(0.0f), MaxLOD(0.0f), MinLOD(0.0f), MipLODBias(0.0f)
, UseBorder(false), UseComparison(false)
{ BorderColor[0] = BorderColor[1] = BorderColor[2] = BorderColor[3] = 0.0f; }
ResourceId Samp;
rdctype::str AddressS, AddressT, AddressR;
float BorderColor[4];
rdctype::str Comparison;
rdctype::str MinFilter;
rdctype::str MagFilter;
bool32 UseBorder;
bool32 UseComparison;
float MaxAniso;
float MaxLOD;
float MinLOD;
float MipLODBias;
};
rdctype::array<Sampler> Samplers;
struct Buffer
{
+51 -24
View File
@@ -452,30 +452,30 @@ 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";
case eGL_FUNC_ADD: return "ADD";
case eGL_FUNC_SUBTRACT: return "SUBTRACT";
case eGL_FUNC_REVERSE_SUBTRACT: return "INV_SUBTRACT";
case eGL_MIN: return "MIN";
case eGL_MAX: return "MAX";
case GL_ZERO: return "ZERO";
case GL_ONE: return "ONE";
case eGL_SRC_COLOR: return "SRC_COLOR";
case eGL_ONE_MINUS_SRC_COLOR: return "INV_SRC_COLOR";
case eGL_DST_COLOR: return "DST_COLOR";
case eGL_ONE_MINUS_DST_COLOR: return "INV_DST_COLOR";
case eGL_SRC_ALPHA: return "SRC_ALPHA";
case eGL_ONE_MINUS_SRC_ALPHA: return "INV_SRC_ALPHA";
case eGL_DST_ALPHA: return "DST_ALPHA";
case eGL_ONE_MINUS_DST_ALPHA: return "INV_DST_ALPHA";
case eGL_CONSTANT_COLOR: return "CONST_COLOR";
case eGL_ONE_MINUS_CONSTANT_COLOR: return "INV_CONST_COLOR";
case eGL_CONSTANT_ALPHA: return "CONST_ALPHA";
case eGL_ONE_MINUS_CONSTANT_ALPHA: return "INV_CONST_ALPHA";
case eGL_SRC_ALPHA_SATURATE: return "SRC_ALPHA_SAT";
case eGL_SRC1_COLOR: return "SRC1_COL";
case eGL_ONE_MINUS_SRC1_COLOR: return "INV_SRC1_COL";
case eGL_SRC1_ALPHA: return "SRC1_ALPHA";
case eGL_ONE_MINUS_SRC1_ALPHA: return "INV_SRC1_ALPHA";
default:
break;
}
@@ -487,6 +487,33 @@ const char *BlendString(GLenum blendenum)
return unknown.c_str();
}
const char *SamplerString(GLenum smpenum)
{
switch(smpenum)
{
case eGL_NONE: return "NONE";
case eGL_NEAREST: return "NEAREST";
case eGL_LINEAR: return "LINEAR";
case eGL_NEAREST_MIPMAP_NEAREST: return "NEAREST_MIP_NEAREST";
case eGL_LINEAR_MIPMAP_NEAREST: return "LINEAR_MIP_NEAREST";
case eGL_NEAREST_MIPMAP_LINEAR: return "NEAREST_MIP_LINEAR";
case eGL_LINEAR_MIPMAP_LINEAR: return "LINEAR_MIP_LINEAR";
case eGL_CLAMP_TO_EDGE: return "CLAMP_EDGE";
case eGL_MIRRORED_REPEAT: return "MIRR_REPEAT";
case eGL_REPEAT: return "REPEAT";
case eGL_MIRROR_CLAMP_TO_EDGE: return "MIRR_CLAMP_EDGE";
case eGL_CLAMP_TO_BORDER: return "CLAMP_BORDER";
default:
break;
}
static string unknown = ToStr::Get(smpenum).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;
+1
View File
@@ -88,6 +88,7 @@ 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);
const char *SamplerString(GLenum smpenum);
GLuint GetBoundVertexBuffer(const GLHookSet &gl, GLuint idx);
+76 -2
View File
@@ -1018,6 +1018,7 @@ void GLReplay::SavePipelineState()
GLint numTexUnits = 8;
gl.glGetIntegerv(eGL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &numTexUnits);
create_array_uninit(pipe.Textures, numTexUnits);
create_array_uninit(pipe.Samplers, numTexUnits);
GLenum activeTexture = eGL_TEXTURE0;
gl.glGetIntegerv(eGL_ACTIVE_TEXTURE, (GLint*)&activeTexture);
@@ -1059,8 +1060,8 @@ void GLReplay::SavePipelineState()
{
for(GLint unit=0; unit < numTexUnits; unit++)
{
pipe.Textures[unit].FirstSlice = 0;
pipe.Textures[unit].Resource = ResourceId();
RDCEraseEl(pipe.Textures[unit]);
RDCEraseEl(pipe.Samplers[unit]);
}
}
else
@@ -1121,6 +1122,8 @@ void GLReplay::SavePipelineState()
GLenum binding = eGL_NONE;
GLenum target = eGL_NONE;
bool shadow = false;
for(size_t s=0; s < ARRAY_COUNT(refls); s++)
{
if(refls[s] == NULL) continue;
@@ -1132,6 +1135,9 @@ void GLReplay::SavePipelineState()
{
GLenum t = eGL_NONE;
if(strstr(refls[s]->Resources[r].variableType.descriptor.name.elems, "Shadow"))
shadow = true;
switch(refls[s]->Resources[r].resType)
{
case eResType_None:
@@ -1207,6 +1213,74 @@ void GLReplay::SavePipelineState()
pipe.Textures[unit].Resource = rm->GetOriginalID(rm->GetID(TextureRes(ctx, tex)));
pipe.Textures[unit].FirstSlice = (uint32_t)firstSlice;
GLuint samp;
gl.glGetIntegerv(eGL_SAMPLER_BINDING, (GLint *)&samp);
pipe.Samplers[unit].Samp = rm->GetOriginalID(rm->GetID(SamplerRes(ctx, samp)));
if(samp != 0)
gl.glGetSamplerParameterfv(samp, eGL_TEXTURE_BORDER_COLOR, &pipe.Samplers[unit].BorderColor[0]);
else
gl.glGetTexParameterfv(target, eGL_TEXTURE_BORDER_COLOR, &pipe.Samplers[unit].BorderColor[0]);
pipe.Samplers[unit].UseBorder = false;
pipe.Samplers[unit].UseComparison = shadow;
GLint v;
v=0;
if(samp != 0)
gl.glGetSamplerParameteriv(samp, eGL_TEXTURE_WRAP_S, &v);
else
gl.glGetTexParameteriv(target, eGL_TEXTURE_WRAP_S, &v);
pipe.Samplers[unit].AddressS = SamplerString((GLenum)v);
pipe.Samplers[unit].UseBorder |= (v == eGL_CLAMP_TO_BORDER);
v=0;
if(samp != 0)
gl.glGetSamplerParameteriv(samp, eGL_TEXTURE_WRAP_T, &v);
else
gl.glGetTexParameteriv(target, eGL_TEXTURE_WRAP_T, &v);
pipe.Samplers[unit].AddressT = SamplerString((GLenum)v);
pipe.Samplers[unit].UseBorder |= (v == eGL_CLAMP_TO_BORDER);
v=0;
if(samp != 0)
gl.glGetSamplerParameteriv(samp, eGL_TEXTURE_WRAP_R, &v);
else
gl.glGetTexParameteriv(target, eGL_TEXTURE_WRAP_R, &v);
pipe.Samplers[unit].AddressR = SamplerString((GLenum)v);
pipe.Samplers[unit].UseBorder |= (v == eGL_CLAMP_TO_BORDER);
v=0;
if(samp != 0)
gl.glGetSamplerParameteriv(samp, eGL_TEXTURE_COMPARE_FUNC, &v);
else
gl.glGetTexParameteriv(target, eGL_TEXTURE_COMPARE_FUNC, &v);
pipe.Samplers[unit].Comparison = ToStr::Get((GLenum)v).substr(3).c_str();
v=0;
if(samp != 0)
gl.glGetSamplerParameteriv(samp, eGL_TEXTURE_MIN_FILTER, &v);
else
gl.glGetTexParameteriv(target, eGL_TEXTURE_MIN_FILTER, &v);
pipe.Samplers[unit].MinFilter = SamplerString((GLenum)v);
v=0;
if(samp != 0)
gl.glGetSamplerParameteriv(samp, eGL_TEXTURE_MAG_FILTER, &v);
else
gl.glGetTexParameteriv(target, eGL_TEXTURE_MAG_FILTER, &v);
pipe.Samplers[unit].MagFilter = SamplerString((GLenum)v);
if(samp != 0)
gl.glGetSamplerParameterfv(samp, eGL_TEXTURE_MAX_ANISOTROPY_EXT, &pipe.Samplers[unit].MaxAniso);
else
gl.glGetTexParameterfv(target, eGL_TEXTURE_MAX_ANISOTROPY_EXT, &pipe.Samplers[unit].MaxAniso);
gl.glGetTexParameterfv(target, eGL_TEXTURE_MAX_LOD, &pipe.Samplers[unit].MaxLOD);
gl.glGetTexParameterfv(target, eGL_TEXTURE_MIN_LOD, &pipe.Samplers[unit].MinLOD);
gl.glGetTexParameterfv(target, eGL_TEXTURE_LOD_BIAS, &pipe.Samplers[unit].MipLODBias);
}
else
{
+24
View File
@@ -100,6 +100,30 @@ namespace renderdoc
[CustomMarshalAs(CustomUnmanagedType.TemplatedArray)]
public Texture[] Textures;
[StructLayout(LayoutKind.Sequential)]
public class Sampler
{
public ResourceId Samp;
[CustomMarshalAs(CustomUnmanagedType.UTF8TemplatedString)]
public string AddressS, AddressT, AddressR;
[CustomMarshalAs(CustomUnmanagedType.FixedArray, FixedLength = 4)]
public float[] BorderColor;
[CustomMarshalAs(CustomUnmanagedType.UTF8TemplatedString)]
public string Comparison;
[CustomMarshalAs(CustomUnmanagedType.UTF8TemplatedString)]
public string MinFilter;
[CustomMarshalAs(CustomUnmanagedType.UTF8TemplatedString)]
public string MagFilter;
public bool UseBorder;
public bool UseComparison;
public float MaxAniso;
public float MaxLOD;
public float MinLOD;
public float MipLODBias;
};
[CustomMarshalAs(CustomUnmanagedType.TemplatedArray)]
public Sampler[] Samplers;
[StructLayout(LayoutKind.Sequential)]
public class Buffer
{
File diff suppressed because it is too large Load Diff
@@ -199,9 +199,11 @@ namespace renderdocui.Windows.PipelineState
samplers.Nodes.Clear();
if (state.Textures != null)
{
int i = 0;
foreach (var r in state.Textures)
for (int i = 0; i < state.Textures.Length; i++)
{
var r = state.Textures[i];
var s = state.Samplers[i];
ShaderResource shaderInput = null;
BindpointMap map = null;
@@ -226,79 +228,144 @@ namespace renderdocui.Windows.PipelineState
(showEmpty.Checked && !filledSlot) // it's empty, and we have "show empty"
)
{
string slotname = i.ToString();
if (shaderInput != null && shaderInput.name != "")
slotname += ": " + shaderInput.name;
UInt32 w = 1, h = 1, d = 1;
UInt32 a = 1;
string format = "Unknown";
string name = "Shader Resource " + r.Resource.ToString();
string typename = "Unknown";
object tag = null;
if (!filledSlot)
// do texture
{
name = "Empty";
format = "-";
typename = "-";
w = h = d = a = 0;
}
string slotname = i.ToString();
// check to see if it's a texture
for (int t = 0; t < texs.Length; t++)
{
if (texs[t].ID == r.Resource)
if (shaderInput != null && shaderInput.name != "")
slotname += ": " + shaderInput.name;
UInt32 w = 1, h = 1, d = 1;
UInt32 a = 1;
string format = "Unknown";
string name = "Shader Resource " + r.Resource.ToString();
string typename = "Unknown";
object tag = null;
if (!filledSlot)
{
w = texs[t].width;
h = texs[t].height;
d = texs[t].depth;
a = texs[t].arraysize;
format = texs[t].format.ToString();
name = texs[t].name;
typename = string.Format("Texture{0}D", texs[t].dimension);
if (texs[t].cubemap)
typename = "TexCube";
tag = texs[t];
name = "Empty";
format = "-";
typename = "-";
w = h = d = a = 0;
}
}
// if not a texture, it must be a buffer
for (int t = 0; t < bufs.Length; t++)
{
if (bufs[t].ID == r.Resource)
// check to see if it's a texture
for (int t = 0; t < texs.Length; t++)
{
w = bufs[t].length;
h = 0;
d = 0;
a = 0;
format = "";
name = bufs[t].name;
typename = "Buffer";
if (texs[t].ID == r.Resource)
{
w = texs[t].width;
h = texs[t].height;
d = texs[t].depth;
a = texs[t].arraysize;
format = texs[t].format.ToString();
name = texs[t].name;
typename = string.Format("Texture{0}D", texs[t].dimension);
if (texs[t].cubemap)
typename = "TexCube";
// for structured buffers, display how many 'elements' there are in the buffer
if (bufs[t].structureSize > 0)
typename = "StructuredBuffer[" + (bufs[t].length / bufs[t].structureSize) + "]";
tag = bufs[t];
tag = texs[t];
}
}
// if not a texture, it must be a buffer
for (int t = 0; t < bufs.Length; t++)
{
if (bufs[t].ID == r.Resource)
{
w = bufs[t].length;
h = 0;
d = 0;
a = 0;
format = "";
name = bufs[t].name;
typename = "Buffer";
// for structured buffers, display how many 'elements' there are in the buffer
if (bufs[t].structureSize > 0)
typename = "StructuredBuffer[" + (bufs[t].length / bufs[t].structureSize) + "]";
tag = bufs[t];
}
}
var node = textures.Nodes.Add(new object[] { slotname, name, typename, w, h, d, a, format });
node.Image = global::renderdocui.Properties.Resources.action;
node.HoverImage = global::renderdocui.Properties.Resources.action_hover;
node.Tag = tag;
if (!filledSlot)
EmptyRow(node);
if (!usedSlot)
InactiveRow(node);
}
var node = textures.Nodes.Add(new object[] { slotname, name, typename, w, h, d, a, format });
// do sampler
{
string slotname = i.ToString();
node.Image = global::renderdocui.Properties.Resources.action;
node.HoverImage = global::renderdocui.Properties.Resources.action_hover;
node.Tag = tag;
if (shaderInput != null && shaderInput.name.Length > 0)
slotname += ": " + shaderInput.name;
if (!filledSlot)
EmptyRow(node);
string borderColor = s.BorderColor[0].ToString() + ", " +
s.BorderColor[1].ToString() + ", " +
s.BorderColor[2].ToString() + ", " +
s.BorderColor[3].ToString();
if (!usedSlot)
InactiveRow(node);
string addressing = "";
string addPrefix = "";
string addVal = "";
string[] addr = { s.AddressS, s.AddressT, s.AddressR };
// arrange like either STR: WRAP or ST: WRAP, R: CLAMP
for (int a = 0; a < 3; a++)
{
string prefix = "" + "STR"[a];
if (a == 0 || addr[a] == addr[a - 1])
{
addPrefix += prefix;
}
else
{
addressing += addPrefix + ": " + addVal + ", ";
addPrefix = prefix;
}
addVal = addr[a];
}
addressing += addPrefix + ": " + addVal;
if (s.UseBorder)
addressing += String.Format("<{0}>", borderColor);
string minfilter = s.MinFilter;
if (s.MaxAniso > 1)
minfilter += String.Format(" Aniso{0}x", s.MaxAniso);
if (s.UseComparison)
minfilter = String.Format("{0}", s.Comparison);
var node = samplers.Nodes.Add(new object[] { slotname, addressing,
minfilter, s.MagFilter,
(s.MinLOD == -float.MaxValue ? "0" : s.MinLOD.ToString()) + " - " +
(s.MaxLOD == float.MaxValue ? "FLT_MAX" : s.MaxLOD.ToString()),
s.MipLODBias.ToString() });
if (!filledSlot)
EmptyRow(node);
if (!usedSlot)
InactiveRow(node);
}
}
i++;
}
}
textures.EndUpdate();
@@ -126,15 +126,6 @@
<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>
@@ -144,21 +135,6 @@
<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>
@@ -276,7 +252,4 @@
<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>