diff --git a/tools/qfcc/source/glsl-builtins.c b/tools/qfcc/source/glsl-builtins.c index 2b6fa1858..6c7dbed40 100644 --- a/tools/qfcc/source/glsl-builtins.c +++ b/tools/qfcc/source/glsl-builtins.c @@ -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 diff --git a/tools/qfcc/source/glsl-layout.c b/tools/qfcc/source/glsl-layout.c index 7e3188d13..f4261dded 100644 --- a/tools/qfcc/source/glsl-layout.c +++ b/tools/qfcc/source/glsl-layout.c @@ -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), diff --git a/tools/qfcc/source/glsl-parse.y b/tools/qfcc/source/glsl-parse.y index 762c6727a..2b97c0f78 100644 --- a/tools/qfcc/source/glsl-parse.y +++ b/tools/qfcc/source/glsl-parse.y @@ -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); }