Commit graph

162 commits

Author SHA1 Message Date
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
Lioncash ab507033db common_types: Include types within the Sirit namespace
Avoids dumping types into global scope.
2019-10-06 20:55:15 +00:00
ReinUsesLisp 6e14d37386 Add asserts against nullptr operands 2019-09-11 01:19:53 -03:00
ReinUsesLisp d24685ebd3 Revert "operand: Implement operand hashing and use hashed set for declarations"
This reverts commit 1e665afa36.
2019-09-09 16:48:05 -03:00
ReinUsesLisp 58c5406436 Revert "Fix declarations hashing"
This reverts commit bb6a3421d2.
2019-09-09 16:47:58 -03:00
ReinUsesLisp bb6a3421d2 Fix declarations hashing 2019-09-09 16:46:46 -03:00
ReinUsesLisp ae7c664016 Add OpAny and OpAll 2019-09-09 16:46:36 -03:00
ReinUsesLisp 4a0c6e03e1 Add OpVectorExtractDynamic and OpVectorInsertDynamic 2019-09-09 15:42:47 -03:00
ReinUsesLisp 60a856d266 Relicense to The BSD 3-clause license 2019-07-14 18:50:44 -03:00
ReinUsesLisp 1e665afa36 operand: Implement operand hashing and use hashed set for declarations
Instead of manually searching each element in the declarations vector,
use an unordered_set to emplace new declarations avoiding repetition.
2019-06-08 05:23:15 -03:00
Lioncash f7c4b07a7e stream: Insert supplied string in one operation
Like the other overloads, we can insert the whole string within one
operation instead of doing a byte-by-byte append.

We only do byte-by-byte appending when padding is necessary.
2019-03-16 02:51:35 -03:00
Lioncash 59f795bd6d stream: Change std::string overload for Write to use a std::string_view
Allows various string types to be used with the overload without
constructing a std::string (such as const char* etc).
2019-03-16 02:51:35 -03:00
Lioncash 326c69896b stream: Get rid of undefined behavior
It's undefined behavior to cast down to any other type and dereference
that pointer unless:

1. It's similar (*extremely* vague definition at face value, see below
   for clarification)

2. The casted to type is either the signed/unsigned variant of the
   original type. (e.g. it's fine to cast an int* to an unsigned int*
   and vice-versa).

3. The casted to pointer type is either std::byte*, char*, or unsigned
   char*.

With regards to type similarity, two types (X and Y) are considered
"similar" if:

1. They're the same type (naturally)

2. They're both pointers and the pointed-to types are similar (basically
   1. but for pointers)

3. They're both pointers to members of the same class and the types of
   the pointed-to members are similar in type.

4. They're both arrays of the same size or both arrays of unknown size
   *and* the array element types are similar.

Plus, doing it this way doesn't do a byte-by-byte appending to the
underlying std::vector and instead allocates all the necessary memory up
front and slaps the elements at the end of it.
2019-03-14 21:44:37 -03:00
Lioncash 47d85b81a7 CMakeLists: Apply compilation flags to the sirit target
Previously this wasn't utilizing any of the compiler flags, meaning it
wasn't applying any of the specified warnings.

Since applying the warnings to the target, this uncovered a few warning
cases, such as shadowing class variables on MSVC, etc, which have been fixed.
2019-03-14 19:30:54 -03:00
ReinUsesLisp 1869de6d75 tests: Fix build error 2019-03-14 04:33:54 -03:00
Lioncash f6f5913b5f op: Use std::vector's insert member function within vector variant of Add()
While looping here does work fine, it's mildly inefficient, particularly
if the number of members being added is large, because it can result in
multiple allocations over the period of the insertion, depending on how
much extra memory push_back may allocate for successive elements.

Instead, we can just tell the std::vector that we want to slap the whole
contained sequence at the back of it with insert, which lets it allocate
the whole memory block in one attempt.
2019-03-14 04:31:14 -03:00
Lioncash 6fd44e494c Pass std::string by value where applicable.
By taking the std::string by value in the constructor, this allows for
certain situations where copies can be elided entirely (when moving an
instance into the constructor)

e.g.

std::string var = ...

...

... = LiteralString(std::move(var)) // Or whatever other initialization
                                    // is done.

No copy will be done in this case, the move transfers it into the
constructor, and then the move within the initializer list transfers it
into the member variable.

tl;dr: This allows the calling code to potentially construct less
std::string instances by allowing moving into the parameters themselves.
2019-03-14 04:30:39 -03:00
ReinUsesLisp d5c37d242a
Merge pull request #11 from lioncash/default
operand: Append default to the default constructor
2019-03-14 03:53:31 -03:00
Lioncash 260183a2c7 operand: Append default to the default constructor
Makes it consistent with the destructor.
2019-03-14 02:50:07 -04:00