Commit graph

1090 commits

Author SHA1 Message Date
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
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
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
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
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
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
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
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
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
213ac2a328 [qfcc] Use a context object to hold current language
Because the glsl front-end uses Ruamoko to compile its builtins, it
needs to switch languages, and the cleanest way to do so is to use a
context object that gets passed around. This removes not only the
current_language global, but also (as a bonus) any real references to
flex's scanner object (there's still a pointer in rua_ctx_t, but it's no
longer a parameter (which caused some pain in the change)).
2024-12-07 23:55:48 +09:00
Bill Currie
bbc7fcd207 [qfcc] Remove convert_name
It's no longer necessary with the shift to deferred semantics.  The
remaining relevant functionality has been moved to proc_symbol.
2024-12-07 18:35:01 +09:00
Bill Currie
c5d77141eb [qfcc] Defer Ruamoko semantics processing
The main goal was to make it possible to give generic functions
definitions (since the code would be very dependent on the actual
parameter types), but will also allow for inline functions. It also
helped move a lot of the back-end dependent code out of semantics
processing and almost completely (if not completely) out of the parser.
Possibly more importantly, it gets the dags flushing out of the parser,
which means such is now shared by all front-ends.

There's probably a lot of dead code in expr.c now, but that can be taken
care of another time.
2024-12-07 02:38:00 +09:00
Bill Currie
ec436ee65e [qfcc] Put definition for generic functions in genfunc
It is then copied to the metafunc when finding the actual function to
call. Fixes the last definition defining all instances.
2024-12-05 16:08:39 +09:00
Bill Currie
ad45715359 [qfcc] Clean up duplicated vector list construction
I wound up with a few too many copies for my liking.
2024-12-05 11:13:08 +09:00
Bill Currie
c185d2463b [qfcc] Support matrices in spirv output
With a few more fixes, iqm.vert builds nicely.
2024-12-05 00:26:07 +09:00
Bill Currie
5e053fe270 [qfcc] Fix an overflow for matrix values
ex_value_t keeps getting bigger :P
2024-12-05 00:22:38 +09:00
Bill Currie
8e2fe83c27 [qfcc] Add a function for checking type comparisons
It returns true if the comparison is valid without a diagnostic (usually
a warning), false otherwise.
2024-12-05 00:10:15 +09:00
Bill Currie
5714433a9c [qfcc] Clean up some more bools 2024-12-05 00:10:15 +09:00
Bill Currie
d0db75779a [qfcc] Add a check for shifts and expand math ops
I found a need to check for shifts separately (not sure it's the right
approach for that problem, though), and there are a few more math ops
than just +-*/.
2024-11-28 21:16:14 +09:00
Bill Currie
43716e5d6a [qfcc] Use columns for selecting instructions
Now both width and columns must match for an instruction to be selected.
Found a few errors in my opcode specs, and some minor goofs in the type
system (really just overthinking things when I added matrices).
2024-11-26 10:45:20 +09:00
Bill Currie
a4eefa6204 [qfcc] Implement matrix construction for constants
Non-constant matrices are not implemented yet, and it turns out
vector-matrix multiplication produces incorrect vector types (for
vec4*mat3x4)
2024-11-25 12:39:14 +09:00
Bill Currie
1e5d500f8b [qfcc] Implement intrinsic functions in spir-v
Only a tiny handful of glsl functions are implemented (dot, cross,
sqrt), but the system works, both via generics and regular overloads.
2024-11-25 01:39:27 +09:00
Bill Currie
b0207f4dc9 [qfcc] Allow demotion of implicit literals
This fixes the modulo test.
2024-11-24 18:12:51 +09:00
Bill Currie
1893df34a3 [qfcc] Add an intrinsic expression type
This will be fore generating specific SPIR-V instructions via function
calls, and could be useful for Ruamoko, too.
2024-11-22 23:44:37 +09:00
Bill Currie
0dfe81bce8 [qfcc] Move ruamoko attribute parsing out of the parser
Makes for better separation of variable and function attributes.
2024-11-22 14:15:08 +09:00
Bill Currie
c16a8411bc [qfcc] Extend handles to support image types
Images are just handles, but they have additional type data like
dimensionality, array, etc that distinguishes between the image types.
2024-11-21 19:18:13 +09:00
Bill Currie
03c47f8af7 [qfcc] Support (partially) attributes on types
For now, it's just recording that type type has attributes (encoding
begins with %) and resurrecting types_same which is used only when
matching with types with attributes, so there's still a fair bit of work
to do.
2024-11-21 08:30:47 +09:00
Bill Currie
5e605aee36 [qfcc] Clean up some overzealous const correctness
I'm not sure why I made those functions take const type_t *, but they
didn't need it. There's still a relevant fixime in find_handle, but I
haven't decided how to fix that one just yet.
2024-11-21 08:30:47 +09:00
Bill Currie
943cf9659b [qfcc] Make requiring @overload a language feature
Ruamoko still needs @overload (for now), but now glsl does not.
2024-11-18 22:46:14 +09:00
Bill Currie
3dc22d8cd6 [qfcc] Support spir-v vector expressions even better
It turned out I did need direct vector expression support: the previous
commit handled only assignments, not sub-expressions.
2024-11-18 15:47:22 +09:00
Bill Currie
9b2240aaf8 [qfcc] Implement vector expressions for spir-v
And fix a little goof with VectorShuffle (c&p coding bites again).
2024-11-18 14:55:32 +09:00
Bill Currie
28e8697ae6 [qfcc] Implement compound initializers for spir-v
They don't yet support designators, and vectors aren't treated the way I
want, but my little test works correctly.
2024-11-17 22:45:18 +09:00
Bill Currie
91a93d7803 [qfcc] Add type_count() function
It returns the number of elements in a type (so something like `countof`
(hopefully that's what the up-coming C feature will be called) can be
implemented), but it applies to structs, vectors, etc (eg, 9 for mat3).
2024-11-17 16:12:27 +09:00
Bill Currie
d082d39e17 [qfcc] Use count for number of array elements
I got tired of seeing size when count is the real intent (mistake copied
from C++).
2024-11-17 15:27:10 +09:00
Bill Currie
2115e962fe [qfcc] Support typed compound initializers
Explicitly typed compound initializers are what C uses and allows them
to initialized `auto` vars and even pass through `...`. Not tested yet
other than ensuring existing tests didn't break.
2024-11-17 13:17:36 +09:00
Bill Currie
a7f9d96a02 [qfcc] Implement select (if) constructs
And break/continue too, since my test for them required select.
2024-11-16 23:13:46 +09:00
Bill Currie
93d116cf16 [qfcc] Rename body_first to do_while
Since loops are always while or do-while (for loops are just while loops
with an init block), it made more sense in the end.
2024-11-16 23:10:54 +09:00
Bill Currie
3797b1083b [qfcc] Implement loops for spir-v
Mostly, at least: continue and break aren't functional yet, and for
loops haven't been tested, but while and do-while seem to work.
2024-11-16 19:29:41 +09:00
Bill Currie
89dac4a1b8 [qfcc] Create scopes for while and for loops in glsl
I guess that was a mental FIXME for later, but later came sooner. The
declaration doesn't seem to be working properly, but I'll worry about
that later when I can get some automated tests going.
2024-11-16 19:29:41 +09:00
Bill Currie
22794caf11 [qfcc] Support vector value expressions for spir-v
It seems constant initializers are different from constants in an
expression.
2024-11-16 18:54:31 +09:00
Bill Currie
ebb3ec592a [qfcc] Implement bool and lbool types
Since spir-v needs actual bools for its conditional instructions, the
time to do bool properly finally came. As expected, the changes caused
quite a mess, but Ruamoko now does bool/true/false.
2024-11-15 12:36:08 +09:00
Bill Currie
81cc736683 [qfcc] Add is_signed and is_unsigned type check functions
Makes implementing casts for spir-v much easier.
2024-11-15 10:49:07 +09:00
Bill Currie
d6d44b62d9 [qfcc] Use bool for type is_* functions
More clarity often helps.
2024-11-15 10:49:07 +09:00
Bill Currie
dc85a4df4b [qfcc] Specify entry-point interface variables
Yet another step closer to having a working glsl compiler.
2024-11-14 20:58:21 +09:00
Bill Currie
c5613ba1e4 [qfcc] Use tagged references for spir-v storage
The tags might have other uses thus the generic term, but this allows
spir-v variables to be declared with the correct pointer storage
classes. Now spirv-val is complaining about my interfaces, so progress :)
2024-11-14 18:37:38 +09:00
Bill Currie
698430630d [qfcc] Emit spir-v global variables
This required adding a `var` symbol type. For now, it holds just the
storage class, but it might be good for the initializer, too.

Also, clean up some pointer/reference inconsistencies.
2024-11-14 09:04:48 +09:00
Bill Currie
549203d05d [qfcc] Correct a comment 2024-11-13 13:36:46 +09:00