Commit Graph

180 Commits

Author SHA1 Message Date
ReinUsesLisp
da093a04fe Add OpEmitStreamVertex and OpEndStreamPrimitive 2021-04-12 03:55:25 -03:00
ReinUsesLisp
dc47faf89f Use std::nullopt when possible 2021-04-11 02:04:17 -03:00
ReinUsesLisp
51d541f1a1 Remove forward references and add phi node patching
The previous API for forward declarations broke when more than one
definition was done. Forward references on instructions that are not
labels were only needed for phi nodes, so it has been replaced with a
deferred phi node instruction and a method to patch these after
everything has been defined.
2021-04-11 02:02:43 -03:00
ReinUsesLisp
f1cccfd0f3 Add OpUnreachable 2021-03-29 16:10:15 -03:00
ReinUsesLisp
84fab90024 Add OpFunctionParameter 2021-03-28 18:52:32 -03:00
ReinUsesLisp
0ef6e807ab Add DemoteToHelperInvocation support 2021-03-19 18:46:11 -03:00
ReinUsesLisp
4b1ff612c4 Add support for sparse texture instructions 2021-03-08 18:31:00 -03:00
ReinUsesLisp
f6a7130486 Add support for self-referencing phi nodes 2021-02-24 18:30:10 -03:00
ReinUsesLisp
9a08dab7ee Update SPIRV-Headers 2021-02-20 03:22:09 -03:00
ReinUsesLisp
20d75babd0 Assert when an OpId has an invalid result type 2021-02-19 15:42:25 -03:00
ReinUsesLisp
200310e8fa Assert operand's id is not zero 2021-02-15 23:00:12 -03:00
ReinUsesLisp
f819ade0ef Add support for forward declarations 2021-02-14 22:45:31 -03:00
ReinUsesLisp
c374bfd9fd Add Phi support 2021-02-12 21:08:46 -03:00
ReinUsesLisp
1f7b70730d Fix global variables being added in code 2021-02-07 23:52:40 -03:00
ReinUsesLisp
cae2725cc0 Add overload for decorating with enums
Skip an explicit cast on the caller, allowing code like:
Decorate(some_op, spv::Decoration::BuiltIn, spv::BuiltIn::WorkgroupId)
2021-02-07 23:52:40 -03:00
comex
ab567491e1 Add support for OpGroupNonUniform{All,Any,AllEqual,Ballot}, and fix OpGroupNonUniformShuffleXor.
These Vulkan 1.1 operations can be used in place of
`OpSubgroup{All,Any,AllEqual,Ballot}KHR`, among other things.

For `OpGroupNonUniformShuffleXor`, which was already implemented, turns
out the scope argument needs to be encoded not as an immediate, but as
an id that points to a constant integer.
2020-11-26 17:20:01 -03:00
comex
c095705f59 Change count to string_words
Co-authored-by: Rodrigo Locatti <reinuseslisp@airmail.cc>
2020-11-26 17:18:44 -03:00
comex
63c5b548c5 Fix OpExtension.
There were two issues:
- The word0 was omitted entirely.
- The word count didn't account for the nul terminator.
2020-11-26 17:18:44 -03:00
comex
13396c96ac Use requires clauses to better disambiguate variadic and non-variadic overloads
Suppose you try to call, say, `AddEntryPoint` with a `std::vector<Id>`
as the `interfaces` argument - something that yuzu does.  This can match
the non-variadic overload, since `std::vector<Id>` is implicitly
convertible to the argument type `std::span<const Id>`.  But it can also
match the variadic overload, and the compiler sees that as a 'better'
match because it doesn't require implicit conversion.  So it picks that
overload and promptly errors out trying to convert `std::vector<Id>` to
`Id`.

To make the compiler pick the right overload, you would have to
explicitly convert to `std::span<const Id>`, which is annoyingly
verbose.

To avoid this, add `requires` clauses to all variadic convenience
overloads, requiring each of the variadic arguments to be convertible to
the corresponding element type.  If you pass a vector/array/etc., this
rules out the variadic overload as a candidate, and the call goes
through with the non-variadic overload.

Also, use slightly different code to forward to the non-variadic
overloads, that works even if the arguments need to be converted.

Note: I used this in a WIP branch updating yuzu to the latest version of
sirit.

Note 2: I tried to run clang-format on this, but it mangled the requires
clauses pretty horribly, so I didn't accept its changes.  I googled it,
and apparently clang-format doesn't properly support concepts yet...
2020-11-25 20:02:04 -03:00
comex
393fccea5b Fix Reserve count for trinary ops. 2020-11-25 19:44:32 -03:00
ReinUsesLisp
634428758b Fix build errors on gcc 2020-08-10 04:55:04 -03:00
ReinUsesLisp
0b9ee36247 Stream SPIR-V instructions directly to a binary
Before this commit sirit generated a stream of tokens that would then be
inserted to the final SPIR-V binary. This design was carried from the
initial design of manually inserting opcodes into the code. Now that
all instructions but labels are inserted when their respective function
is called, the old design can be dropped in favor of generating a valid
stream of SPIR-V opcodes.

The API for variables is broken, but adopting the new one is trivial.
Instead of calling OpVariable and then adding a global or local
variable, OpVariable was removed and global or local variables are
generated when they are called.

Avoiding duplicates is now done with an std::unordered_set instead of
using a linear search jumping through vtables.
2020-08-01 01:50:01 -03:00
ReinUsesLisp
c4ea8f4b76 Upgrade to C++20 and use std::span 2020-07-29 05:46:50 -03:00
ReinUsesLisp
eefca56afd memory: Add OpImageTexelPointer 2020-06-02 02:13:37 -03:00
ReinUsesLisp
a62c5bbc10 barrier: Add OpControlBarrier 2020-05-15 02:54:06 -03:00
ReinUsesLisp
414fc4dbd2 arithmetic: Add IAddCarry 2020-04-25 21:54:10 -03:00
ReinUsesLisp
a712959f1e atomic: Fix typo 2020-01-19 16:39:42 -03:00
ReinUsesLisp
15bacd3b1b atomic: Add memory atomic instructions 2020-01-19 16:36:33 -03:00
ReinUsesLisp
9f4d057aa2 image: Remove assumed lod in image samples
This commits breaks the API. Depth image samples assumed a lod operand,
this made using Grad samples clumsy to use.
2019-12-15 18:23:59 -03:00
ReinUsesLisp
88d37bedf0 op: Silence -Wshadow warning 2019-12-11 23:58:06 -03:00
ReinUsesLisp
38e0d00cde op: Fix implicit conversion from char* to bool warning 2019-12-11 23:57:46 -03:00
ReinUsesLisp
12f40a8032 Add OpMemoryBarrier 2019-12-09 21:44:36 -03:00
ReinUsesLisp
e1a6729df7 Enable -Wshadow and silence warnings 2019-11-27 05:46:03 -03:00
ReinUsesLisp
22cc6f6c1b cmake: Always treat warnings as errors
Enable cast warnings in gcc and clang and always treat warnings as
errors.

GetWordCount now returns std::size_t for simplicity and the word count
is asserted and casted in WordCount (now called CalculateTotalWords.

Silence warnings.
2019-11-27 05:25:35 -03:00
ReinUsesLisp
71b53b855a Add OpSubgroupBallotKHR and vote instructions 2019-11-10 21:15:45 -03:00
ReinUsesLisp
688d6d9799 Add OpSubgroupReadInvocationKHR 2019-11-03 00:32:35 -03:00
ReinUsesLisp
9b897c3541 Add OpGroupNonUniformShuffleXor 2019-11-02 19:39:41 -03:00
ReinUsesLisp
3067893923 Add EmitVertex and EndPrimitive 2019-11-01 17:28:32 -03:00
ReinUsesLisp
b4eeadfd9b operand: Use pure virtual functions 2019-11-01 06:07:53 -03:00
ReinUsesLisp
4c2981eab5 operand: Move operand_type initialization to constructor 2019-11-01 05:52:49 -03:00
ReinUsesLisp
53d572ae7d Drop usage of dynamic_cast in favour of static_cast 2019-11-01 05:44:27 -03:00
ReinUsesLisp
cff0a41416 literal_number: Drop usage of RTTI 2019-11-01 05:41:58 -03:00
ReinUsesLisp
de91660f3c op: Replace owning star pointers with unique_ptr 2019-11-01 05:33:53 -03:00
ReinUsesLisp
ef47087d88 literal_number: Use static_cast instead of dynamic_cast 2019-11-01 05:12:54 -03:00
ReinUsesLisp
6967a2c124 Fix typos in README.md 2019-10-24 03:25:42 -03:00
ReinUsesLisp
f254b6a394 tests/main: Test assembled binary
Previously the test couldn't fail unless it crashed. Now that sirit does
not do work "behind the scenes" that can change between versions (like
declaring capabilities), we can have this checking.
2019-10-24 03:20:05 -03:00
ReinUsesLisp
a1972e35f1 instructions/logical: Silence -Wpedantic 2019-10-24 03:08:42 -03:00
ReinUsesLisp
a7d5a91a96 Update README.md 2019-10-24 03:02:34 -03:00
ReinUsesLisp
42248408a9 Remove Emit entry in favor of auto-emitting code
All instructions but OpVariable and OpLabel are automatically emitted.
These functions have to call AddLocalVariable/AddGlobalVariable or
AddLabel respectively.
2019-10-18 04:27:52 -03:00
ReinUsesLisp
8cf3d225db Assemble uint32_t instead of uint8_t
Vulkan receives SPIR-V modules with a uint32_t alignment. Returning
uint8_t forced users to invoke undefined behaviour (reinterpret_cast)
or copy.
2019-10-18 03:46:47 -03:00