diff --git a/renderdocui/Interop/FetchInfo.cs b/renderdocui/Interop/FetchInfo.cs index fc929bed3..0bd892e37 100644 --- a/renderdocui/Interop/FetchInfo.cs +++ b/renderdocui/Interop/FetchInfo.cs @@ -148,7 +148,7 @@ namespace renderdoc return Maths_HalfToFloat(comp); } - public string Interpret(UInt32 comp) + public string Interpret(UInt32 comp, bool hex) { if (compByteWidth != 4 || compType == FormatComponentType.Float) throw new ArgumentException(); @@ -159,13 +159,13 @@ namespace renderdoc } else if (compType == FormatComponentType.UInt) { - return String.Format("{0}", comp); + return String.Format(hex ? "{0:X8}" : "{0}", comp); } throw new ArgumentException(); } - public string Interpret(UInt16 comp) + public string Interpret(UInt16 comp, bool hex) { if (compByteWidth != 2 || compType == FormatComponentType.Float) throw new ArgumentException(); @@ -176,7 +176,7 @@ namespace renderdoc } else if (compType == FormatComponentType.UInt) { - return String.Format("{0}", comp); + return String.Format(hex ? "{0:X4}" : "{0}", comp); } else if (compType == FormatComponentType.UNorm) { @@ -205,7 +205,7 @@ namespace renderdoc throw new ArgumentException(); } - public string Interpret(byte comp) + public string Interpret(byte comp, bool hex) { if (compByteWidth != 1 || compType == FormatComponentType.Float) throw new ArgumentException(); @@ -216,7 +216,7 @@ namespace renderdoc } else if (compType == FormatComponentType.UInt) { - return String.Format("{0}", comp); + return String.Format(hex ? "{0:X2}" : "{0}", comp); } else if (compType == FormatComponentType.UNorm) { diff --git a/renderdocui/Windows/BufferViewer.cs b/renderdocui/Windows/BufferViewer.cs index 25d233409..8f6041c94 100644 --- a/renderdocui/Windows/BufferViewer.cs +++ b/renderdocui/Windows/BufferViewer.cs @@ -639,7 +639,11 @@ namespace renderdocui.Windows @"uintten|unormten" + @"|unormh|unormb" + @"|snormh|snormb" + - @"|bool|byte|ubyte|short|ushort|int|uint|half|float|double" + // basic types last since they're most the most common match + @"|bool" + // bool is stored as 4-byte int in hlsl + @"|byte|short|int" + // signed ints + @"|ubyte|ushort|uint" + // unsigned ints + @"|xbyte|xshort|xint" + // hex ints + @"|half|float|double" + // float types @")" + @"([1-9])?" + // might be a vector @"(x[1-9])?" + // or a matrix @@ -701,6 +705,8 @@ namespace renderdocui.Windows ResourceFormat fmt = new ResourceFormat(FormatComponentType.None, 0, 0); + bool hex = false; + FormatComponentType type = FormatComponentType.Float; uint count = 0; uint arrayCount = 1; @@ -737,7 +743,7 @@ namespace renderdocui.Windows type = FormatComponentType.SInt; width = 1; } - else if (basetype == "ubyte") + else if (basetype == "ubyte" || basetype == "xbyte") { type = FormatComponentType.UInt; width = 1; @@ -747,7 +753,7 @@ namespace renderdocui.Windows type = FormatComponentType.SInt; width = 2; } - else if (basetype == "ushort") + else if (basetype == "ushort" || basetype == "xshort") { type = FormatComponentType.UInt; width = 2; @@ -757,7 +763,7 @@ namespace renderdocui.Windows type = FormatComponentType.SInt; width = 4; } - else if (basetype == "uint") + else if (basetype == "uint" || basetype == "xint") { type = FormatComponentType.UInt; width = 4; @@ -817,10 +823,13 @@ namespace renderdocui.Windows } } + if (basetype == "xint" || basetype == "xshort" || basetype == "xbyte") + hex = true; + if(fmt.compType == FormatComponentType.None) fmt = new ResourceFormat(type, count * arrayCount, width); - FormatElement elem = new FormatElement(name, 0, input.Strides[0], false, row_major, matrixCount, fmt); + FormatElement elem = new FormatElement(name, 0, input.Strides[0], false, row_major, matrixCount, fmt, hex); elems.Add(elem); input.Strides[0] += elem.ByteSize; @@ -832,7 +841,7 @@ namespace renderdocui.Windows var fmt = new ResourceFormat(FormatComponentType.UInt, 4, 4); - elems.Add(new FormatElement("data", 0, input.Strides[0], false, false, 1, fmt)); + elems.Add(new FormatElement("data", 0, input.Strides[0], false, false, 1, fmt, true)); input.Strides[0] = elems.Last().ByteSize; } @@ -949,7 +958,8 @@ namespace renderdocui.Windows a.PerInstance, false, // row major matrix 1, // matrix dimension - a.Format); + a.Format, + false); i++; } } @@ -971,7 +981,7 @@ namespace renderdocui.Windows ret.Offsets = o; ret.Buffers = bs; - ret.IndexFormat = new FormatElement("", 0, 0, false, false, 1, ifmt); + ret.IndexFormat = new FormatElement("", 0, 0, false, false, 1, ifmt, false); ret.IndexBuffer = ibuffer; ret.IndexOffset = ioffset; @@ -1660,10 +1670,10 @@ namespace renderdocui.Windows byte r = read.ReadByte(); byte a = read.ReadByte(); - rowdata[x+0] = fmt.Interpret(r); - rowdata[x+1] = fmt.Interpret(g); - rowdata[x+2] = fmt.Interpret(b); - rowdata[x+3] = fmt.Interpret(a); + rowdata[x + 0] = fmt.Interpret(r, false); + rowdata[x + 1] = fmt.Interpret(g, false); + rowdata[x + 2] = fmt.Interpret(b, false); + rowdata[x + 3] = fmt.Interpret(a, false); x += 4; } else if (fmt.special && fmt.specialFormat == SpecialFormat.B5G5R5A1) @@ -1757,11 +1767,11 @@ namespace renderdocui.Windows else { if (fmt.compByteWidth == 4) - arr[i] = fmt.Interpret(read.ReadUInt32()); + arr[i] = fmt.Interpret(read.ReadUInt32(), bufferFormats[el].hex); else if (fmt.compByteWidth == 2) - arr[i] = fmt.Interpret(read.ReadUInt16()); + arr[i] = fmt.Interpret(read.ReadUInt16(), bufferFormats[el].hex); else if (fmt.compByteWidth == 1) - arr[i] = fmt.Interpret(read.ReadByte()); + arr[i] = fmt.Interpret(read.ReadByte(), bufferFormats[el].hex); } } @@ -1797,11 +1807,11 @@ namespace renderdocui.Windows for (int i = 0; i < fmt.compCount; i++, x++) { if (fmt.compByteWidth == 4) - rowdata[x] = fmt.Interpret(read.ReadUInt32()); + rowdata[x] = fmt.Interpret(read.ReadUInt32(), bufferFormats[el].hex); else if (fmt.compByteWidth == 2) - rowdata[x] = fmt.Interpret(read.ReadUInt16()); + rowdata[x] = fmt.Interpret(read.ReadUInt16(), bufferFormats[el].hex); else if (fmt.compByteWidth == 1) - rowdata[x] = fmt.Interpret(read.ReadByte()); + rowdata[x] = fmt.Interpret(read.ReadByte(), bufferFormats[el].hex); } } } @@ -2754,9 +2764,10 @@ namespace renderdocui.Windows rowmajor = false; matrixdim = 0; format = new ResourceFormat(); + hex = false; } - public FormatElement(string Name, int buf, uint offs, bool pi, bool rowMat, uint matDim, ResourceFormat fmt) + public FormatElement(string Name, int buf, uint offs, bool pi, bool rowMat, uint matDim, ResourceFormat fmt, bool h) { name = Name; buffer = buf; @@ -2765,6 +2776,7 @@ namespace renderdocui.Windows perinstance = pi; rowmajor = rowMat; matrixdim = matDim; + hex = h; } public uint ByteSize @@ -2782,6 +2794,7 @@ namespace renderdocui.Windows public bool rowmajor; public uint matrixdim; public ResourceFormat format; + public bool hex; } } diff --git a/renderdocui/Windows/Dialogs/BufferFormatSpecifier.Designer.cs b/renderdocui/Windows/Dialogs/BufferFormatSpecifier.Designer.cs index 75ddf4586..deb9f12d4 100644 --- a/renderdocui/Windows/Dialogs/BufferFormatSpecifier.Designer.cs +++ b/renderdocui/Windows/Dialogs/BufferFormatSpecifier.Designer.cs @@ -45,9 +45,9 @@ // groupBox1.Controls.Add(this.formatText); groupBox1.Dock = System.Windows.Forms.DockStyle.Fill; - groupBox1.Location = new System.Drawing.Point(3, 117); + groupBox1.Location = new System.Drawing.Point(3, 195); groupBox1.Name = "groupBox1"; - groupBox1.Size = new System.Drawing.Size(650, 141); + groupBox1.Size = new System.Drawing.Size(571, 102); groupBox1.TabIndex = 0; groupBox1.TabStop = false; groupBox1.Text = "Format"; @@ -60,7 +60,7 @@ this.formatText.Multiline = true; this.formatText.Name = "formatText"; this.formatText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.formatText.Size = new System.Drawing.Size(644, 122); + this.formatText.Size = new System.Drawing.Size(565, 83); this.formatText.TabIndex = 0; this.formatText.Text = "float4 asd; // blah blah\r\nfloat3 bar;"; this.formatText.KeyDown += new System.Windows.Forms.KeyEventHandler(this.formatText_KeyDown); @@ -68,35 +68,36 @@ // label1 // label1.AutoSize = true; + this.tableLayoutPanel1.SetColumnSpan(label1, 2); label1.Location = new System.Drawing.Point(8, 8); label1.Margin = new System.Windows.Forms.Padding(8); label1.Name = "label1"; - label1.Size = new System.Drawing.Size(549, 52); + label1.Size = new System.Drawing.Size(517, 130); label1.TabIndex = 1; label1.Text = resources.GetString("label1.Text"); // // tableLayoutPanel1 // - this.tableLayoutPanel1.ColumnCount = 1; + this.tableLayoutPanel1.ColumnCount = 2; this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); this.tableLayoutPanel1.Controls.Add(groupBox1, 0, 2); this.tableLayoutPanel1.Controls.Add(label1, 0, 0); - this.tableLayoutPanel1.Controls.Add(this.apply, 0, 3); this.tableLayoutPanel1.Controls.Add(this.errors, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.apply, 1, 2); this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); this.tableLayoutPanel1.Name = "tableLayoutPanel1"; - this.tableLayoutPanel1.RowCount = 4; + this.tableLayoutPanel1.RowCount = 3; this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.tableLayoutPanel1.Size = new System.Drawing.Size(656, 300); this.tableLayoutPanel1.TabIndex = 0; // // apply // - this.apply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.apply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.apply.Location = new System.Drawing.Point(585, 269); this.apply.Margin = new System.Windows.Forms.Padding(8); this.apply.Name = "apply"; @@ -108,10 +109,11 @@ // // errors // + this.tableLayoutPanel1.SetColumnSpan(this.errors, 2); this.errors.Dock = System.Windows.Forms.DockStyle.Fill; this.errors.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.errors.ForeColor = System.Drawing.Color.DarkRed; - this.errors.Location = new System.Drawing.Point(3, 68); + this.errors.Location = new System.Drawing.Point(3, 146); this.errors.Name = "errors"; this.errors.Size = new System.Drawing.Size(650, 46); this.errors.TabIndex = 3; diff --git a/renderdocui/Windows/Dialogs/BufferFormatSpecifier.resx b/renderdocui/Windows/Dialogs/BufferFormatSpecifier.resx index 12244a946..4c9804027 100644 --- a/renderdocui/Windows/Dialogs/BufferFormatSpecifier.resx +++ b/renderdocui/Windows/Dialogs/BufferFormatSpecifier.resx @@ -124,9 +124,15 @@ False - Type in a buffer format specifier. Comments and {} braces are skipped, : semantics are ignored. -Basic types accepted: bool, byte, ubyte, short, ushort, int, uint, half, float, double. + Type in a buffer format declaration. Comments and {} braces are skipped, : semantics are ignored. +Declare each element as an hlsl variable, e.g: "float4 first; float2 second; uint2 third;" + +Basic types accepted: bool, byte, short, int, half, float, double. +Unsigned integer types: ubyte, ushort, uint +Hex-formatted integer types: xbyte, xshort, xint + Additionally special formats: unorm[hb] (half, byte) and snorm[hb], and uintten/unormten (10:10:10:2 packing) + Vectors (e.g. float4) and matrices ([rowmajor] half3x4) are supported. Arrays (float[16]) are not supported. \ No newline at end of file