If conditional rendering is enabled its state is always
displayed in both 'Rasterizer' and 'CS' states.
Signed-off-by: Danylo Piliaiev <danylo.piliaiev@globallogic.com>
* This isn't relevant for Vulkan, but in GL it's valid to not specify a binding
and fetch it at runtime (and even if a binding is specified, it's not
immutable and can be changed).
* Similarly GL allows bare uniforms that aren't in a buffer, which we handle in
the same way by wrapping them into a $Globals UBO.
Predicate state is displayed in the raster state.
"Draw Call" and "Wireframe" overlays are visible even if predicate doesn't pass.
Signed-off-by: Danylo Piliaiev <danylo.piliaiev@globallogic.com>
* We handle 4:4:4, 4:2:2, and 4:2:0, with packed, 2-plane and 3-plane formats,
for 8, 10, 12, and 16 bit depths.
* This covers most common formats but still leaves a few out - NV11, palettised
formats, V208/V408 JPG formats.
* For pipelines using tessellation or containing a geometry shader we use
transform feedback to fetch the output of the vertex pipeline after these
stages.
* Using the row index is not accurate when some input attributes are disabled,
because they won't match up to the original index in the attributes list.
* Instead of just configuring SPIR-V disassemblers and picking only the first
one when we need to edit SPIR-V, we allow setting up any shader processor that
goes between two shader encodings.
* When editing, the default will still be to use embedded source, and then after
that the first tool that goes from the native shader format to a text format,
but the drop-down allows you to pick any of them.
* Similarly in the shader viewer you can configure the compilation options and
method, to choose the compiler you want to use. Embedded command line
parameters in the shader are automatically appended.
* This means e.g. the D3D11 back-end can accept DXBC directly if the UI can
provide it, or compile from HLSL as before.
* More importantly, the Vulkan back-end can take SPIR-V compiled from any
source, or compile from GLSL as before as a fall-back.
* The GUIInvoke object takes a QObject, and uses QPointer to check that
it hasn't been deleted when the callback fires. This prevents delayed
callbacks from executing after the object has been deleted and
crashing.
* In most cases the pointer is just 'this'.