[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.
This commit is contained in:
Bill Currie 2025-01-24 14:02:16 +09:00
parent 6c4fd34229
commit 0f34e69aeb
3 changed files with 113 additions and 100 deletions

View file

@ -232,122 +232,119 @@ type_t type_glsl_sampler = {
static const char *glsl_Vulkan_vertex_vars =
SRC_LINE
"in int gl_VertexIndex;" "\n"
"in int gl_InstanceIndex;" "\n"
"in int gl_DrawID;" "\n"
"in int gl_BaseVertex;" "\n"
"in int gl_BaseInstance;" "\n"
"#ifdef GL_EXT_multiview" "\n"
"highp int gl_ViewIndex;" "\n"
"#endif" "\n"
"out gl_PerVertex {" "\n"
" vec4 gl_Position;" "\n"
" float gl_PointSize;" "\n"
" float gl_ClipDistance[];" "\n"
" float gl_CullDistance[];" "\n"
"};" "\n";
"layout (builtin=\"VertexIndex\") in int gl_VertexIndex;" "\n"
"layout (builtin=\"InstanceIndex\") in int gl_InstanceIndex;" "\n"
"#ifdef GL_EXT_multiview" "\n"
"layout (builtin=\"ViewIndex\") in highp int gl_ViewIndex;" "\n"
"#endif" "\n"
"out gl_PerVertex {" "\n"
" layout (builtin=\"Position\") vec4 gl_Position;" "\n"
" layout (builtin=\"PointSize\") float gl_PointSize;" "\n"
" layout (builtin=\"ClipDistance\") float gl_ClipDistance[];" "\n"
" layout (builtin=\"CullDistance\") float gl_CullDistance[];" "\n"
"};" "\n";
//tesselation control
static const char *glsl_tesselation_control_vars =
SRC_LINE
"in gl_PerVertex {" "\n"
" vec4 gl_Position;" "\n"
" float gl_PointSize;" "\n"
" float gl_ClipDistance[];" "\n"
" float gl_CullDistance[];" "\n"
"} gl_in[gl_MaxPatchVertices];" "\n"
"in int gl_PatchVerticesIn;" "\n"
"in int gl_PrimitiveID;" "\n"
"in int gl_InvocationID;" "\n"
"#ifdef GL_EXT_multiview" "\n"
"highp int gl_ViewIndex;" "\n"
"#endif" "\n"
"out gl_PerVertex {" "\n"
" vec4 gl_Position;" "\n"
" float gl_PointSize;" "\n"
" float gl_ClipDistance[];" "\n"
" float gl_CullDistance[];" "\n"
"} gl_out[];" "\n"
"patch out float gl_TessLevelOuter[4];" "\n"
"patch out float gl_TessLevelInner[2];" "\n";
"in gl_PerVertex {" "\n"
" layout (builtin=\"Position\") vec4 gl_Position;" "\n"
" layout (builtin=\"PointSize\") float gl_PointSize;" "\n"
" layout (builtin=\"ClipDistance\") float gl_ClipDistance[];" "\n"
" layout (builtin=\"CullDistance\") float gl_CullDistance[];" "\n"
"} gl_in[gl_MaxPatchVertices];" "\n"
"layout (builtin=\"PatchVertices\") in int gl_PatchVerticesIn;" "\n"
"layout (builtin=\"PrimitiveID\") in int gl_PrimitiveID;" "\n"
"layout (builtin=\"InvocationID\") in int gl_InvocationID;" "\n"
"#ifdef GL_EXT_multiview" "\n"
"layout (builtin=\"ViewIndex\") in highp int gl_ViewIndex;" "\n"
"#endif" "\n"
"out gl_PerVertex {" "\n"
" layout (builtin=\"Position\") vec4 gl_Position;" "\n"
" layout (builtin=\"PointSize\") float gl_PointSize;" "\n"
" layout (builtin=\"ClipDistance\") float gl_ClipDistance[];" "\n"
" layout (builtin=\"CullDistance\") float gl_CullDistance[];" "\n"
"} gl_out[];" "\n"
"layout (builtin=\"TessLevelOuter\") patch out float gl_TessLevelOuter[4];\n"
"layout (builtin=\"TessLevelInner\") patch out float gl_TessLevelInner[2];\n";
static const char *glsl_tesselation_evaluation_vars =
SRC_LINE
"in gl_PerVertex {" "\n"
" vec4 gl_Position;" "\n"
" float gl_PointSize;" "\n"
" float gl_ClipDistance[];" "\n"
" float gl_CullDistance[];" "\n"
"} gl_in[gl_MaxPatchVertices];" "\n"
"in int gl_PatchVerticesIn;" "\n"
"in int gl_PrimitiveID;" "\n"
"in vec3 gl_TessCoord;" "\n"
"patch in float gl_TessLevelOuter[4];" "\n"
"patch in float gl_TessLevelInner[2];" "\n"
"#ifdef GL_EXT_multiview" "\n"
"highp int gl_ViewIndex;" "\n"
"#endif" "\n"
"out gl_PerVertex {" "\n"
" vec4 gl_Position;" "\n"
" float gl_PointSize;" "\n"
" float gl_ClipDistance[];" "\n"
" float gl_CullDistance[];" "\n"
"};" "\n";
"in gl_PerVertex {" "\n"
" layout (builtin=\"Position\") vec4 gl_Position;" "\n"
" layout (builtin=\"PointSize\") float gl_PointSize;" "\n"
" layout (builtin=\"ClipDistance\") float gl_ClipDistance[];" "\n"
" layout (builtin=\"CullDistance\") float gl_CullDistance[];" "\n"
"} gl_in[gl_MaxPatchVertices];" "\n"
"layout (builtin=\"PatchVertices\") in int gl_PatchVerticesIn;" "\n"
"layout (builtin=\"PrimitiveID\") in int gl_PrimitiveID;" "\n"
"layout (builtin=\"TessCoord\") in vec3 gl_TessCoord;" "\n"
"layout (builtin=\"TessLevelOuter\") patch in float gl_TessLevelOuter[4];" "\n"
"layout (builtin=\"TessLevelInner\") patch in float gl_TessLevelInner[2];" "\n"
"#ifdef GL_EXT_multiview" "\n"
"layout (builtin=\"ViewIndex\") in highp int gl_ViewIndex;" "\n"
"#endif" "\n"
"out gl_PerVertex {" "\n"
" layout (builtin=\"Position\") vec4 gl_Position;" "\n"
" layout (builtin=\"PointSize\") float gl_PointSize;" "\n"
" layout (builtin=\"ClipDistance\") float gl_ClipDistance[];" "\n"
" layout (builtin=\"CullDistance\") float gl_CullDistance[];" "\n"
"};" "\n";
static const char *glsl_geometry_vars =
SRC_LINE
"in gl_PerVertex {" "\n"
" vec4 gl_Position;" "\n"
" float gl_PointSize;" "\n"
" float gl_ClipDistance[];" "\n"
" float gl_CullDistance[];" "\n"
"} gl_in[];" "\n"
"in int gl_PrimitiveIDIn;" "\n"
"in int gl_InvocationID;" "\n"
"#ifdef GL_EXT_multiview" "\n"
"highp int gl_ViewIndex;" "\n"
"#endif" "\n"
"out gl_PerVertex {" "\n"
" vec4 gl_Position;" "\n"
" float gl_PointSize;" "\n"
" float gl_ClipDistance[];" "\n"
" float gl_CullDistance[];" "\n"
"};" "\n"
"out int gl_PrimitiveID;" "\n"
"out int gl_Layer;" "\n"
"out int gl_ViewportIndex;" "\n";
"in gl_PerVertex {" "\n"
" layout (builtin=\"Position\") vec4 gl_Position;" "\n"
" layout (builtin=\"PointSize\") float gl_PointSize;" "\n"
" layout (builtin=\"ClipDistance\") float gl_ClipDistance[];" "\n"
" layout (builtin=\"CullDistance\") float gl_CullDistance[];" "\n"
"} gl_in[];" "\n"
"layout (builtin=\"PrimitiveID\") in int gl_PrimitiveIDIn;" "\n"
"layout (builtin=\"InvocationID\") in int gl_InvocationID;" "\n"
"#ifdef GL_EXT_multiview" "\n"
"layout (builtin=\"ViewIndex\") in highp int gl_ViewIndex;" "\n"
"#endif" "\n"
"out gl_PerVertex {" "\n"
" layout (builtin=\"Position\") vec4 gl_Position;" "\n"
" layout (builtin=\"PointSize\") float gl_PointSize;" "\n"
" layout (builtin=\"ClipDistance\") float gl_ClipDistance[];" "\n"
" layout (builtin=\"CullDistance\") float gl_CullDistance[];" "\n"
"};" "\n"
"layout (builtin=\"PrimitiveID\") out int gl_PrimitiveID;" "\n"
"layout (builtin=\"Layer\") out int gl_Layer;" "\n"
"layout (builtin=\"ViewportIndex\") out int gl_ViewportIndex;" "\n";
static const char *glsl_fragment_vars =
SRC_LINE
"in vec4 gl_FragCoord;" "\n"
"in bool gl_FrontFacing;" "\n"
"in float gl_ClipDistance[];" "\n"
"in float gl_CullDistance[];" "\n"
"in vec2 gl_PointCoord;" "\n"
"in int gl_PrimitiveID;" "\n"
"in int gl_SampleID;" "\n"
"in vec2 gl_SamplePosition;" "\n"
"in int gl_SampleMaskIn[];" "\n"
"in int gl_Layer;" "\n"
"in int gl_ViewportIndex;" "\n"
"in bool gl_HelperInvocation;" "\n"
"#ifdef GL_EXT_multiview" "\n"
"highp int gl_ViewIndex;" "\n"
"#endif" "\n"
"out float gl_FragDepth;" "\n"
"out int gl_SampleMask[];" "\n";
"layout (builtin=\"FragCoord\") in vec4 gl_FragCoord;" "\n"
"layout (builtin=\"FrontFacing\") in bool gl_FrontFacing;" "\n"
"layout (builtin=\"ClipDistance\") in float gl_ClipDistance[];" "\n"
"layout (builtin=\"CullDistance\") in float gl_CullDistance[];" "\n"
"layout (builtin=\"PointCoord\") in vec2 gl_PointCoord;" "\n"
"layout (builtin=\"PrimitiveID\") in int gl_PrimitiveID;" "\n"
"layout (builtin=\"SampleID\") in int gl_SampleID;" "\n"
"layout (builtin=\"SamplePosition\") in vec2 gl_SamplePosition;" "\n"
"layout (builtin=\"SampleMask\") in int gl_SampleMaskIn[];" "\n"
"layout (builtin=\"Layer\") in int gl_Layer;" "\n"
"layout (builtin=\"ViewportIndex\") in int gl_ViewportIndex;" "\n"
"layout (builtin=\"HelperInvocation\") in bool gl_HelperInvocation;" "\n"
"#ifdef GL_EXT_multiview" "\n"
"layout (builtin=\"ViewIndex\") in highp int gl_ViewIndex;" "\n"
"#endif" "\n"
"layout (builtin=\"FragDepth\") out float gl_FragDepth;" "\n"
"layout (builtin=\"SampleMask\") out int gl_SampleMask[];" "\n";
static const char *glsl_compute_vars =
SRC_LINE
"// workgroup dimensions" "\n"
"in uvec3 gl_NumWorkGroups;" "\n"
"readonly uvec3 gl_WorkGroupSize;" "\n"
"// workgroup and invocation IDs" "\n"
"in uvec3 gl_WorkGroupID;" "\n"
"in uvec3 gl_LocalInvocationID;" "\n"
"// derived variables" "\n"
"in uvec3 gl_GlobalInvocationID;" "\n"
"in uint gl_LocalInvocationIndex;" "\n";
"// workgroup dimensions" "\n"
"layout (builtin=\"NumWorkgroups\") in uvec3 gl_NumWorkGroups;" "\n"
"layout (builtin=\"WorkgroupSize\") in uvec3 gl_WorkGroupSize;" "\n"
"// workgroup and invocation IDs" "\n"
"layout (builtin=\"WorkgroupId\") in uvec3 gl_WorkGroupID;" "\n"
"layout (builtin=\"LocalInvocationId\") in uvec3 gl_LocalInvocationID;" "\n"
"// derived variables" "\n"
"layout (builtin=\"GlobalInvocationId\") in uvec3 gl_GlobalInvocationID;""\n"
"layout (builtin=\"LocalInvocationIndex\") in uint gl_LocalInvocationIndex;\n";
static const char *glsl_system_constants =
SRC_LINE

View file

@ -115,6 +115,14 @@ glsl_layout_packing (const layout_qual_t *qual, specifier_t spec,
{
}
static void
glsl_layout_builtin (const layout_qual_t *qual, specifier_t spec,
const expr_t *qual_name, const expr_t *val)
{
const char *name = "BuiltIn";
set_attribute (&spec.sym->attributes, name, val);
}
static void
glsl_layout_location (const layout_qual_t *qual, specifier_t spec,
const expr_t *qual_name, const expr_t *val)
@ -260,6 +268,13 @@ glsl_layout_ignore (const layout_qual_t *qual, specifier_t spec,
static bool sorted_layout_qualifiers;
static layout_qual_t layout_qualifiers[] = {
{ .name = "builtin",
.apply = E(glsl_layout_builtin),
.obj_mask = D(var)|D(member),
.var_type = V(any),
.if_mask = I(in)|I(out),
},
{ .name = "shared",
.apply = A(glsl_layout_invalid_A),
.obj_mask = D(qual)|D(block),

View file

@ -360,6 +360,7 @@ new_identifier
primary_exprsssion
: variable_identifier { $$ = new_symbol_expr ($1); }
| VALUE
| STRING
| TRUE { $$ = new_bool_expr (true); }
| FALSE { $$ = new_bool_expr (false); }
| '(' expression ')' { $$ = paren_expr ($2); }