Commit graph

68 commits

Author SHA1 Message Date
Bill Currie
02bf7dbc03 [qfcc] Correct an error message
Why is it I always find these things when posting them in discord?
2025-02-18 12:53:16 +09:00
Bill Currie
6af960cef2 [qfcc] Implement discard
I had no idea how to do it back when I started working on the glsl
parser, but intrinsics made it very easy. It's just OpKill for now (and
might stay that way for glsl).
2025-02-17 20:58:45 +09:00
Bill Currie
bc00bd0a0c [qfcc] Clean up image type creation
While images are handles, they're not user-handles thus don't exist in
that name-space. slice.vert now compiles, but it looks like I have some
problems with sampled images/textures (sampler2D etc).
2025-02-15 19:41:02 +09:00
Bill Currie
1c20316c9a [qfcc] Make image handles independent of glsl
It has come time to get image handle type creation into Ruamoko. This
commit only gets the functions and types independent of glsl, @image (my
plan for dealing with the handles) isn't implemented yet.
2025-02-11 16:01:59 +09:00
Bill Currie
ad51881a60 [qfcc] Implement the image format layout qualifier
It doesn't really work yet for multiple reasons (eg, not an exact match
with the spir-v names, and the type system itself being a little
inadequate), but gotta start somewhere.
2025-02-11 14:56:32 +09:00
Bill Currie
8ca018f062 [qfcc] Ensure geometry shader invocations is set
It must always be at least 1, but specifying it in glsl is optional.

And now geometry shaders work :)
2025-02-05 10:26:21 +09:00
Bill Currie
0f34e69aeb [qfcc] Use a builtin layout for glsl builtin vars
It both seems to be a bit of a hack (since it probably doesn't conform
with the GLSL spec, but I've given up on worrying too much about that),
and the most sensible thing to do.
2025-01-24 14:48:51 +09:00
Bill Currie
f4cbe3f220 [qfcc] Ensure compute shaders set all local_size elements
The default value is 1, and the assumption in target_spirv is that if
the first one is set, all are set, but the source code doesn't need to
set any explicitly.
2025-01-21 12:14:06 +09:00
Bill Currie
105edc5126 [qfcc] Don't allow overloading of main for glsl
It's supposed to always be void(void), so...
2025-01-20 22:10:27 +09:00
Bill Currie
8e5fd85c0f [qfcc] Default fp constants to float for glsl
And support `lf` for double constants (always: I don't see the harm
other than minor confusion with C, but Ruamoko isn't C).
2025-01-16 18:02:44 +09:00
Bill Currie
e0e168620f [qfcc] Rename type attributes to properties
I had a feeling that attribute was wrong at the time, then I got
reminded of properties.
2025-01-16 17:31:04 +09:00
Bill Currie
1a1bbfd03a [qfcc] Detect interface blocks
This gets the `offset` layout working for block members.
2025-01-16 17:17:13 +09:00
Bill Currie
2aadb23a35 [qfcc] Move image attribute stuff out of glsl-parse
I won't say it belongs in glsl-builtins, though the glsl-specific stuff
probably does (glsl texture handling is a mess). Also adds sampler
attribute handling (which falls back to image when necessary).
2025-01-15 18:48:25 +09:00
Bill Currie
17ae2b592c [qfcc] Support attributes on image types
And rename base_type to sample_type: I decided it was a better name as
it's "sampled type" in the spir-v spec.
2025-01-14 01:07:00 +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
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
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
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
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
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
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
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
9c037ce79d [qfcc] Clean up some cruft in the glsl parser 2024-12-07 02:53:56 +09:00
Bill Currie
f014d3f580 [qfcc] Clean up logical not and bool expressions
Got to get rid of a FIXME :)
2024-12-05 02:02:14 +09:00
Bill Currie
7bbbbe1f0e [qfcc] Improve glsl source line tracking
It's never nice getting an error on the wrong line.
2024-12-05 00:21:19 +09:00
Bill Currie
5714433a9c [qfcc] Clean up some more bools 2024-12-05 00:10:15 +09:00
Bill Currie
8323868b2c [qfcc] Add an opcode for outer products
I'm not sure what it's useful for, but GLSL has a function for it thus I
decided to add the instruction to the VM, so this is part of the
compiler side.
2024-11-28 21:16:14 +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
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
2ef72f745d [qfcc] Improve glsl scope handling
While storing the scope in a block was the right idea, the
implementation wasn't quite right as it resulted in the current scope
getting set at the wrong times resulting in incorrect symbol access when
shadowing was in effect.
2024-11-16 20:14:51 +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
7ad6aff928 [qfcc] Implement cast and ?: expressions for spir-v
Unfortunately, there are some bugs with the result of comparisons
(getting int instead of bool in the spir-v).
2024-11-15 10:49:07 +09:00
Bill Currie
6649d8238e [qfcc] Process glsl parameters correctly
This gets parameter qualifiers to the parameters and thus `const`
parameters work as expected (even passes validation). However,
in/out/inout do not work yet due to incorrect setup of the function
call: spir-v wants them to be passed by reference (pointers) rather than
by value.
2024-11-12 23:49:47 +09:00
Bill Currie
bcfd1b7660 [qfcc] Split out the call related expression code
I've long felt build_function_call was getting a bit big, and expr.c
especially so. This should make it easier to rewrite build_function_call
for dealing with target-specific code. As a bonus, the int through ...
warning is already cleaned up.
2024-11-04 20:28:30 +09:00
Bill Currie
6358143795 [qfcc] Clean up the local_expr global
I never liked it and it made things a little difficult for spir-v.
2024-11-04 16:38:07 +09:00
Bill Currie
9cd480640d [qfcc] Defer return expressions 2024-10-08 11:46:52 +09:00
Bill Currie
3c7bd275f3 [qfcc] Detect shadowed parameters in glsl
Unfortunately, it breaks detection in Ruamoko and QuakeC.
2024-10-07 09:51:03 +09:00
Bill Currie
d46620fcf4 [qfcc] Add declaration expressions
Now declarations can be deferred too, thus things like generic/template
and inline functions should be possible. However, the most important
thing is this is a step towards a cleaner middle layer for compilation,
separating front-end language from back-end code-gen.
2024-10-04 11:51:34 +09:00
Bill Currie
a7639a685e [qfcc] Add field and array expression types
And implement enough AST processing to compile fstrianglest.vert

Plenty of code-gen issues, though.
2024-10-02 02:01:33 +09:00
Bill Currie
fc4e8cb350 [qfcc] Switch to deferred expressions for glsl
I plan to do this eventually for Ruamoko, but I need it to keep working
for now; it's rather nice having multiple languages. I expect this will
open up a lot of options for inlining, generic/template function
instantiation, etc. Right now, it's helping with specialization
constants in glsl.
2024-10-01 14:30:09 +09:00
Bill Currie
1117d31b30 [qfcc] Make some sideways progress with layouts
I'm not sure it's the right directly, and qfcc's internals are starting
to show their age.
2024-09-20 12:24:51 +09:00
Bill Currie
9cd8bc0d45 [qfcc] Move type encoding defs into an array
This allows the defs to be updated without having to modify the type
struct itself, and also allows for alternative encodings (eg, spir-v).
2024-09-15 12:05:57 +09:00
Bill Currie
99be6f6e41 [qfcc] Build namespaces for non-instanced blocks
Each interface type (in, out, uniform etc) gets its own namespace, and
non-instanced blocks get a namespace (their block name) within the
interface namespace.

The defs for the block members are currently "allocated" to be at offset
-1, but the idea is to allow layout qualifiers to know if the member has
already been located.
2024-09-12 13:33:42 +09:00
Bill Currie
db39fdbe37 [qfcc] Create glsl block before parsing members
This allows attributes to be put on the block before members are
declared thus giving member attributes to override block attributes when
appropriate.
2024-09-12 12:14:10 +09:00
Bill Currie
c58748d640 [qfcc] Implement many glsl qualifiers as attributes
Attributes seem appropriate as GLSL's qualifiers affect variables rather
than types (since there's no typedef).

Not much is done with the attributes yet other than some basic error
checking (duplicates of non-layout attributes) and debug output, but
most (if not all) declarations get to the declaration code with
attributes intact.
2024-09-09 20:01:06 +09:00
Bill Currie
ad3ae1abec [qfcc] Get true and false working in glsl 2024-09-09 11:47:01 +09:00
Bill Currie
2fc3a43e31 [glsl] Fix multiplication after addition
I'd goofed when transcribing the glsl grammar.
2024-09-09 11:42:30 +09:00