Commit graph

3648 commits

Author SHA1 Message Date
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
8cc71395cc [qfcc] Fix some more unsupported expressions in dot 2024-12-05 00:19:48 +09:00
Bill Currie
674fbae225 [qfcc] Rework binary_expr to be support matrices
And, nicely, simplify it quite a bit. I'm not sure why I didn't thinkg
of this approach before. While the ruamoko back-end doesn't support
matrices yet, the expressions are handled.

As a side effect, type checking on comparisons is "stricter" in that
more potentially bogus comparisons (eg, int-float) are caught, resulting
in a few warnings in ruamoko code and even finding a couple of bugs.
2024-12-05 00:18:47 +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
8d69ca9a99 [qfcc] Simplify type_promotes and type_demotes
Using bit masks for valid source types for each destination type makes
the logic a lot easier to read. Still had to have some explicit checks
for enums and bools.
2024-12-05 00:10:15 +09:00
Bill Currie
f4a8a5e179 [qfcc] Fix some inconsistent tokens
I need to find a good way to share token defs between bison files.
2024-12-05 00:10:15 +09:00
Bill Currie
7a30ac9527 [qfcc] Clear current function for constexpr evaluation
The code gen return statements checks for out/inout parameters in the
current function and thus could result in some undesired behavior when
constants are evaluated within such a function.
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
b03132825e [qfcc] Fix a typo in a variable name 2024-12-04 23:48:43 +09:00
Bill Currie
4800fef4fd [qfcc] Give short and ushort width of 1
I'm not sure why I thought a width of 0 was a good idea, but it proved
to be problematic when implementing matrices.
2024-12-04 23:47:58 +09:00
Bill Currie
58b78cfdec [qfcc] Separate matrices from non-scalars
While matrices are non-scalars in math, is_nonscalar is meant for any
vector type because is_vector is specifically for the quakec vector
type.
2024-12-03 14:56:38 +09:00
Bill Currie
7c56c10d25 [qfcc] Support matrices in binary expressions
Partially. There are problems with scaling and code-gen.
2024-11-28 23:30:39 +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
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
c4f48353b9 [qfcc] Correct a typo in a comment 2024-11-28 21:05:34 +09:00
Bill Currie
0652a103d0 [qfcc] Correct edge labels for field expressions
I had f and o reversed and decided to use m (member) instead of f.
2024-11-28 20:09:51 +09:00
Bill Currie
2b70c54b15 [qfcc] Fix an uninitialized variable
I'd forgotten to do an optimized compile check :/
2024-11-26 16:26:45 +09:00
Bill Currie
2bd9d26cc1 [qfcc] Implement mod for v6 progs
The tricky bit was figuring out how to get `floor()` out of the
available instructions. It's handy that the comparison ops always
returned floats and didn't force the use of branches.
2024-11-26 14:38:55 +09:00
Bill Currie
7b4aa1efd8 [qfcc] Clean up v6 rem implementation
I couldn't do it this way before I got dag expressions working, but this
is much cleaner.
2024-11-26 14:21:10 +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
b9ed0dcc64 [qfcc] Allow obj pointer to id conversions for free
Overloaded functions taking id need to allow any obj pointer.
2024-11-24 18:38:45 +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
98d122f122 [qfcc] Use same cost function for generic and overloaded
The modulo test breaks due to implicitly typed literals, but otherwise
seems to do a better job of resolving function calls.
2024-11-24 15:56:46 +09:00
Bill Currie
70bb5c3434 [qfcc] Check for errors in conditional expressions 2024-11-24 15:52:17 +09:00
Bill Currie
53c4c205ca [qfcc] Override function declaration with definition
This fixes the problem of the function declaration parameter names
overriding the definition's parameter names.
2024-11-24 13:03:34 +09:00
Bill Currie
ffcee99835 [qfcc] Partially handle implementing generic functions
Implemented via specific overloads of the function.

It's not quite working correctly in that parameter names are taken from
the declaration instead of definition. However, this seems to be an old
bug that went unnoticed due to me almost always using the same parameter
names in declaration and definition.

Also, the code in get_function() is a horrible mess.

However, the basic idea turned out to be simpler than I though (though
details of the implementation are indeed a little trickier): generic
functions are essentially prototype generators when implemented using
non-generic specialized overloads.
2024-11-24 11:34:59 +09:00
Bill Currie
980dd913b5 [qfcc] Split up find_generic_function
I want to reuse its generic function search for defining
implementations.
2024-11-22 23:50:07 +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
11f8992710 [qfcc] Handle dynamic array indices for spir-v
Now bsp_turb.frag (with hacks for builtin functions) compiles and even
passes validation, but is badly broken.
2024-11-21 19:18:13 +09:00
Bill Currie
fbcdf227c5 [qfcc] Assign indices to glsl block members
spirv-val didn't particularly like all my block members getting index 0
(really, it was tangled types, but 0 was the cause).
2024-11-21 19:18:13 +09:00
Bill Currie
cfc5e0b5fd [qfcc] Handle convert symbols when processing
I'm pretty sure I don't want this getting into the target code, so
handling it early (like in the immediate processing path) seems good.
2024-11-21 19:18:13 +09:00
Bill Currie
c3bbd85857 [qfcc] Skip void param for spir-v
Functions declared with `(void)` don't actually have any parameters, so
ensure no parameters are emitted for such functions.
2024-11-21 19:18:13 +09:00
Bill Currie
744c3ff1d6 [qfcc] Handle reference params/args for overloaded functions
Reference vs value parameters do not resolve overloaded functions.
2024-11-21 19:18:13 +09:00
Bill Currie
663aeb16fd [qfcc] Enable color/texture vector component names
Yet another step closer to glsl support.

While it wasn't correct anyway (neither vectors nor quaternions are
colors), the additional names broke q.s in the quaternion.r test, likely
due to there being two s fields.
2024-11-21 19:18:13 +09:00
Bill Currie
08bdc0794a [qfcc] Improve expression line tracking
Missed a few places in expr_process.
2024-11-21 19:18:13 +09:00
Bill Currie
fb497cd0b2 [qfcc] Clean up the errors for some layout qualifiers
Nothing's actually implemented, but once I fix a couple more errors I'll
be able to work on that.
2024-11-21 19:18:13 +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
28a85b1624 [qfcc] Fix some crashes when parsing bsp_turb.frag
Incorrect type accesses and unnamed interfaces.
2024-11-19 17:15:42 +09:00
Bill Currie
34b94aec96 [qfcc] Set binding and set attributes
Not sure if this will work, but it does fix some error and notice noise.
2024-11-19 17:13:38 +09:00
Bill Currie
59c8e8e907 [qfcc] Don't check for redefs of unnamed symbols
Both glsl and spir-v need this for non-instanced interface blocks.
2024-11-19 17:12:03 +09:00
Bill Currie
128682624e [qfcc] Process array sub-expressions 2024-11-19 17:10:37 +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
393f669864 [qfcc] Ensure function types are complete
All types need non-zero alignment, width and columns.
2024-11-18 22:45:08 +09:00
Bill Currie
9add468462 [qfcc] Improve interface block declaration
I'm sure there are still some warts, but interface declaration now works
for spir-v and a real vertex shader can be compiled (albeit one that
doesn't use matrices).
2024-11-18 21:41:33 +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