Commit Graph

1839 Commits

Author SHA1 Message Date
Chip Davis
dae4a88b06 MSL: Don't do the fixup at all when capturing output. 2019-02-21 17:05:37 -06:00
Chip Davis
b34fd63c2d MSL: Do position fixup for tessellation evaluation shaders, too. 2019-02-21 16:57:56 -06:00
Hans-Kristian Arntzen
a3c934050b
Merge pull request #870 from cdavis5e/msl-tess-fixes-3
MSL: Yet more tessellation fixes.
2019-02-21 23:11:42 +01:00
Chip Davis
7042cb9bec Quiesce truncation warnings. 2019-02-21 15:11:45 -06:00
Chip Davis
c756a91c3c MSL: Fix a case I missed initializing vtx_attrs_by_builtin. 2019-02-21 13:14:03 -06:00
Chip Davis
9d8a5be725 MSL: Ignore duplicate builtin vertex attributes.
These are often arrayed builtins, which MSL maps to more than one
attribute. SPIRV-Cross automatically assigns succeeding addresses to
arrayed attributes, so we really only need the first one. This of course
assumes that the inputs are sorted by location.
2019-02-21 13:14:03 -06:00
Hans-Kristian Arntzen
e37fbc6f72
Merge pull request #868 from cdavis5e/msl-tess-fixes-2
MSL: More tessellation shader fixes
2019-02-21 10:05:18 +01:00
Chip Davis
5069ec72bb MSL: Set location of builtins based on client input.
Builtin attributes in SPIR-V aren't linked by location, but by their
built-in-ness. This poses a problem for MSL, since builtin inputs in
the vertex pipeline are just regular attributes. We must then assign
them locations so that they can be matched up to the attributes in the
stage input descriptor--and also to avoid duplicate attribute numbers in
tessellation evaluation shaders, where there are two different
stage-in structs, so the member index therein is no longer unique!
2019-02-20 22:16:51 -06:00
Chip Davis
7a7e210515 MSL: Force unnamed array builtin attributes to have a name.
That way, when we refer to them, they'll have the name that we're
expecting.
2019-02-20 22:16:51 -06:00
Hans-Kristian Arntzen
ed7292fec4
Merge pull request #867 from cdavis5e/tese-shader-origin-2
MSL: Don't bother fixing up triangle tess coords.
2019-02-20 22:36:21 +01:00
Chip Davis
285ca4c2b1 MSL: Don't bother fixing up triangle tess coords.
Instead, I'm going to have MoltenVK reverse the winding order in the
lower-left case. This seems to be what the test suite expects to happen
anyhow.
2019-02-20 14:30:44 -06:00
Hans-Kristian Arntzen
c1a93b8a71 Run format_all.sh.
Missed some nits in earlier reviews.
2019-02-20 17:29:57 +01:00
Hans-Kristian Arntzen
2c09c51fba
Merge pull request #866 from cdavis5e/msl-tess-fixes
MSL: Some fixes for tessellation shaders.
2019-02-20 17:07:03 +01:00
Chip Davis
ba8593b112 Fix formatting. 2019-02-20 09:19:25 -06:00
Chip Davis
8095434dc4 MSL: Drop stores to nonexistent tess levels.
In SPIR-V, there are always two inner levels and four outer levels, even
if the input patch isn't a quad patch. But in MSL, due to requirements
imposed by Metal, only one inner level and three outer levels exist when
the input patch is a triangle patch. We must explicitly ignore any write
to the nonexistent second inner and fourth outer levels in this case.
2019-02-20 09:11:24 -06:00
Chip Davis
c8ee9fbe76 MSL: Expand quad gl_TessCoord to a float3.
This is the actual SPIR-V type of the builtin. We forced to a `float2`
in the declaration because that's what Metal wants.
2019-02-20 09:11:24 -06:00
Chip Davis
68b09f2a34 MSL: Set rasterization disabled for tese shaders, too. 2019-02-20 09:11:20 -06:00
Hans-Kristian Arntzen
58f264c99d
Merge pull request #865 from KhronosGroup/fix-863
Always value-cast FP16 constants instead of using literals.
2019-02-20 14:58:44 +01:00
Hans-Kristian Arntzen
f10d37a64a
Merge pull request #864 from KhronosGroup/fix-861
Fix case where a struct is loaded which contains a row-major matrix.
2019-02-20 14:58:05 +01:00
Hans-Kristian Arntzen
4ef51331b2 Always value-cast FP16 constants instead of using literals.
GL_NV_gpu_shader5 doesn't support "hf", so to avoid lots of complicated
workarounds, just value-cast the half literals.
2019-02-20 12:30:01 +01:00
Hans-Kristian Arntzen
056a0ba27e Fix case where a struct is loaded which contains a row-major matrix. 2019-02-20 12:19:00 +01:00
Hans-Kristian Arntzen
afa9eb89bf
Merge pull request #862 from KhronosGroup/fix-858
Fix edge case where opaque types can be declared on stack.
2019-02-20 11:49:49 +01:00
Hans-Kristian Arntzen
d2cc43e667 Fix edge case where opaque types can be declared on stack.
In the bizarre case where the ID of a loaded opaque type aliased with a
literal which was used as part of another texturing instruction, we
could end up with a case where domination analysis assumed the loaded
opaque type needed to be moved to a different scope.

Fix the issue by never doing dominance analysis for opaque temporaries,
and be more robust when analyzing texturing instructions.

Also make sure reflection output is deterministic.
This patch slightly alterered output for some unknown reason, but it came from an
unordered_map, so it's fine.
2019-02-19 17:28:31 +01:00
Hans-Kristian Arntzen
ced1637987
Merge pull request #860 from cdavis5e/tese-shader-origin
MSL: Add an option to set the tessellation domain origin.
2019-02-19 09:39:30 +01:00
Chip Davis
41d9424233 MSL: Add an option to set the tessellation domain origin.
This is intended to be used to support `VK_KHR_maintenance2`'s
tessellation domain origin feature. If `tess_domain_origin_lower_left`
is `true`, the `v` coordinate will be inverted with respect to the
domain. Additionally, in `Triangles` mode, the `v` and `w` coordinates
will be swapped. This is because the winding order is interpreted
differently in lower-left mode.
2019-02-18 14:25:42 -06:00
Hans-Kristian Arntzen
1458bae62e
Merge pull request #857 from cdavis5e/tese-shader-msl
MSL: Add support for tessellation evaluation shaders.
2019-02-18 09:36:14 +01:00
Chip Davis
3e4252c6d5 Add a note that array-of-struct input needs fixing. 2019-02-15 17:33:21 -06:00
Chip Davis
08863c1e28 Don't set any aliases or do any flattening for arrayed per-vertex I/O.
We already handle all that specially.
2019-02-15 17:24:16 -06:00
Chip Davis
6b7988046d Handle blocks of patch I/O.
In this case, each member of the block will be decorated with
`DecorationPatch`, rather than the block variable having the decoration.
2019-02-15 17:21:38 -06:00
Chip Davis
03b4d3c19f Make is_tessellation_shader() static method protected.
This is an internal helper used by the instance method.
2019-02-15 12:00:19 -06:00
Chip Davis
e75add42c9 MSL: Add support for tessellation evaluation shaders.
These are mapped to Metal's post-tessellation vertex functions. The
semantic difference is much less here, so this change should be simpler
than the previous one. There are still some hairy parts, though.

In MSL, the array of control point data is represented by a special
type, `patch_control_point<T>`, where `T` is a valid stage-input type.
This object must be embedded inside the patch-level stage input. For
this reason, I've added a new type to the type system to represent this.

On Mac, the number of input control points to the function must be
specified in the `patch()` attribute. This is optional on iOS.
SPIRV-Cross takes this from the `OutputVertices` execution mode; the
intent is that if it's not set in the shader itself, MoltenVK will set
it from the tessellation control shader. If you're translating these
offline, you'll have to update the control point count manually, since
this number must match the number that is passed to the
`drawPatches:...` family of methods.

Fixes #120.
2019-02-14 10:00:08 -06:00
Hans-Kristian Arntzen
cea2fabba6
Merge pull request #856 from KhronosGroup/fixup-public-api
Move some interfaces out of public.
2019-02-14 10:19:19 +01:00
Hans-Kristian Arntzen
9453b4638c Move some interfaces out of public.
They are internal, so should be protected:
2019-02-14 10:18:06 +01:00
Hans-Kristian Arntzen
cbd76e7c3b Run format_all.sh. 2019-02-14 09:28:46 +01:00
Hans-Kristian Arntzen
878c502f96 MSL: Hoist out complicated tesc workaround code. 2019-02-14 09:28:17 +01:00
Hans-Kristian Arntzen
aab4a5632b Merge branch 'tesc-shader' of git://github.com/cdavis5e/SPIRV-Cross 2019-02-14 09:17:32 +01:00
Chip Davis
13df78bebf Unflatten inputs when copying to outputs.
This should fix a whole host of issues related to structs in the `Input`
class in a tessellation control shader.

Also, use pointer arithmetic instead of dereferencing the `ops` array.
This is critical in case we wind up stepping beyond the bounds of the
array.
2019-02-13 12:37:24 -06:00
Hans-Kristian Arntzen
a3adc0721b
Merge pull request #855 from KhronosGroup/fix-854
GLSL: Fix block name shenanigans in edge cases.
2019-02-13 17:31:09 +01:00
Hans-Kristian Arntzen
d7090b8322 GLSL: Fix block name shenanigans in edge cases.
When we force recompile, the old var.self name we used as a fallback
name might have been disturbed, so we should recover certain names back
to their original form in case we are forced to take a recompile to make
the naming algorithm more deterministic.
2019-02-13 16:39:59 +01:00
Chip Davis
83b7e66218 Throw an error if the shader specifies isoline tessellation. 2019-02-11 17:21:36 -06:00
Chip Davis
0bb6bbda22 Never flatten outputs when capturing them.
There's no need to do so, since these are not stage-out structs being
returned, but regular structures being written to a buffer. This also
neatly avoids issues writing to composite (e.g. arrayed) per-patch
outputs from a tessellation control shader.
2019-02-11 17:18:54 -06:00
Chip Davis
8860a97d4a Fix formatting of uint32_t casts. 2019-02-11 16:14:00 -06:00
Chip Davis
1919eb1b46 Pass the original pointer type to ensure_correct_attribute_type().
This prevents us from overwriting the variable's type with a non-pointer
type.
2019-02-11 16:07:43 -06:00
Chip Davis
eb89c3a428 MSL: Add support for tessellation control shaders.
These are transpiled to kernel functions that write the output of the
shader to three buffers: one for per-vertex varyings, one for per-patch
varyings, and one for the tessellation levels. This structure is
mandated by the way Metal works, where the tessellation factors are
supplied to the draw method in their own buffer, while the per-patch and
per-vertex varyings are supplied as though they were vertex attributes;
since they have different step rates, they must be in separate buffers.

The kernel is expected to be run in a workgroup whose size is the
greater of the number of input or output control points. It uses Metal's
support for vertex-style stage input to a compute shader to get the
input values; therefore, at least one instance must run per input point.
Meanwhile, Vulkan mandates that it run at least once per output point.
Overrunning the output array is a concern, but any values written should
either be discarded or overwritten by subsequent patches. I'm probably
going to put some slop space in the buffer when I integrate this into
MoltenVK to be on the safe side.
2019-02-07 08:51:22 -06:00
Hans-Kristian Arntzen
d9ed3dcc7a
Merge pull request #848 from cdavis5e/capture-output-buffer
MSL: Add a setting to capture vertex shader output to a buffer.
2019-02-07 15:11:41 +01:00
Chip Davis
ae87c41b96 Provide feedback on whether or not an output buffer is needed. 2019-02-06 17:22:12 -06:00
Chip Davis
056c0e207d Take the vertex count from any indirect parameters passed.
This is necessary to deal with indirect draws, where the draw parameters
are given in a buffer instead of passed by the CPU. For normal draws,
the draw parameters are set with Metal's `setVertexBytes:` method.

This undoes the change to add the vertex count to the aux buffer,
rendering that entire discussion largely moot. Oh well. It was a
discussion that needed to happen anyway.
2019-02-06 15:17:14 -06:00
Chip Davis
f55253dc1b On second thought, don't use a feature struct for the aux buffer. 2019-02-06 14:45:26 -06:00
Chip Davis
ea74e453e3 Use a macro instead of a field for the struct version. 2019-02-06 14:43:03 -06:00
Chip Davis
d86adbe550 Add a structure to hold optional members of the aux buffer.
Programs can query the version to know what features are present, and
turn them on and off at will.
2019-02-06 14:26:06 -06:00