Commit graph

3723 commits

Author SHA1 Message Date
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
Bill Currie
c8158f9ebe [qfcc] Support type expressions in default_type
Needed for using type expressions in casts (eg in generic functions).
2024-12-11 02:46:47 +09:00
Bill Currie
b2049f496b [qfcc] Save caller to new_symbol* in symbol_t
I should go through and do this for all the structs (not looking forward
to expr_t) as it's sometimes quite handy to know who created something.
2024-12-11 02:41:13 +09:00
Bill Currie
306306fc5a [qfcc] Move semantic processing into build_code_function
In the end, I could have done the null context check for pascal, but I
think the xvalue support will come in handy for implementing inline
functions.
2024-12-08 20:01:06 +09:00
Bill Currie
7379b1226d [qfcc] Check for procedures properly in return value
I guess either I goofed and thought void functions had no return type at
all, or at one stage that was the case, but either way, I had never
tested procedures.
2024-12-08 19:17:24 +09:00
Bill Currie
35c0b84ccc [qfcc] Ensure pascal functions always have a block
I had never tested empty functions, so I hadn't noticed they cause a
segfault.
2024-12-08 19:16:29 +09:00
Bill Currie
4a8c53aa6f [qfcc] Add partial support for renamed builtins
The back-end support for renamed builtins (fte's = #0:name) was needed
for pascal functions because the internal name is now prefixed with an @
to allow the lvalue/rvalue selection of behavior for function symbols
2024-12-08 19:13:49 +09:00
Bill Currie
27c3ee4c39 [qfcc] Use deferred semantics for quake pascal
This catches qp up with qc and glsl, which means I can modify all three
languages to support inline functions at the same time. There is the
minor(?) problem of attempting to pass parameters to a
function/procedure that takes none producing the wrong error, but that's
documented in the parser.
2024-12-08 19:12:04 +09:00
Bill Currie
38c64c61b9 [qfcc] Make new_call_expr non-const
I really don't remember why I made it const. Although there are still
others, new_* exression calls are meant to be mutable.
2024-12-08 19:03:41 +09:00
Bill Currie
1e19335b44 [qfcc] Add xvalue expressions and symbols
xvalue symbols refer to two expressions: an lvalue and an rvalue. They
are meant to be used with xvalue expressions.

xvalue expressions are useful when a distinction must be made between
the behavior of something (eg, a pascal function symbol) must change
depending on whether it's an lvalue (assignment of the function's return
value) or an rvalue (a call to the function, especially when the
function takes no parameters).
2024-12-08 18:59:40 +09:00
Bill Currie
ed984e6eae [qfcc] Use raw symbols for field names
Rather than new_name_expr (which messes with the symbol table): field
names just don't need lookup in general, especially for known
structs/vectors.
2024-12-08 00:03:12 +09:00