Commit Graph

1031 Commits

Author SHA1 Message Date
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
Polona Caserman
330b366c53 Format code 2017-01-16 17:37:20 +01:00
Polona Caserman
20de679813 Dont iterate over global_variables. Ids are already in global_var_ids 2017-01-16 17:36:31 +01:00
Polona Caserman
f47305c74d Move vector into the class member 2017-01-16 17:35:48 +01:00
Polona Caserman
5d7e126d52 Remove redundant function call 2017-01-16 17:35:14 +01:00
Polona Caserman
be3670ac86 Add break to switch case 2017-01-16 17:35:14 +01:00
Polona Caserman
3e0f52d44c Remove redundant function 2017-01-16 17:35:13 +01:00
Polona Caserman
f647e32659 Add vars declared in the main to the functions 2017-01-16 17:31:20 +01:00
Hans-Kristian Arntzen
41f7e5b6a1 Add ability to have legacy-specific tests. 2017-01-16 09:08:06 +01:00
Robert Konrad
9802823deb Re-add accidentally removed break 2017-01-15 22:42:22 +01:00
Robert Konrad
881725fb36 Remove video code I accidentally put in 2017-01-15 16:48:01 +01:00
Robert Konrad
a778c363e1 Format code 2017-01-15 16:39:03 +01:00
Robert Konrad
fe5de5e03c Merge branch 'original' into metalcat 2017-01-15 16:33:14 +01:00
Polona Caserman
84c3092aba Merge with KhronosGroup/SPIRV-Cross 2017-01-15 16:21:15 +01:00
Polona Caserman
47808ec6f3 Add function global variables 2017-01-15 16:05:15 +01:00
Polona Caserman
5775dcfcc6 Check if a variable has a valid name 2017-01-15 16:05:14 +01:00
Polona Caserman
3b2dab99a6 Check if this arg is an uniform pointer 2017-01-15 16:05:14 +01:00
Polona Caserman
16834e5832 Sort fragment input variables and vertex output variables alphabetical 2017-01-15 16:05:14 +01:00
Polona Caserman
a496a40f98 Adjust clip-space for Metal 2017-01-15 16:05:13 +01:00
Polona Caserman
20d2b59c8d Buffer counter modified 2017-01-15 16:05:13 +01:00
Polona Caserman
742ec49946 Create uniform struct 2017-01-15 16:05:12 +01:00
Polona Caserman
df3e4c3eb3 Check if function name contains _main 2017-01-15 16:05:12 +01:00
Polona Caserman
5de757621c Set function name 2017-01-15 16:05:12 +01:00
Polona Caserman
989563ad3f Add uniform structure 2017-01-15 16:05:11 +01:00
Polona Caserman
bafde4e917 Check if the location of the original variable is set 2017-01-15 16:05:11 +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
Hans-Kristian Arntzen
ce3fe29557 MSVC maintenance. 2017-01-12 10:57:44 +01:00
Hans-Kristian Arntzen
b50513c03a Merge pull request #94 from eoma/fix-locale-independent-float-conversions
Use the classic locale when converting floats to string
2017-01-11 19:17:36 +01:00
Endre Oma
6ad8b307a1 Use the classic locale when converting floats to string 2017-01-11 17:06:06 +01:00
Hans-Kristian Arntzen
4c05b8c3e3 Merge pull request #93 from eoma/fix-glm-swizzle
Switch to GLM_FORCE_SWIZZLE from deprecated GLM_SWIZZLE
2017-01-09 20:53:32 +01:00
Endre Oma
42ca3d9956 Switch to GLM_FORCE_SWIZZLE from deprecated GLM_SWIZZLE 2017-01-09 18:03:54 +01:00
Hans-Kristian Arntzen
81238656ea Merge pull request #91 from brenwill/master
Refactor emit_texture_op() function.
2017-01-08 15:14:56 +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
e6dab816b0 Removed names of unused function parameters. 2017-01-07 15:55:04 -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
c7659507e8 Merge pull request #90 from gwihlidal/master
Improve useability of get_decoration and friends.
2017-01-05 23:07:40 +01:00
Graham Wihlidal
2edc350aa1 Remove whitespace 2017-01-05 21:04:42 +01:00
Graham Wihlidal
bcfe2be332 Coding style fix 2017-01-05 21:02:57 +01:00
Graham Wihlidal
9b1ee8f10a Improve fix for boolean decorations queried in get_decoration, added support to get_member_decoration, and updated comments to reflect the change in behavior. 2017-01-05 21:01:49 +01:00
Graham Wihlidal
acd98ac0d5 Fix typo in comment 2017-01-05 21:00:05 +01:00
Graham Wihlidal
a4818f4391 Explicitly truncate (to keep the fprintf easily portable) 2017-01-05 20:51:14 +01:00
Hans-Kristian Arntzen
0338a5c755 Merge pull request #89 from KhronosGroup/nowrite-noread-fix
Fix handling of NoWrite/NoRead decoration for images.
2017-01-05 20:37:59 +01:00
Graham Wihlidal
862a71b4d3 Fix Compiler::get_decoration to correctly return > 0 if DecorationNonWritable or DecorationNonReadable are specified. 2017-01-05 20:19:59 +01:00