Commit graph

3733 commits

Author SHA1 Message Date
Bill Currie
c830bb55c3 [qfcc] Use default_type on generic spec
Needed for implied int return types (unsigned etc).
2025-01-13 19:46:35 +09:00
Bill Currie
388a1c6c28 [qfcc] Use names for spir-v intrinsic opcodes
Everything is smashed because the names aren't looked up yet, but
removing magic numbers is almost always a good thing.
2025-01-13 17:54:44 +09:00
Bill Currie
e0e3998efc [qfcc] Semi-implement some glsl layout attributes
They're still just stubs, but the error noise is down.
2025-01-13 17:52:15 +09:00
Bill Currie
b28cd673ae [qfcc] Prefer fixed types over generic
This allows the various vector,vector and vector,scalar to disambiguate.
2025-01-13 17:47:52 +09:00
Bill Currie
027ad12c72 [qfcc] Support add/sub for matrix/vector and scalar operands
GLSL needs it, and it's not entirely unreasonable (though I'll probably
add some flags to control it since it doesn't always make sense).
2025-01-13 12:52:12 +09:00
Bill Currie
320f9e2fe7 [qfcc] Support type.attribute on any type
The goal is to make it easy to get size/coord/base types from image
types without creating a zillion type functions.

It was necessary to make it possible for any type to have an attribute
function (returns an expression so it can be more useful: types are
returned via type expressions). Algebra types were the first victim
(which was nice for testing).
2025-01-13 00:10:27 +09:00
Bill Currie
e9eae1c75f [qfcc] Implement incop for SPIR-V
I think I got it right, but it's hard to tell because my shaders use ++
only for the iterator of loops so the result is thrown away.
2025-01-12 23:29:57 +09:00
Bill Currie
270c57e46e [qfcc] Support assignment into array elements in SPIR-V
Just a missed detection of needing to use access chains.
2025-01-12 23:29:57 +09:00
Bill Currie
42fc1323e1 [qfcc] Clean up glsl for loops
The changes for deferred semantics in Ruamoko broke for loops for GLSL,
but matching GLSL's structure to Ruamoko's cleaned things up nicely.
2025-01-12 23:29:57 +09:00
Bill Currie
7baf93c8df [qfcc] Make short-circuit boolean logic language dependent
And disable it for GLSL. I might need to make it target-dependent
instead as I don't know if I'll be able to implement it in SPIR-V, and
when I get to the C back-end, it will be superfluous.
2025-01-12 23:29:56 +09:00
Bill Currie
03bbfde5f1 [qfcc] Get some more texture functions implemented
GLSL's texture functions are a bit of a nightmare. The return types are
wrong, but I need to decide how I want to pull the sample type from a
texture or sampler.
2025-01-10 01:00:00 +09:00
Bill Currie
09bd49814e [qfcc] Correct spirv right shift types
Spir-v is pretty slack with the exact types of the operants to the
right-shift instructions so no need to care about the type for shift so
long as it has the correct number of components.
2025-01-10 00:58:26 +09:00
Bill Currie
6e004e9baa [qfcc] Implement generic type computation
I had already implemented the code generation side (though using type
ids instead of encodings is a nice change), but I hadn't implemented the
actual evaluation or even called it. Now return types can be computed
from generic parameters (eg, ivecN from vecN).
2025-01-10 00:56:02 +09:00
Bill Currie
76fcc2f1a9 [qfcc] Support nil expressions in spir-v 2025-01-09 17:49:20 +09:00
Bill Currie
1d0135be52 [qfcc] Support nil in matrix construction
While not used by glsl, ruamoko will and qfcc does internally.
2025-01-09 17:48:39 +09:00
Bill Currie
d1364e460c [qfcc] Update some TODO entries
Mostly marking stuff as done, and adding a note to the optional params
item.
2025-01-09 17:32:07 +09:00
Bill Currie
a93c109988 [qfcc] Improve spir-v entry point handling
It's still not great (mostly on the language side, I think), but
different glsl shader types get the correct model and fragment shaders
even get the correct mode.
2025-01-09 17:29:27 +09:00
Bill Currie
4998968169 [qfcc] Emit spirv image type encodings
Access qualifiers aren't supported yet, and some of the image handling
is a bit messy (currently tied to glsl when it should be general), but
the basics are there. However, now I've got to sort out the execution
model (need Fragment or GLCompute for ImplicitLod).
2025-01-09 01:29:38 +09:00
Bill Currie
99b1859aac [qfcc] Parse the spirv grammar json files
I really don't like the way they're included (I'm really looking forward
to #embed, but gotta wait for gcc 15), and I'm a tad grumpy that the
documentation for them
(https://registry.khronos.org/SPIR-V/specs/unified1/MachineReadableGrammar.html)
is wrong (missing fields), but I think I like the result.

The grammars (core and glsl.std.450) are parsed into structs that should
be fairly easy to interpret: the instructions, kinds, and enumerant
values are sorted by name for search with bsearch. Having the data
parsed in means source code can refer to the items by name rather than
magic numbers, which will be very nice for intrinsics and image types
(and probably a few other things).
2025-01-07 03:26:12 +09:00
Bill Currie
400486931f [qfcc] Allow languages to hook number parsing
The idea is to allow certain contexts to interpret something like `2D`
as an identifier instead of 2.0 (double), or (not sure I'll go there,
5e12 as a bivector instead of a double or float.
2025-01-04 12:51:30 +09:00
Bill Currie
9aea4d4b61 [qfcc] Update glsl function declaration handling
Finally back to where I was before discovering that arrays with computed
counts didn't work.
2025-01-03 21:58:33 +09:00
Bill Currie
ea3198e8fe [qfcc] Update generic handling for the new type scheme
And clean up some redundant (premature!) spec processing.
2025-01-03 21:27:28 +09:00
Bill Currie
ae4c107384 [qfcc] Add type_process for type functions
I'm not quite sure it's what I need, but it does help with resolving
types with complex expressions (eg, `@vector(bool,@width(vec))`).
2025-01-03 17:55:08 +09:00
Bill Currie
bec8b290d2 [qfcc] Resurrect is_function
In the end, it does simplify things a lot, though it helped get function
pointers working at least a bit (they're not quite the same as C yet,
but I think that's mostly that functions can be struct fields).
2025-01-03 17:52:19 +09:00
Bill Currie
99632ddb03 [qfcc] Rework function/pointer/array declarations
They should now work in generic contexts, but the pressing need to work
on arrays was due to constant expressions for element counts breaking.
As a side effect, function pointers are now a thing (and seem to work
like they do in C)
2025-01-03 13:22:29 +09:00
Bill Currie
fd836e74e1 [qfcc] Check implicit is the same for dagged values
Not doing so results in subtle bugs such as implicit constants becoming
explicit behind the programmer's back.
2025-01-03 13:22:29 +09:00
Bill Currie
6af7ff2867 [qfcc] Ensure processed expressions are dagged
GA expressions need to be optimized so things that should cancel out do,
and this requires everything to be dagged. Doing so in expr_process gets
most of the expressions, and then a few stragglers in proc_field. There
might still be some more, but my test scene compiles again.
2025-01-03 02:34:15 +09:00
Bill Currie
34fe4efc9d Revert "[qfcc] Don't fold constants for algebra"
This reverts commit e87e01e4f2.

In the end, this wasn't necessary, and it causes problems in itself.
2025-01-03 01:03:28 +09:00
Bill Currie
6b38fdca35 [qfcc] Remove unwanted spec symbol assignments
I suspect they were once for dealing with class and typedef names in
selectors, but they're confusing things now that I'm trying to rework
type declarations, and I doubt they were ever actually needed.
2025-01-02 14:24:55 +09:00
Bill Currie
0ea47193f2 [qfcc] Support sizeof expressions in dot output 2025-01-02 11:18:38 +09:00
Bill Currie
625c53180f [qfcc] Propagate rua_ctx_t to more functions
It will eventually get to most places, but this set is necessary for
using expr_process in expr_type.c
2024-12-23 22:03:47 +09:00
Bill Currie
4bdc27b0cd [qfcc] Support struct/enum/handle in type_ref
Forward declarations in generic type refs might have surprising effects
(though they seem to work anyway), but at least they won't cause parse
errors.
2024-12-23 21:44:07 +09:00
Bill Currie
85e6df9374 [qfcc] Clean up some use of default_type
And use typename for handles (still only int/long but better than a
parse error).
2024-12-23 14:59:02 +09:00
Bill Currie
79411aabc4 [qfcc] Rework token pasting
Now it seems to actually work. I don't know if it's compliant with the
spec, but I do at least get expected results, even for some error
conditions.
2024-12-23 14:59:02 +09:00
Bill Currie
15ddd8fea9 [qfcc] Do a better check for recursive macro invocations
Simply checking if the macro's next pointer was set wasn't enough for
when the macro was at the end of the chain (or the only macro in the
chain).
2024-12-23 14:59:02 +09:00
Bill Currie
a57ea628ca [qfcc] Handle swizzle expressions when processing
I suspect this is actually a bug in parameter setup for inline function
calls, but it would certainly be a bug to get an unprocessed swizzle
expression as they're generated from field expressions.
2024-12-13 15:10:00 +09:00
Bill Currie
0337a7cd80 [qfcc] Handle integral aliases in spir-v
Needed for array indexing using unsigned indices.
2024-12-13 15:02:22 +09:00
Bill Currie
74637fffbc [qfcc] Implement the actual return from inline
It's just a jump to a label at the end of the block, but it's enough for
now as it takes care of the assumption that the return is the last
expression in the inlined function.
2024-12-12 11:19:24 +09:00
Bill Currie
626680f22f [qfcc] Handle return in inline functions
The code is pretty lousy in that it assumes there's only one `return`
and it's the end of the function, and the generated code is even worse
(too many load/store ops in the spir-v), but it looks like it at least
works. It does pass validation.
2024-12-12 11:08:30 +09:00
Bill Currie
21eed88da5 [qfcc] Allow initializers in param symtabs for spir-v
This gets the incoming parameters initialized, though currently rather
suboptimally (but that's due to the setup of the call). Next, just need
to handle `return` in inline functions.
2024-12-12 00:39:09 +09:00
Bill Currie
ae0cfe47cc [qfcc] Dereference constructor parameters
Sometimes, premature optimization can help, but whatever. Finally,
alias.vert compiles, but the output is fairly broken (incorrect handling
of `return` and the parameters aren't initialized).
2024-12-11 23:22:28 +09:00
Bill Currie
3eef231d70 [qfcc] Give anonymous block instances a name
They need a valid name for the stricter checks. The name is taken from
the interface name, and since that needs to be unique, prepending a `.`
should be enough.
2024-12-11 23:22:05 +09:00
Bill Currie
14ac685330 [qfcc] Initialize parameters with their arguments
However, once past a couple of errors, they're not getting initialized
in the spir-v, so I've probably missed something there. For now I've
kept things simple and made them regular variables regardless of
qualifiers (and no support for out/inout yet).
2024-12-11 23:16:57 +09:00
Bill Currie
5380c2b04c [qfcc] Process block result even when independent
If the block's result is just a variable reference, it won't match any
expression in the block's list so it needs to be processed independently
in such cases. The `mix(genFType x, genFType y, float a)` inline now
gets as far as spir-v code gen although there are still many issues to
fix (parameter symbols, `return` handling, etc).
2024-12-11 18:24:23 +09:00
Bill Currie
5b13bcf11c [qfcc] Report undefined symbols in proc_symbol
This required always recording the unmangled function symbol, but helps
with error checks in the long run.
2024-12-11 16:31:24 +09:00
Bill Currie
fc519054f2 [qfcc] Check for errors in call processing
Wasn't nice getting segfaults in the constructor code due to simple
errors.
2024-12-11 16:07:43 +09:00
Bill Currie
a0f09b13cf [qfcc] Set current function for inlined functions
It improves error reporting and is even a solution for what to do with
return statements in inline functions.
2024-12-11 16:05:50 +09:00
Bill Currie
36c0b45bab [qfcc] Add an @construct type function
I decided to not mess with actual casts. In retrospect, this is probably
for the best as it avoids any bit-cast conflicts, but should allow for
block initializers with a few tweaks. `@construct (type, args...)` in
Ruamoko follows the same path as `type(args...)` in glsl.
2024-12-11 13:54:11 +09:00
Bill Currie
6840a208b9 [qfcc] Implement inline function calls
They're buggy in that the defspaces for parameters and locals are
incorrect (they need to point to the calling scope's space). Also,
parameters are not yet hooked up correctly. However, errors (because I
need to allow casts from scalars to vectors) do get handled.
2024-12-11 03:16:15 +09:00
Bill Currie
36cf1f948e [qfcc] Add bypass scopes
Because the symbol tables for generic functions are ephemeral (as such),
they need to be easily removed from the scope chain, it's easiest if
definitions are never added to them (instead, they get added to the
parent symbol table). This keeps handling of function declarations or
definitions and their parameter scopes simple as the function gets put
in the global scope still, and the parameter scope simply gets
reconnected to the global scope (really, the generic scope's parent)
when the parameter scope is popped within a generic scope.
2024-12-11 03:06:50 +09:00