From e4751e66f345a96b467139bf0b5366acf933341c Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 19 May 2022 17:12:19 +0100 Subject: [PATCH] Update docs for buffer viewer changes --- docs/how/how_buffer_format.rst | 259 +++++++++++++++++++++++++ docs/how/how_object_details.rst | 6 +- docs/how/index.rst | 1 + docs/imgs/Screenshots/AOSBuffer.png | Bin 0 -> 20644 bytes docs/imgs/Screenshots/CBuffer.png | Bin 12465 -> 0 bytes docs/imgs/Screenshots/RawBuffer.png | Bin 32946 -> 0 bytes docs/imgs/Screenshots/SOABuffer.png | Bin 0 -> 20032 bytes docs/imgs/icons/align.png | Bin 0 -> 1488 bytes docs/python_api/qrenderdoc/windows.rst | 6 - docs/python_api/renderdoc/shaders.rst | 4 +- docs/window/buffer_viewer.rst | 65 ++++--- 11 files changed, 299 insertions(+), 42 deletions(-) create mode 100644 docs/how/how_buffer_format.rst create mode 100644 docs/imgs/Screenshots/AOSBuffer.png delete mode 100644 docs/imgs/Screenshots/CBuffer.png delete mode 100644 docs/imgs/Screenshots/RawBuffer.png create mode 100644 docs/imgs/Screenshots/SOABuffer.png create mode 100644 docs/imgs/icons/align.png diff --git a/docs/how/how_buffer_format.rst b/docs/how/how_buffer_format.rst new file mode 100644 index 000000000..7dd1adedd --- /dev/null +++ b/docs/how/how_buffer_format.rst @@ -0,0 +1,259 @@ +How do I specify a buffer format? +================================= + +This page documents how to format buffer data, in cases where the default reflected format is missing or you want to customise it. + +The format string can contain C and C++ style comments freely, but a C pre-processor is not supported. + +By default the final interpreted format is defined by the list of global variables in the layout string, however if no global variables are defined the final struct to be defined is used as-if there were a single variable instance of that struct. + +.. code:: c++ + + struct data + { + float a; + int b; + }; + +Is equivalent to + +.. code:: c++ + + struct data + { + float a; + int b; + }; + + data d; + +However note that if there are global variables, structs will **not** automatically be instantiated and must be declared as variables. + +Basic types +----------- + +Variables can be declared using familiar syntax from either GLSL or HLSL. A float would be declared as: + +.. code:: c++ + + float myvalue; + +Most common basic types are available: + +* ``bool`` - A 4-byte boolean. +* ``byte``, ``short``, ``int``, ``long`` - 1, 2, 4, and 8 byte signed integers respectively. +* ``ubyte``, ``ushort``, ``uint``, ``ulong`` - 1, 2, 4, and 8 byte unsigned integers respectively. It is also possible to prefix ``unsigned`` before a signed type. +* ``half``, ``float``, ``double`` - 2, 4, and 8 byte floating point values. + +These can be declared as vectors by appending the vector width. Similarly matrices can be declared by appending the vector and matrix dimensions. + +GLSL declarations for float, int, and uint vectors and matrices are supported too. + +.. code:: c++ + + float2 myvector2; // 2-vector of floats + float4 myvector4; + float2x2 mymat; // 2x2 matrix + mat2 myGLmat; // equivalent to float2x2 + vec2 myGLvec; // equivalent to float2 + +You can also declare any of these types as an array. Arrays can either have a fixed size, or an unbounded size - unbounded arrays are :ref:`detailed below in the discussion of AoS vs SoA data `. + +.. code:: c++ + + float fixedArray[2]; // array of two floats + float3 unboundedArray[]; // unbounded array of float3s + +Structs +------- + +Structs are declared similarly to in GLSL or HLSL, or in C. + +.. code:: c++ + + struct MyStructName { + float a; + int b; + }; + + MyStructName str; // single instance of the struct + MyStructName arr[4]; // array of 4 instances + +Structs can be nested freely, but cannot be forward declared so a struct can only reference structs defined before it. + +Enums +----- + +Enums can be defined but must be defined using a base integer type to declare their size. Enum values must be literal integers, either in decimal or hexadecimal. + +Values must be explicitly given, and automatic numbering or expression-based values are not supported. + +.. code:: c++ + + enum MyEnum : uint { + FirstValue = 5, + HexValue = 0xf, + }; + + MyEnum e; // A uint will be read and interpreted as the above enum + +Bitfields +--------- + +Integer values can be bit-packed together using C style bitfields. + +.. code:: c++ + + int first : 3; + int second : 5; + int third : 10; + int : 6; // anonymous values can be used to skip bits without declaring anything + int last : 8; + +This declaration will read only a single 32-bit integer, and interpret the bits according to this packing. + +Pointers +-------- + +On APIs where GPU pointers can reside within memory, such as Vulkan, pointers can be declared with a base struct type and these will be read and interpreted from a 64-bit address in the underlying buffer. + +.. code:: c++ + + struct MyStructName { + float a; + int b; + }; + + MyStructName *pointer; + +Packing and layout rules +------------------------ + +Graphics APIs define different rules for how data should be packed into memory, and this sometimes depends on the usage of the buffer within the API. + +RenderDoc will use the most sensible default where possible - e.g. for D3D buffers that are known to be bound as constant buffers the constant buffer packing will be used, similarly for OpenGL uniform buffers using std140. However the packing can be explicitly specified and any automatic reflection-based format will declare the packing explicitly. + +Once a packing format is specified, RenderDoc will calculate the necessary alignment and padding for each element to comply with the rules while otherwise tightly packing, the same as a normal shader declaration would. + +The format for a buffer can be specified using ``#pack(packing_format)``. This can only be specified at global scope, not inside a structure, and the packing rules will apply for all subsequent declarations. + +The five packing formats supported are: + +* ``cbuffer``, ``d3dcbuffer`` or ``cb`` - D3D constant buffer packing. +* ``structured``, ``d3duav``, or ``uav`` - D3D structured buffer packing (applies to buffer SRVs as well as UAVs). +* ``std140``, ``ubo``, or ``gl`` - OpenGL std140 uniform buffer packing. +* ``std430``, ``ssbo`` - OpenGL std430 storage buffer packing. +* ``scalar`` - Vulkan scalar buffer packing. + +It is also possible to tweak particular packing properties with ``#pack()``. Each property can be enabled or disabled by ``#pack(prop)`` or ``#pack(no_prop)``. Each property will *relax* some restrictions, so the strictest possible packing is ``std140`` with all properties off, and the most lax packing is ``scalar`` with all properties on. + +The available packing properties are: + +* ``vector_align_component`` - If enabled, vectors are only aligned to their component. If disabled, 2-vectors are aligned to 2x their component, 3-vectors and 4-vectors are aligned to 4x their components. This is disabled only for ``std140`` and ``std430`` by default. +* ``vector_straddle_16b`` - If enabled, vectors are allowed to straddle 16-byte alignment boundaries. If disabled, vectors must be padded/aligned to not straddle. This is disabled only for ``std140``, ``std430``, and ``cbuffer`` by default. +* ``tight_arrays`` - If enabled, arrays elements are only aligned to the element size. If disabled, each array element is aligned to a 16-byte boundary. This is disabled for ``std140`` and ``cbuffer`` by default. +* ``trailing_overlap`` - If enabled, elements can be placed in trailing padding from a previous element such as an array or struct. If disabled, each element's padding is reserved and the next element must come after the padding. This disabled for ``std140``, ``std430``, and ``structured`` by default. + +Annotations +----------- + +The buffer format supports annotations on declarations to specify special properties. These use C++ ``[[annotation(parameter)]]`` syntax. + +Struct definitions support the following annotations: + +* ``[[size(number)]]`` or ``[[byte_size(number)]]`` - Forces the struct to be padded up to a given size even if the contents don't require it. +* ``[[single]]`` or ``[fixed]]`` - Forces the struct to be considered as a fixed SoA definition, even if in context the buffer viewer may default to AoS. See the below section for more details. Structs with this annotation **may not** be declared as a variable, and should instead be the implicit final struct in a definition. + +Variable declarations support the following annotations: + +* ``[[offset(number)]]`` or ``[[byte_offset(number)]]`` - Forces this member to be at a given offset **relative to its parent**. This cannot place the member any earlier than it would have according to tight packing with the current packing rules. +* ``[[pad]]`` or ``[[padding]]`` - Mark this member as padding, such that structure layout is calculated accounting for it but it is not displayed visibly. +* ``[[single]]`` or ``[fixed]]`` - Forces this variable to be considered as a fixed SoA definition, even if in context the buffer viewer may default to AoS. See :ref:`the below section ` for more details. This must be a global variable, and it must be the only global variable in the format definition. +* ``[[row_major]]`` or ``[[col_major]]`` - Declares the memory order for a matrix. +* ``[[rgb]]`` - Will color the background of any repeated data by interpreting its contents as RGB color. +* ``[[hex]]`` or ``[[hexadecimal]]`` - Will show integer data as hexadecimal. +* ``[[bin]]`` or ``[[binary]]`` - Will show integer data as binary. +* ``[[unorm]]`` or ``[[snorm]]`` - On 1-byte or 2-byte integer variables, will interpret them as unsigned or signed normalised data respectively. +* ``[[packed(format)]]`` - Interprets a variable according to a standard bit-packed format. Supported formats are: + + * ``r11g11b10`` which must be used with a ``float3`` type. + * ``r10g10b10a2`` or ``r10g10b10a2_uint`` which must be used with a ``uint4`` type. Can optionally be combined with ``[[unorm]]`` or ``[[snorm]]``. + * ``r10g10b10a2_unorm`` which must be used with a ``uint4`` type. + * ``r10g10b10a2_snorm`` which must be used with a ``int4`` type. + +.. _aos-soa: + +Array of Structs (AoS) vs Struct of Arrays (SoA) +------------------------------------------------ + +The :doc:`../window/buffer_viewer` is capable of displaying both repeating data of a single format (AoS) as well as fixed non-repeating data (called SoA). Typically AoS is used for large buffers, where a small struct is repeated many times to form the elemnts in the buffer. SoA is used most commonly for constant buffers with a fixed amount of data, but can be used in any context. On some APIs it is possible for a buffer to contain some fixed data before the repeating data and thus it contains both types. + +RenderDoc tries to use context to interpret buffer formats correctly, defaulting to AoS interpretation in cases where it is likely intended. However this can be hinted or overridden as desired. + +To specify AoS data explicitly you can declare an unbounded array: + +.. code:: c++ + + float3 unboundedArray[]; // unbounded array of float3s + +When supported by the API, this can be preceeded by any fixed data in the buffer before the repeated AoS data. The buffer viewer will show both parts of the data separately, with a tree view for the fixed data and a table for the repeated data. + +In the opposite direction, normally a loose collection of variables without any such unbounded array will be taken as the definition of a struct within an AoS view: + +.. code:: c++ + + struct data + { + float a; + int2 b; + float c; + }; + +However if the desire is to display this as a single fixed element where the fixed tree view is more appropriate, the structure or an variable of it can be annotated as ``[single]]`` or ``[[fixed]]``. + +.. code:: c++ + + [[single]] + struct data + { + float a; + int2 b; + float c; + }; + +.. code:: c++ + struct data + { + float a; + int2 b; + float c; + }; + + [[single]] + data fixed_data; + +This will force the struct to be displayed as a single instance, and not as a repeated AoS. + +Saving and loading formats +-------------------------- + +Commonly used formats can be saved and these will be persisted from run to run. + +.. |save| image:: ../imgs/icons/save.png + +.. |goarrow| image:: ../imgs/icons/action_hover.png + +To save the current format to an existing entry, select it and click on the |save| button. + +To save to a new entry, either type the name directly into the ``New...`` at the bottom, double click on it to begin entering the name, or select it and click save then enter the name. + +If the buffer view was opened with an automatically populated format, it will be available as a read-only ```` entry. + +Loading an entry can be accomplished by either double clicking on it, or selecting it and clicking |goarrow|. This will load the format and automatically apply it to the buffer view. + +You can use undo/redo to undo the loading of a saved format, if you wish to go back to the previous format. + +See Also +-------- + +* :doc:`../window/buffer_viewer` diff --git a/docs/how/how_object_details.rst b/docs/how/how_object_details.rst index d146931ef..b0bbc7380 100644 --- a/docs/how/how_object_details.rst +++ b/docs/how/how_object_details.rst @@ -47,11 +47,11 @@ Buffers bound to the pipeline can be opened as a raw buffer viewer. This will op By default if the buffer is bound to the pipeline with a pre-existing structure that can be reflected from the shader then this will be the default, otherwise the default layout will be 4 32bit unsigned integers per element. -This layout can be customised by entering a format in a simple style that mimics defining a structure that outlines a single element in the buffer. +This layout can be customised by entering a format in a simple style that mimics defining a structure that outlines a single element in the buffer, for more information see :doc:`../how/how_buffer_format`. More details on this section are available on the :doc:`../window/buffer_viewer` page. -.. figure:: ../imgs/Screenshots/RawBuffer.png +.. figure:: ../imgs/Screenshots/AOSBuffer.png Custom Buffer Layout: Customising the layout of the buffer by defining a structure. @@ -66,7 +66,7 @@ Constant buffers can be viewed by clicking on their Go Arrow |goarrow|. This wil Whenever this shader slot has a constant buffer in it, both the constant names and types as well as values will be displayed. -.. figure:: ../imgs/Screenshots/CBuffer.png +.. figure:: ../imgs/Screenshots/SOABuffer.png Constant Buffer: An updating preview of the contents of this constant buffer. diff --git a/docs/how/index.rst b/docs/how/index.rst index ca39a1264..60955b9f7 100644 --- a/docs/how/index.rst +++ b/docs/how/index.rst @@ -9,6 +9,7 @@ How do I ...? how_debug_shader how_shader_debug_info how_inspect_pixel + how_buffer_format how_view_texture how_object_details how_capture_callstack diff --git a/docs/imgs/Screenshots/AOSBuffer.png b/docs/imgs/Screenshots/AOSBuffer.png new file mode 100644 index 0000000000000000000000000000000000000000..a230f67f483051d3297089dac0ff658922128b3f GIT binary patch literal 20644 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 Tf$bA;8uaXmf@J=qm+$@;=)y?6 literal 0 HcmV?d00001 diff --git a/docs/imgs/Screenshots/CBuffer.png b/docs/imgs/Screenshots/CBuffer.png deleted file mode 100644 index 37509e08b235edc2e7f936508c100d5f1a6191ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12465 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 WiP4fz(Eb5Eh>V21c!B5}pZ^cpUKT(A literal 0 HcmV?d00001 diff --git a/docs/imgs/icons/align.png b/docs/imgs/icons/align.png new file mode 100644 index 0000000000000000000000000000000000000000..5377a845aa5d580c077bc4610f4409cd7cf423d2 GIT binary patch literal 1488 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%uvD1M9IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr4|esh*)icxGNo zet9uiy|1s8XI^nhVqS8pr;Du;&;-5A%oHn2OEV{PV`FDS14Cm&Lsw%96LU95Lt_J1 zS7%FOHw#0UUYGpj(%jU%5}4i;gkBe%dO=Acw*Y9fOKMSOS!#+~QGTuh*vnR#xZUE2 z(>$o&6x?oc!l_pu=oo!a#3DsBObD2IKumbD1#;jCKQ#}S+KYh6x;XR8KL!RS7f%<* zkcwMVf_*(g0!99v+gmr^^#HeMWak{*WFD~ zTRO}nJ$kOGo#H52K4IJBf~!u8W?h_h|NA@JxjT)scotu1Jihz=oZq$2Yo5<>4|j9> z@#}?#X!p^R23>4(iy4gf2s&!AE-rPu_xvd1>ZBDj{Jzxg>aYKM&YM-5RlurjtEbQ5zy}9wy{EI>;al$0 z+rZ+X*0=T0uiu^9<1d zY`WS0JA75B#j4bA6^iB)SIn^c%$Tjtf1g|Xp@H@7DT+L6HMCE!eA5^pwWPUcqYua2 zrrtLN*UxGytjh6Cv|cSVL#(F0L@`%N=|pYxm-lluA|9Qrb>G9axKr>l&&$I-bv75W zV>q-oN&J!*YFcfcd-%Jv+UM0v>}EPx#>{zr^hx(}^RkRbWz&oeH@yf*m645)=w#>0 z{n((JdFt<(Yu}i;Qu`7s-!nMnxlW80*m!fz2@T6*OEzl6rfHPrcr)pVE;zdSWZ~82iIxi{2(M~b5_Npx z)lAQjn>m};Y&x`YJ^zO%KUZH_c{}*?)dP3_maGbV^V0ggK){oOPEq0tEN}iZ_s-kB znS1kN+m*t}!k<@eoX-9B&pN(Pm&p00i_ I>zopr0D-VH{r~^~ literal 0 HcmV?d00001 diff --git a/docs/python_api/qrenderdoc/windows.rst b/docs/python_api/qrenderdoc/windows.rst index c21e65b18..1ad894c5c 100644 --- a/docs/python_api/qrenderdoc/windows.rst +++ b/docs/python_api/qrenderdoc/windows.rst @@ -109,12 +109,6 @@ Shader Viewer .. autoclass:: qrenderdoc.ShaderViewer :members: -Constant Buffer Previewer -------------------------- - -.. autoclass:: qrenderdoc.ConstantBufferPreviewer - :members: - Pixel History ------------- diff --git a/docs/python_api/renderdoc/shaders.rst b/docs/python_api/renderdoc/shaders.rst index e3aea94f1..7335b8f4c 100644 --- a/docs/python_api/renderdoc/shaders.rst +++ b/docs/python_api/renderdoc/shaders.rst @@ -80,8 +80,8 @@ Shader Constants .. autoclass:: renderdoc.ShaderConstantType :members: - -.. autoclass:: renderdoc.ShaderConstantDescriptor + +.. autoclass:: renderdoc.ShaderVariableFlags :members: .. autoclass:: renderdoc.VarType diff --git a/docs/window/buffer_viewer.rst b/docs/window/buffer_viewer.rst index 636512a7f..259e9e5db 100644 --- a/docs/window/buffer_viewer.rst +++ b/docs/window/buffer_viewer.rst @@ -1,40 +1,43 @@ -Raw Buffer Viewer -================= +Buffer Viewer +============= -When opening a buffer as a raw display, sometimes a default layout will be specified e.g. if available from shader reflection data. If not, the layout will default to 4 32bit unsigned integers. +When opening a buffer for view, it can display both fixed non-repeating "struct-of-arrays" (SoA) data, repeated "array-of-structs" (AoS) data, or where supported by the API it can display both - with the fixed data coming as a prefix to repeated data. -This format can be refined and customised by entering a structure-like definition into the text box at the bottom of the window. The given types are listed below, and can be combined in hlsl- or glsl-like fashion specifying n-wide vector elements. +.. note:: -In addition to this, you can specify a row offset which is useful in remaining at the same row while watching the change in a buffer between different events, as well as a byte offset to shift the data along from the start of the buffer (e.g. if what you are interested in starts only part-way through the buffer but is not aligned along the data stride you enter). + "struct-of-arrays" (SoA) is used only in comparison to "array-of-structs" (AoS). The simple case of only fixed values with no arrays would also be considered SoA data, just with no arrays. -.. figure:: ../imgs/Screenshots/RawBuffer.png +The format is defined initially by whatever reflection data is available. The format can be customised, as detailed in :doc:`../how/how_buffer_format`. - Buffer specification: Specifying a custom buffer format. +Constant buffers are assumed to be AoS data in all cases. Other views of buffers via non-constant bindings such as UAVs and storage buffers, or views opened directly from a buffer from the resource inspector, will default towards SoA data unless the layout explicitly declares a fixed set of SoA data. -Below are listed the basic types. You can append a number to each of these to make an N-wide vector (e.g. ``ushort4`` or ``float3``, or ``uvec4``/``vec3``). You can also specify matrices as ``float3x4`` or ``mat3x4``. By default matrices are column major, but you can change this by prepending ``row_major`` as you would in hlsl. +.. figure:: ../imgs/Screenshots/AOSBuffer.png -* ``uint`` - unsigned 32bit integer -* ``bool`` - unsigned 32bit integer (this is the format for hlsl bools) -* ``int`` - signed 32bit integer -* ``ushort`` - unsigned 16bit integer -* ``short`` - signed 16bit integer -* ``ubyte`` - unsigned 8bit integer -* ``byte`` - signed 8bit integer -* ``double`` - 64bit floating point -* ``float`` - 32bit floating point -* ``half`` - 16bit floating point + The buffer being viewed as an array of structs (AoS). -There are also some non-hlsl types for displaying other formats which don't have a corresponding native hlsl type +.. figure:: ../imgs/Screenshots/SOABuffer.png -* ``unormb`` - 8bit unsigned normalised value -* ``unormh`` - 16bit unsigned normalised value -* ``unormf`` - 32bit unsigned normalised value -* ``snormb`` - 8bit signed normalised value -* ``snormh`` - 16bit signed normalised value -* ``snormf`` - 32bit signed normalised value -* ``uintten`` - 4 component unsigned integer format, packed as 10:10:10:2 -* ``unormten`` - 4 component unsigned normalised format, packed as 10:10:10:2 -* ``floateleven`` - 3 component floating point format, packed as 11:11:10 -* ``xint`` - hex-formatted 32bit integer -* ``xshort`` - hex-formatted 16bit integer -* ``xbyte`` - hex-formatted 8bit integer + The buffer being viewed as a struct of arrays (SoA). + +Navigation +---------- + +The buffer viewer can specify the visible range to be interpreted, given a byte offset and length. Only bytes within this range will be displayed, with any other data from outside the range showing as ``---``. + +The initial values of the offset and length will be taken from the relevant binding, or default to the entire buffer if no subset is referenced by the binding. + +In addition to this, you can specify a row offset which is useful in remaining at the same row while watching the change in a buffer between different events. + +Exporting and display +--------------------- + +.. |align| image:: ../imgs/icons/align.png + +When displaying fixed SoA data as above, the padding can be visualised by enabling the |align| option. + +Buffer data can be exported either as CSV values, or where the buffer is backed by byte memory as raw bytes. + +See Also +-------- + +* :doc:`../how/how_buffer_format`