Commit Graph

336 Commits

Author SHA1 Message Date
Bill Hollings
14a52e0ee0 Merge branch 'master' of https://github.com/KhronosGroup/SPIRV-Cross 2017-01-26 13:54:37 -08:00
Hans-Kristian Arntzen
20f149a9aa Merge pull request #110 from zeux/metal-validate
Validate Metal shaders on OSX with Metal compiler
2017-01-26 07:33:55 +01:00
Bill Hollings
948a24a049 Update spirv_msl copyright dates. 2017-01-25 19:33:32 -08:00
Arseny Kapoulkine
49baf41990 Print Metal compiler version before running Metal tests
This helps pinpoint the issues due to differences in the Metal compiler
version and also indicates whether we are actually using the compiler to
validate MSL output.
2017-01-25 00:12:09 -08:00
Arseny Kapoulkine
f45075b08b Validate Metal shaders on OSX with Metal compiler
If we run on a system with Xcode installed to a default path, run Xcode
Metal shader compiler to validate the generated MSL shader.

This uncovers an issue in the existing MSL test - MSL backend currently
does not auto-assign attribute locations, which means that translating
GLSL shader without location layout produces an invalid MSL which
generates "error: 'attribute' index '0' is used more than once".
2017-01-25 00:12:09 -08:00
Bill Hollings
e3dac18633 Merge branch 'master' of https://github.com/KhronosGroup/SPIRV-Cross 2017-01-24 13:58:22 -08:00
Hans-Kristian Arntzen
7daba19223 Merge pull request #108 from zeux/flatten-row-major-matrix-index
Implement flattening of row major matrix indexing
2017-01-24 18:47:00 +01:00
Arseny Kapoulkine
32a561a6c3 Remove redundant constructor calls for scalar types 2017-01-24 08:09:58 -08: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
Hans-Kristian Arntzen
11df227adf Merge pull request #100 from KhronosGroup/metal-testing
Add basic setup for regression testing Metal output.
2017-01-24 14:52:02 +01:00
Hans-Kristian Arntzen
1c28ec6885 Add basic setup for regression testing Metal output. 2017-01-24 14:04:55 +01:00
Hans-Kristian Arntzen
3535f88bc1 Merge pull request #104 from KhronosGroup/flatten-improvements
Legacy UBO flattening improvements
2017-01-23 09:12:20 +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
fe12fff324 Comment type ID a bit better. 2017-01-22 09:06:15 +01:00
Hans-Kristian Arntzen
efba610718 Cleanup emit_buffer_block_flattened. 2017-01-22 08:53:52 +01:00
Hans-Kristian Arntzen
8a80e62fb4 Make get_buffer_block_flags clearer.
Fix empty struct case.
2017-01-22 08:51:24 +01:00
Hans-Kristian Arntzen
a35073ad78 Add test for flattened 3-dimensional arrays. 2017-01-22 08:49:11 +01:00
Hans-Kristian Arntzen
3eb2e52c4e Fix bugs with row-major matrices inside flattened UBOs. 2017-01-21 13:50:01 +01:00
Hans-Kristian Arntzen
d93dc38415 Use correct glslang revision for reference output ... 2017-01-21 12:53:17 +01:00
Hans-Kristian Arntzen
87f3c57945 Formatting. 2017-01-21 12:47:26 +01:00
Hans-Kristian Arntzen
d1dcced1cb Fixups to the flatten tests. 2017-01-21 12:39:16 +01:00
Hans-Kristian Arntzen
69af27d8be Expand array flatten test a little. 2017-01-21 12:35:57 +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
d3cad99347 Cleanups for flattened access chains. 2017-01-21 11:30:33 +01:00
Hans-Kristian Arntzen
7f787f09dc Add flattening support for push constants. 2017-01-21 10:27:14 +01:00
Hans-Kristian Arntzen
016b1d86e9 Emit readonly, writeonly for SSBOs. 2017-01-21 10:08:27 +01:00
Bill Hollings
ef1f860c01 CompilerMSL support OpImageFetch and Metal read() function.
Don't emit automatic sampler when using texture read().
Convert tex coords to uintN() when using texture read().
Emit face when read()ing cube textures.
2017-01-20 17:30:36 -05:00
Hans-Kristian Arntzen
2c7359d1d3 Merge pull request #103 from brenwill/master
Remove emission of function prototypes in MSL.
2017-01-20 20:39:22 +01:00
Bill Hollings
2d0d328f61 Run style formatter. 2017-01-20 11:33:59 -05:00
Bill Hollings
339881468c Merge branch 'master' of https://github.com/KhronosGroup/SPIRV-Cross 2017-01-20 11:27:05 -05:00
Bill Hollings
4c198bbce9 Remove emission of function prototypes in MSL.
Do not emit function prototypes. If secondary functions are used,
suppress compiler -Wmissing-prototypes warnings.
Refactor Compiler::emit_function_prototype() functions to simplify.
Rename Compiler_msl::CustomFunctionHandler to OpCodePreprocessor, and
Compiler_msl::register_custom_functions() to preprocess_op_codes()
to perform more generic preprocessing.
Add space between dynamic header lines and fixed header lines.
2017-01-20 11:24:44 -05:00
Hans-Kristian Arntzen
7b9036f402 Fix small oversight in last PR. 2017-01-20 12:06:05 +01:00
Hans-Kristian Arntzen
0a6e0a7b19 Merge pull request #102 from Kangz/msl_writable-ssbo
spirv_msl: Put writable SSBOs in the 'device' address space
2017-01-20 09:22:45 +01:00
Corentin Wallez
b61235ae9f spirv_msl: Put writable SSBOs in the 'device' address space 2017-01-19 10:37:15 -05:00
Hans-Kristian Arntzen
f2d56a4600 Merge pull request #101 from Kangz/fix-cpp11
Fix compilation on some old C++11 standard libraries.
2017-01-19 08:03:23 +01:00
Corentin Wallez
e88c88c310 Fix compilation on some old C++11 standard libraries. 2017-01-18 17:22:54 -05:00
Hans-Kristian Arntzen
250ae11f74 Merge pull request #82 from zeux/flatten-buffer-block
Implement buffer block flattening
2017-01-18 18:48:13 +01: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
64c17b59e5 Fix whitespace in generated flattened expressions
Add whitespace after comma and around arithmetic operators.
2017-01-17 23:26:19 -08:00
Arseny Kapoulkine
24c66250c7 Add tests for buffer block flattening 2017-01-17 23:26:18 -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
6198e37f3f Merge pull request #96 from KhronosGroup/transpose-improvement
Legacy GLSL improvements
2017-01-17 20:06:27 +01:00
Hans-Kristian Arntzen
7fe07f9692 Merge pull request #98 from zeux/fix-get-declared-struct-member-size
Fix get_declared_struct_member_size for struct members
2017-01-17 15:05:13 +01:00
Arseny Kapoulkine
f63e7c5c98 Fix get_declared_struct_member_size for struct members
When a member of a struct is a struct, get_declared_struct_member_size
instead returned the size of the entire outer struct because it added
the offset of the last field to the size of the last field.

Restructure the function so that it handles all arrays in the same way
(by using array stride) and for the rest reuses get_declared_struct_size
if possible - this simplifies the function and fixes the issue.
2017-01-17 01:52:12 -08:00
Hans-Kristian Arntzen
41f7e5b6a1 Add ability to have legacy-specific tests. 2017-01-16 09:08:06 +01: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
Hans-Kristian Arntzen
a3bac9e4ce Merge pull request #95 from KhronosGroup/msvc-maintenance
MSVC maintenance.
2017-01-12 12:23:05 +01:00