Commit Graph

180 Commits

Author SHA1 Message Date
Bill Hollings
484931d8b2 spirv_msl auto-alignment of members of MSL uniform structs.
spirv_msl optionally add padding and packing to allow MSL
struct members to align with SPIR-V struct alignments.
spirv_cross add convenience methods for testing Decorations.
spirv_glsl replace member_decl() function with new emit_stuct_member().
Allow struct member types to be marked as packed via DecorationCPacked decoration.
2017-02-28 21:44:36 -05:00
Hans-Kristian Arntzen
bcf2303ba0 Do not emit storage qualifiers for local variables.
Metal backend uses local variables to implement global variables.
Do not emit storage qualifiers for any variable which is declared inside
a function.
2017-02-24 11:15:34 +01:00
Hans-Kristian Arntzen
036b9b73f5 Emit storage qualifier in the correct place.
Need to emit qualifiers in a specific order for legacy GLSL.

<interpolation> <storage> <precision> <type>.
2017-02-24 09:56:17 +01:00
Hans-Kristian Arntzen
fc80cd8cbf Add support for loading flattened structs. 2017-02-23 19:31:56 +01:00
Hans-Kristian Arntzen
97350d32fd Fix cases for flattened struct write.
Handle writing the entire struct as well as writing the elements
individually.
2017-02-23 19:05:11 +01:00
Hans-Kristian Arntzen
3c58bbbcbe Flatten varying structs outputs in legacy targets. 2017-02-22 20:17:58 +01:00
Hans-Kristian Arntzen
18c37bcdab Update license headers for 2017. 2017-01-28 09:00:40 +01:00
Robert Konrad
c53646a670 Merge branch 'master' of https://github.com/KhronosGroup/SPIRV-Cross into hlsl 2017-01-25 17:03:57 +01:00
Arseny Kapoulkine
ed04c95b08 Implement flattening of row major matrix indexing
To extract a column from row-major matrix, we need to do a strided load one
component at a time. In this case flattened_access_chain_offset still returns
the offset to the first element, but the stride is equal to matrix stride
instead of vector stride.

For this to work, we need to pass matrix stride (and transpose flag) through,
similar to how matrix flattening works.

Additionally slightly clean up recursive flattened_access_chain structure -
specifically, instead of deciding mid-traversal that we need matrix stride
information, we can just pass the matrix stride through - for access chains
that end in matrix/vector this gets us what we need, and for access chains
that end in structs the flattened_access_chain_struct code will recompute
correct stride/transposition data to pass through further.
2017-01-24 07:42:19 -08:00
Robert Konrad
c3268c9410 Do not output layouts for uniforms in HLSL 2017-01-24 09:23:22 +01:00
Robert Konrad
99469f0690 Convert uniform buffer blocks to cbuffers 2017-01-24 09:17:43 +01:00
Robert Konrad
bb763f3984 Fix merge 2017-01-23 14:52:02 +01:00
Robert Konrad
40e5d1e7f7 Format code 2017-01-23 14:49:32 +01:00
Robert Konrad
429b8cb25f Merge branch 'master' of https://github.com/KhronosGroup/SPIRV-Cross into hlsl
# Conflicts:
#	spirv_glsl.hpp
2017-01-23 14:44:41 +01:00
Robert Konrad
ea24ee8145 Do not splat type contructor arguments in HLSL 2017-01-23 14:39:04 +01:00
Hans-Kristian Arntzen
d87249a2eb Remove hack for accessing matrix decorations in flattened structs. 2017-01-22 09:25:01 +01:00
Hans-Kristian Arntzen
87f3c57945 Formatting. 2017-01-21 12:47:26 +01:00
Hans-Kristian Arntzen
9540979c55 Support int and uint as flattened UBO types. 2017-01-21 12:29:20 +01:00
Hans-Kristian Arntzen
7f787f09dc Add flattening support for push constants. 2017-01-21 10:27:14 +01:00
Bill Hollings
2d0d328f61 Run style formatter. 2017-01-20 11:33:59 -05:00
Arseny Kapoulkine
62b27f1d81 Implement access chain flattening support for row major matrices
We currently only support access chains that end in a matrix by propagating
"needs transpose" flag upstream which flips the matrix multiplication order.

It's possible to support indexed extraction as well, however it would have to
generate code like this:

    vec4 row = vec4(UBO[0].y, UBO[1].y, UBO[2].y, UBO[3].y);

for a column equivalent of:

    vec4 row = UBO[1];

It is definitely possible to do so but it requires signaling the vector output
that it needs to switch to per-component extraction which is a bit more trouble
than this is worth for now.
2017-01-17 23:26:23 -08:00
Arseny Kapoulkine
1ec6c1a029 Refactor flattened_access_chain functions
Instead of filling a std::string buffer passed by reference return a new
string. This may be slightly slower in certain cases but they are pretty
rare and this matches the code style better.

Also streamline error handling in different branches and extract function
to generate vector swizzle.
2017-01-17 23:26:22 -08:00
Arseny Kapoulkine
c5a821cdbf Minor emit_buffer_block refactoring
Move buffer block variant dispatch into emit_buffer_block to match
emit_push_constant_block, move SSBO check into emit_buffer_block_legacy.
2017-01-17 23:26:20 -08:00
Arseny Kapoulkine
0185f0a6b8 Implement buffer block flattening
Legacy GLSL targets do not support uniform buffers, and as such require
some sort of emulation. There are two alternatives - one is to represent
a uniform buffer as a uniform struct, and another one is to flatten it
into an array of primitive vector types (vec4).

Uniform struct have two disadvantages that make using them prohibitive
in some applications:

- The location assignment for struct members is arbitrary which means
the application has to set each struct member one by one
- Some Android drivers fail to link shader programs if both vertex and
fragment shader use the same uniform struct

Because of this, we need to support flattening uniform buffers into an
array. This is not just important for legacy GLSL but also is sometimes
useful for ESSL 3.0 where some Android drivers do not have stable UBO
support.

The way flattening works is the entire buffer is represented as a vec4
array; each access chain is rewritten into a combination of array
accesses, swizzles and data type constructors. Specifically:

- Extracting a vector or a scalar requires indexing into the array with
an optional swizzle, for example CB0[13].yz for reading vec2
- Extracting a matrix or a struct requires extracting each individual
vector or struct member and then combining them into the resulting
object
- Extracting arrays is not supported, mostly because the resulting
construct is very inefficient and ESSL 1.0 does not support array
constructors.

Additionally, while we try to constant-fold each individual indexing
operation, there are cases where we have to use dynamic index
computation (specifically for indexing arrays with non-constants); so
the general form of the primitive array extraction expression is:

buffer[stride0*index0+...+strideN*indexN+offset]

Where stride/offset are integer literals and index represents variables.
2017-01-17 23:26:08 -08:00
Hans-Kristian Arntzen
27f4f75513 Run format_all.sh. 2017-01-13 16:32:54 +01:00
Hans-Kristian Arntzen
fadaec205b Improvements to legacy GLSL output.
- By default, emit uniform structs for UBOs, like push constant.
- Forward transpose information,
  and optimize transpose(matrix) * vector to vector * matrix.
2017-01-13 16:31:13 +01:00
Bill Hollings
4e915e8c48 Run style formatter. 2017-01-08 08:52:57 -05:00
Bill Hollings
4a6358bb9f Add clean_func_name() to support overrides to function names. 2017-01-07 22:15:58 -05:00
Bill Hollings
91367799b0 Merge branch 'master' of https://github.com/KhronosGroup/SPIRV-Cross 2017-01-06 14:13:56 -05:00
Hans-Kristian Arntzen
97f7ab865a Fix handling of NoWrite/NoRead decoration for images.
The old workaround for glslang is no longer needed, so only apply workaround
carefully.
2017-01-05 18:16:33 +01:00
Bill Hollings
a2b8a0e5c9 Refactor emit_texture_op() function.
CompilerGLSL add to_function_name() and to_function_args() functions to organize
structure of emit_texture_op() function.
CompilerMSL add support for MSL gather(), gather_compare() and sample_compare() functions.
2016-12-28 18:36:42 -05:00
Hans-Kristian Arntzen
62613df5a5 Optimize for read-modify-writes.
Required for legacy loop increments.
2016-12-16 13:14:22 +01:00
Hans-Kristian Arntzen
4f07a32c29 Begin implementing for loop initializer propagation. 2016-12-15 17:44:47 +01:00
Bill Hollings
1358362075 Fixes to non-native row-major matrix support.
Add support for OpLoad. Throw exception for non-square non-native row-major matrix.
Update variable and function names to clarify purposes.
2016-12-14 02:12:52 -05:00
Bill Hollings
343677e639 Support row-major matrices in access chain when not natively supported by backend (MSL). 2016-12-11 11:01:08 -05:00
Hans-Kristian Arntzen
03a26e593d Fixes for MSL and strip redundant parens in some places. 2016-12-06 23:03:35 +01:00
Hans-Kristian Arntzen
e67f6f85a4 Defer parenthesis generation until needed.
Previously, we would generate parentheses proactively when generating
binary ops, however, this leads to uglier code and hits warnings in
compilers when used as a conditional.
2016-12-05 10:56:54 +01:00
Bill Hollings
c5c073699e CompilerMSL fix func_call_arg() cast error when not passed SPIRVariable type.
CompilerGLSL allow retrieval of partial source if an error occurs.
2016-11-27 12:34:04 -05:00
Hans-Kristian Arntzen
b847c88559 Cleanup, and make cfg analysis optional. 2016-11-18 17:06:49 +01:00
Hans-Kristian Arntzen
dad4a34072 Start adding CFG analysis.
Not complete yet, but partly working ...
2016-11-17 16:58:05 +01:00
Hans-Kristian Arntzen
67aad48e50 Run format.sh. 2016-11-12 10:04:50 +01:00
Bill Hollings
f5f910483b Support MSL-specific functions.
Add CompilerMSL emit_instruction() and emit_glsl_op() functions
to handle MSL-specific operation and function definitions.
Remove CompilerMSL emit_msl_defines() function.
2016-10-27 18:47:17 -04:00
Bill Hollings
943191a1c8 Compliance fixes for pull request.
Use C++ style primitive casts.
Add BackendVariations.discard_literal to support language variation for discard syntax.
Tweaks to custom MSL defines.
2016-10-27 10:20:01 -04:00
Bill Hollings
ac00c6032f Run clang-format. 2016-10-24 09:24:24 -04:00
Bill Hollings
a759e2c872 Merge Brenwill fork with upstream. 2016-10-19 14:09:51 -07:00
Hans-Kristian Arntzen
206cb9157c Handle interpolation qualifiers inside IO blocks. 2016-10-07 16:30:11 +02:00
Hans-Kristian Arntzen
5d4bb687bc Support arrays which have spec constant size.
The size of an array can be a specialization constant or a spec constant
op. This complicates things quite a lot.

Reflection becomes very painful in the presence of expressions instead
of literals so add a new array which expresses this.

It is unlikely that we will need to do accurate reflection of interface
types which have specialization constant size.

SSBOs and UBOs will for now throw exception if a dynamic size is used since it
is very difficult to know the real size.
2016-10-03 17:17:11 +02:00
Hans-Kristian Arntzen
7e8afa872b Implement OpSpecConstantOp.
The details here get quite hairy, and it's not complete as not all
functionality is implemented in glslang yet.
2016-10-03 15:54:02 +02:00
Hans-Kristian Arntzen
081620f811 Emit spec constants directly with Vulkan semantics.
Emit an actual spec constant declaration in Vulkan instead of resolving
the constant.
2016-10-03 12:52:56 +02:00
Lubos Lenco
521586445f Clean up. 2016-09-17 15:56:23 +02:00
Lubos Lenco
80c394160a Legacy GLES extensions. 2016-09-17 14:33:16 +02:00
Hans-Kristian Arntzen
bff273636f Skip arguments if necessary. 2016-09-11 13:05:44 +02:00
Hans-Kristian Arntzen
313cb5f820 Declare shadow arguments. 2016-09-11 12:54:08 +02:00
Bill Hollings
cf476f36d1 Merge MSL with upstream. 2016-08-31 21:00:56 -04:00
Robert Konrad
8e9bf1f7af Implement some common GLSL lib insts in HLSL
Because some are the same and some are not.
2016-08-18 12:40:35 +02:00
Robert Konrad
da5f99bb6d Handle matrix times vector ops correctly in HLSL 2016-08-14 23:54:51 +02:00
Robert Konrad
7693656d68 Change variable names beginning with gl_ in GLSL
Using old-school GLSL as input containing code ala
"gl_FragColor = whatever" resulted in illegal
declarations ala "out vec4 gl_FragColor;".
2016-08-13 00:14:52 +02:00
Bill Hollings
0dfeabc6d2 Merge branch 'master' of https://github.com/KhronosGroup/SPIRV-Cross 2016-08-01 15:38:57 -04:00
Hans-Kristian Arntzen
fc2230ffff Add support for int64/uint64 in GLSL. 2016-07-27 11:31:58 +02:00
Hans-Kristian Arntzen
fa0255c43b Add support for FP64 in GLSL. 2016-07-27 11:31:54 +02:00
Bill Hollings
7c255dde4d Merged with upstream 2016-07-24 22:40:20 -07:00
Hans-Kristian Arntzen
36a0b63f28 Fix various corner cases with expression dependencies.
There was a potential problem if variables were invalidated and SPIR-V
read expressions which depended on other expression which in turn depended on the
invalidated variable.

Also fixes issue where variables were considered immutable if they were
forwardable. This allowed some incorrect optimizations to slip through.
2016-07-12 14:50:23 +02:00
Bill Hollings
b321b83c8f MSL support textures and samplers as function args.
Add automatic sampler func arg when passing SampledImage type.
Pass texture and sampler in thread address space.
2016-07-06 20:30:47 -04:00
Bill Hollings
14f4339b1c Merge upstream.
Add explicit test for uniform var storage class (changed from test of storage class of var type).
2016-07-06 17:10:42 -04:00
Bill Hollings
fe8b8604bc For MSL, extract global var refs from within functions and convert them to function args. 2016-07-06 16:55:45 -04:00
Hans-Kristian Arntzen
078eec5894 Add support for generic remapping of variables. 2016-07-06 11:04:06 +02:00
Hans-Kristian Arntzen
8e63c770da Add explicit support for remapping variables.
Will enable use of extensions like framebuffer fetch, last fragment
depth and so on.
2016-07-06 09:58:01 +02:00
Hans-Kristian Arntzen
168e46fdf9 Use std::array in C++ backend.
Deals better with composite construction in C++
and also fixes a few bugs in GLSL backend with array-of-arrays.
2016-05-28 13:23:51 +02:00
Hans-Kristian Arntzen
5ea59bd11b Non-functional: Update formatting. 2016-05-23 13:30:02 +02:00
Hans-Kristian Arntzen
efaf75e620 Remove unused interface_block_names member. 2016-05-23 13:29:18 +02:00
Hans-Kristian Arntzen
6aa2007cba Deal better with OpName and OpMemberName which alias.
OpName is only for debug information, so we must be very careful that
we do not reuse the same name for different variables.

This was previously done for local variables, but this commit extends
this to global variables as well.
2016-05-23 13:19:41 +02:00
Hans-Kristian Arntzen
78e7615af6 Do not use flexible member arrays in C++.
This is supported as compiler extensions, but we can be standards
compliant here, so use the classic workaround of having a single entry
array at the end of the structs instead.
2016-05-23 09:15:49 +02:00
Hans-Kristian Arntzen
45ad58a903 Implement more correct integer op handling.
In some cases we need to bitcast when dealing with int vs. uint.
SPIR-V allows inputs to be of different integer signedness, so we need
to deal with this somehow.

Add testing system to test SPIR-V assembly.
For now, test all possible combination for all major cases.

 - IAdd (which doesn't care about input type as long as they're equal)
 - SDiv/UDiv operations which case about input type.
 - Arith/Logical right shifts.
 - IEqual to test outputs to bvec, which shouldn't get output cast. Also
   tests casting in function-like calls.
2016-05-13 15:23:33 +02:00
Hans-Kristian Arntzen
dbee4e4346 Add support for Vulkan GLSL as output target.
Mostly useful for debugging SPIR-V where it is useful to see the
"original" Vulkan GLSL constructs which created the SPIR-V.
2016-05-05 10:44:45 +02:00
Hans-Kristian Arntzen
4b8ed53974 Add Clang format.
Reformats the entire codebase. Better to do it now than later.

Adds .clang-format and a convenience script format_all.sh which formats
everything automatically.
2016-05-05 09:40:58 +02:00
Hans-Kristian Arntzen
926916d745 Add -Wshadow.
Fixes lots of dubious variable shadowing.
2016-05-05 09:15:25 +02:00
Bill Hollings
5aafb28cc7 Track sampler ID in Meta for OpSampledImage objects.
Add virtual CompilerGLSL emit_sampled_image_op function for OpSampledImage.
Under MSL, set sampler ID for local OpSampledImage objects and extract it when emitting sampler.
2016-04-23 21:47:41 -04:00
Bill Hollings
6ddd80e3fe Fixes from code review of MSL functionality.
Rename MSLOptions to MSLConfiguration.
Convert tabs to spaces.
Replace Builtin with uint32_t as map key.
2016-04-08 15:12:40 -04:00
Bill Hollings
103aabf5e8 Initial support for Metal Shading Language. 2016-04-06 17:42:27 -04:00
Hans-Kristian Arntzen
147e53aeb2 Rename project to SPIRV-Cross.
Rename to coincide with moving the project to KhronosGroup.
2016-04-04 15:42:30 +02:00