From 39493bebaabed2d8cfd6d39f224655f080f37b22 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Thu, 24 May 2012 07:16:51 +0000 Subject: [PATCH] test: add most of the GLSL grammar. --- test/sandbox/lex/lolfx.l | 29 +- test/sandbox/lex/lolfx.y | 595 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 602 insertions(+), 22 deletions(-) diff --git a/test/sandbox/lex/lolfx.l b/test/sandbox/lex/lolfx.l index 2bed0915..4c623636 100644 --- a/test/sandbox/lex/lolfx.l +++ b/test/sandbox/lex/lolfx.l @@ -66,12 +66,6 @@ "field_selection" { return GT_FIELD_SELECTION; } "left_op" { return GT_LEFT_OP; } "right_op" { return GT_RIGHT_OP; } -"inc_op" { return GT_INC_OP; } -"dec_op" { return GT_DEC_OP; } -"le_op" { return GT_LE_OP; } -"ge_op" { return GT_GE_OP; } -"eq_op" { return GT_EQ_OP; } -"ne_op" { return GT_NE_OP; } "and_op" { return GT_AND_OP; } "or_op" { return GT_OR_OP; } "xor_op" { return GT_XOR_OP; } @@ -517,6 +511,29 @@ * Various tokens */ +"++" { return T_INC; } +"--" { return T_DEC; } +"<=" { return T_LE; } +">=" { return T_GE; } +"==" { return T_EQ; } +"!=" { return T_NE; } +"<<" { return T_LEFT; } +">>" { return T_RIGHT; } +"&&" { return T_AND; } +"||" { return T_OR; } +"^^" { return T_XOR; } + +"*=" { return T_MULEQ; } +"/=" { return T_DIVEQ; } +"%=" { return T_MODEQ; } +"+=" { return T_ADDEQ; } +"-=" { return T_SUBEQ; } +"<<=" { return T_LEFTEQ; } +">>=" { return T_RIGHTEQ; } +"&=" { return T_ANDEQ; } +"^=" { return T_XOREQ; } +"|=" { return T_OREQ; } + [0-9]+\.[0-9]+ { yylval.fval = atof(yytext); return FLOAT; } [0-9]+ { yylval.ival = atoi(yytext); return INT; } [a-zA-Z][a-zA-Z0-9_]* { diff --git a/test/sandbox/lex/lolfx.y b/test/sandbox/lex/lolfx.y index f0a4bd07..1ad5c0cf 100644 --- a/test/sandbox/lex/lolfx.y +++ b/test/sandbox/lex/lolfx.y @@ -72,30 +72,30 @@ void yyerror(const char *s); * HLSL keywords */ -%token HT_APPENDSTRUCTUREDBUFFER HT_ASM HT_ASM_FRAGMENT HT_BLENDSTATE HT_BOOL -%token HT_BREAK HT_BUFFER HT_BYTEADDRESSBUFFER HT_CBUFFER HT_CENTROID -%token HT_COLUMN_MAJOR HT_COMPILE HT_COMPILE_FRAGMENT HT_COMPILESHADER HT_CONST -%token HT_CONTINUE HT_COMPUTESHADER HT_CONSUMESTRUCTUREDBUFFER -%token HT_DEPTHSTENCILSTATE HT_DEPTHSTENCILVIEW HT_DISCARD HT_DO HT_DOUBLE -%token HT_DOMAINSHADER HT_DWORD HT_ELSE HT_EXTERN HT_FALSE HT_FLOAT HT_FOR -%token HT_FXGROUP HT_GEOMETRYSHADER HT_GROUPSHARED HT_HALF HT_HULLSHADER HT_IF -%token HT_IN HT_INLINE HT_INOUT HT_INPUTPATCH HT_INT HT_INTERFACE HT_LINE +%token HT_APPENDSTRUCTUREDBUFFER HT_ASM HT_ASM_FRAGMENT HT_BLENDSTATE +%token HT_BUFFER HT_BYTEADDRESSBUFFER HT_CBUFFER +%token HT_COLUMN_MAJOR HT_COMPILE HT_COMPILE_FRAGMENT HT_COMPILESHADER +%token HT_COMPUTESHADER HT_CONSUMESTRUCTUREDBUFFER +%token HT_DEPTHSTENCILSTATE HT_DEPTHSTENCILVIEW +%token HT_DOMAINSHADER HT_DWORD HT_EXTERN HT_FALSE +%token HT_FXGROUP HT_GEOMETRYSHADER HT_GROUPSHARED HT_HALF HT_HULLSHADER +%token HT_INLINE HT_INPUTPATCH HT_INTERFACE HT_LINE %token HT_LINEADJ HT_LINEAR HT_LINESTREAM HT_MATRIX HT_NAMESPACE -%token HT_NOINTERPOLATION HT_NOPERSPECTIVE HT_NULL HT_OUT HT_OUTPUTPATCH +%token HT_NOINTERPOLATION HT_NULL HT_OUTPUTPATCH %token HT_PACKOFFSET HT_PASS HT_PIXELFRAGMENT HT_PIXELSHADER HT_POINT %token HT_POINTSTREAM HT_PRECISE HT_RASTERIZERSTATE HT_RENDERTARGETVIEW -%token HT_RETURN HT_REGISTER HT_ROW_MAJOR HT_RWBUFFER HT_RWBYTEADDRESSBUFFER +%token HT_REGISTER HT_ROW_MAJOR HT_RWBUFFER HT_RWBYTEADDRESSBUFFER %token HT_RWSTRUCTUREDBUFFER HT_RWTEXTURE1D HT_RWTEXTURE1DARRAY HT_RWTEXTURE2D -%token HT_RWTEXTURE2DARRAY HT_RWTEXTURE3D HT_SAMPLER HT_SAMPLER1D HT_SAMPLER2D -%token HT_SAMPLER3D HT_SAMPLERCUBE HT_SAMPLER_STATE HT_SAMPLERSTATE +%token HT_RWTEXTURE2DARRAY HT_RWTEXTURE3D HT_SAMPLER +%token HT_SAMPLER_STATE HT_SAMPLERSTATE %token HT_SAMPLERCOMPARISONSTATE HT_SHARED HT_SNORM HT_STATEBLOCK -%token HT_STATEBLOCK_STATE HT_STATIC HT_STRING HT_STRUCT HT_SWITCH +%token HT_STATEBLOCK_STATE HT_STATIC HT_STRING %token HT_STRUCTUREDBUFFER HT_TBUFFER HT_TECHNIQUE HT_TECHNIQUE10 %token HT_TECHNIQUE11XZ HT_TEXTURE HT_TEXTURE1D HT_TEXTURE1DARRAY HT_TEXTURE2D %token HT_TEXTURE2DARRAY HT_TEXTURE2DMS HT_TEXTURE2DMSARRAY HT_TEXTURE3D %token HT_TEXTURECUBE HT_TEXTURECUBEARRAY HT_TRUE HT_TYPEDEF HT_TRIANGLE -%token HT_TRIANGLEADJ HT_TRIANGLESTREAM HT_UNIFORM HT_UNORM HT_UINT HT_VECTOR -%token HT_VERTEXFRAGMENT HT_VERTEXSHADER HT_VOID HT_VOLATILE HT_WHILE +%token HT_TRIANGLEADJ HT_TRIANGLESTREAM HT_UNORM HT_VECTOR +%token HT_VERTEXFRAGMENT HT_VERTEXSHADER HT_VOLATILE /* * HLSL types @@ -144,13 +144,21 @@ void yyerror(const char *s); * HLSL reserved keywords */ -%token HT_AUTO HT_CASE HT_CATCH HT_CHAR HT_CLASS HT_CONST_CAST HT_DEFAULT +%token HT_AUTO HT_CATCH HT_CHAR HT_CLASS HT_CONST_CAST %token HT_DELETE HT_DYNAMIC_CAST HT_ENUM HT_EXPLICIT HT_FRIEND HT_GOTO HT_LONG %token HT_MUTABLE HT_NEW HT_OPERATOR HT_PRIVATE HT_PROTECTED HT_PUBLIC %token HT_REINTERPRET_CAST HT_SHORT HT_SIGNED HT_SIZEOF HT_STATIC_CAST %token HT_TEMPLATE HT_THIS HT_THROW HT_TRY HT_TYPENAME HT_UNION HT_UNSIGNED %token HT_USING HT_VIRTUAL + /* + * Language keywords + */ + +%token T_INC T_DEC T_LE T_GE T_EQ T_NE T_LEFT T_RIGHT T_AND T_OR T_XOR +%token T_MULEQ T_DIVEQ T_MODEQ T_ADDEQ T_SUBEQ T_LEFTEQ T_RIGHTEQ T_ANDEQ +%token T_XOREQ T_OREQ + /* * Temporary shit */ @@ -209,6 +217,561 @@ pass_stmt: | NAME '[' INT ']' '=' INT ';' ; + /* + * Grammar for GLSL + */ + +glsl_variable_identifier: + GLSL_IDENTIFIER + ; + +glsl_primary_expression: + glsl_variable_identifier + | INTCONSTANT + | UINTCONSTANT + | FLOATCONSTANT + | BOOLCONSTANT + | '(' glsl_expression ')' + ; + +glsl_postfix_expression: + glsl_primary_expression + | glsl_postfix_expression '[' glsl_integer_expression ']' + | glsl_function_call + | glsl_postfix_expression '.' FIELD_SELECTION + | glsl_postfix_expression T_INC + | glsl_postfix_expression T_DEC + ; + +glsl_integer_expression: + glsl_expression + ; + +glsl_function_call: + glsl_function_call_or_method + ; + +glsl_function_call_or_method: + glsl_function_call_generic + | glsl_postfix_expression '.' glsl_function_call_generic + ; + +glsl_function_call_generic: + glsl_function_call_header_with_parameters ')' + | glsl_function_call_header_no_parameters ')' + ; + +glsl_function_call_header_no_parameters: + glsl_function_call_header GHT_VOID + | glsl_function_call_header + ; + +glsl_function_call_header_with_parameters: + glsl_function_call_header glsl_assignment_expression + | glsl_function_call_header_with_parameters ',' glsl_assignment_expression + ; + +glsl_function_call_header: + glsl_function_identifier '(' + ; + +glsl_function_identifier: + glsl_type_specifier + | IDENTIFIER + | FIELD_SELECTION + ; + +glsl_unary_expression: + glsl_postfix_expression + | T_INC glsl_unary_expression + | T_DEC glsl_unary_expression + | glsl_unary_operator glsl_unary_expression + ; + +glsl_unary_operator: + '+' + | '-' + | '!' + | '~' + ; + +glsl_multiplicative_expression: + glsl_unary_expression + | glsl_multiplicative_expression '*' glsl_unary_expression + | glsl_multiplicative_expression '/' glsl_unary_expression + | glsl_multiplicative_expression '%' glsl_unary_expression + ; + +glsl_additive_expression: + glsl_multiplicative_expression + | glsl_additive_expression '+' glsl_multiplicative_expression + | glsl_additive_expression '-' glsl_multiplicative_expression + ; + +glsl_shift_expression: + glsl_additive_expression + | glsl_shift_expression T_LEFT glsl_additive_expression + | glsl_shift_expression T_RIGHT glsl_additive_expression + ; + +glsl_relational_expression: + glsl_shift_expression + | glsl_relational_expression '<' glsl_shift_expression + | glsl_relational_expression '>' glsl_shift_expression + | glsl_relational_expression T_LE glsl_shift_expression + | glsl_relational_expression T_GE glsl_shift_expression + ; + +glsl_equality_expression: + glsl_relational_expression + | glsl_equality_expression T_EQ glsl_relational_expression + | glsl_equality_expression T_NE glsl_relational_expression + ; + +glsl_and_expression: + glsl_equality_expression + | glsl_and_expression '&' glsl_equality_expression + ; + +glsl_exclusive_or_expression: + glsl_and_expression + | glsl_exclusive_or_expression '^' glsl_and_expression + ; + +glsl_inclusive_or_expression: + glsl_exclusive_or_expression + | glsl_inclusive_or_expression '|' glsl_exclusive_or_expression + ; + +glsl_logical_and_expression: + glsl_inclusive_or_expression + | glsl_logical_and_expression T_AND glsl_inclusive_or_expression + ; + +glsl_logical_xor_expression: + glsl_logical_and_expression + | glsl_logical_xor_expression T_XOR glsl_logical_and_expression + ; + +glsl_logical_or_expression: + glsl_logical_xor_expression + | glsl_logical_or_expression T_OR glsl_logical_xor_expression + ; + +glsl_conditional_expression: + glsl_logical_or_expression + | glsl_logical_or_expression '?' glsl_expression ':' glsl_assignment_expression + ; + +glsl_assignment_expression: + glsl_conditional_expression + | glsl_unary_expression glsl_assignment_operator glsl_assignment_expression + ; + +glsl_assignment_operator: + '=' + | T_MULEQ + | T_DIVEQ + | T_MODEQ + | T_ADDEQ + | T_SUBEQ + | T_LEFTEQ + | T_RIGHTEQ + | T_ANDEQ + | T_XOREQ + | T_OREQ + ; + +glsl_expression: + glsl_assignment_expression + | glsl_expression ',' glsl_assignment_expression + ; + +glsl_constant_expression: + glsl_conditional_expression + ; + +glsl_declaration: + glsl_function_prototype ';' + | glsl_init_declarator_list ';' + | PRECISION glsl_precision_qualifier glsl_type_specifier_no_prec ';' + | glsl_type_qualifier IDENTIFIER '{' glsl_struct_declaration_list '}' ';' + | glsl_type_qualifier IDENTIFIER '{' glsl_struct_declaration_list '}' IDENTIFIER ';' + | glsl_type_qualifier IDENTIFIER '{' glsl_struct_declaration_list '}' IDENTIFIER '[' ']' ';' + | glsl_type_qualifier IDENTIFIER '{' glsl_struct_declaration_list '}' IDENTIFIER '[' glsl_constant_expression ']' ';' + | glsl_type_qualifier ';' + ; + +glsl_function_prototype: + glsl_function_declarator ')' + ; + +glsl_function_declarator: + glsl_function_header + | glsl_function_header_with_parameters + ; + +glsl_function_header_with_parameters: + glsl_function_header glsl_parameter_declaration + | glsl_function_header_with_parameters ',' glsl_parameter_declaration + ; + +glsl_function_header: + glsl_fully_specified_type IDENTIFIER '(' + ; + +glsl_parameter_declarator: + glsl_type_specifier IDENTIFIER + | glsl_type_specifier IDENTIFIER '[' glsl_constant_expression ']' + ; + +glsl_parameter_declaration: + glsl_parameter_type_qualifier glsl_parameter_qualifier glsl_parameter_declarator + | glsl_parameter_qualifier glsl_parameter_declarator + | glsl_parameter_type_qualifier glsl_parameter_qualifier glsl_parameter_type_specifier + | glsl_parameter_qualifier glsl_parameter_type_specifier + ; + +glsl_parameter_qualifier: + /* empty */ + | GHT_IN + | GHT_OUT + | GHT_INOUT + ; + +glsl_parameter_type_specifier: + glsl_type_specifier + ; + +glsl_init_declarator_list: + glsl_single_declaration + | glsl_init_declarator_list ',' IDENTIFIER + | glsl_init_declarator_list ',' IDENTIFIER '[' ']' + | glsl_init_declarator_list ',' IDENTIFIER '[' glsl_constant_expression ']' + | glsl_init_declarator_list ',' IDENTIFIER '[' ']' '=' glsl_initializer + | glsl_init_declarator_list ',' IDENTIFIER '[' glsl_constant_expression ']' '=' glsl_initializer + | glsl_init_declarator_list ',' IDENTIFIER '=' glsl_initializer + ; + +glsl_single_declaration: + glsl_fully_specified_type + | glsl_fully_specified_type IDENTIFIER + | glsl_fully_specified_type IDENTIFIER '[' ']' + | glsl_fully_specified_type IDENTIFIER '[' glsl_constant_expression ']' + | glsl_fully_specified_type IDENTIFIER '[' ']' '=' glsl_initializer + | glsl_fully_specified_type IDENTIFIER '[' glsl_constant_expression ']' '=' glsl_initializer + | glsl_fully_specified_type IDENTIFIER '=' glsl_initializer + | INVARIANT IDENTIFIER + ; + +glsl_fully_specified_type: + glsl_type_specifier + | glsl_type_qualifier glsl_type_specifier + ; + +glsl_invariant_qualifier: + INVARIANT + ; + +glsl_interpolation_qualifier: + GT_SMOOTH + | GT_FLAT + | GHT_NOPERSPECTIVE + ; + +glsl_layout_qualifier: + GT_LAYOUT '(' glsl_layout_qualifier_id_list ')' + ; + +glsl_layout_qualifier_id_list: + glsl_layout_qualifier_id + | glsl_layout_qualifier_id_list ',' glsl_layout_qualifier_id + ; + +glsl_layout_qualifier_id: + IDENTIFIER + | IDENTIFIER '=' INTCONSTANT + ; + +glsl_parameter_type_qualifier: + GHT_CONST + ; + +glsl_type_qualifier: + glsl_storage_qualifier + | glsl_layout_qualifier + | glsl_layout_qualifier glsl_storage_qualifier + | glsl_interpolation_qualifier glsl_storage_qualifier + | glsl_interpolation_qualifier + | glsl_invariant_qualifier glsl_storage_qualifier + | glsl_invariant_qualifier glsl_interpolation_qualifier glsl_storage_qualifier + | glsl_invariant_qualifier + ; + +glsl_storage_qualifier: + GHT_CONST + | GHT_IN + | GHT_OUT + | GHT_CENTROID GHT_IN + | GHT_CENTROID GHT_OUT + | GT_PATCH GHT_IN + | GT_PATCH GHT_OUT + | GT_SAMPLE GHT_IN + | GT_SAMPLE GHT_OUT + | GHT_UNIFORM + ; + +glsl_type_specifier: + glsl_type_specifier_no_prec + | glsl_precision_qualifier glsl_type_specifier_no_prec + ; + +glsl_type_specifier_no_prec: + glsl_type_specifier_nonarray + | glsl_type_specifier_nonarray '[' ']' + | glsl_type_specifier_nonarray '[' glsl_constant_expression ']' + +glsl_type_specifier_nonarray: + GHT_VOID + | GHT_FLOAT + | GHT_DOUBLE + | GHT_INT + | GHT_UINT + | GHT_BOOL + | GT_VEC2 + | GT_VEC3 + | GT_VEC4 + | GT_DVEC2 + | GT_DVEC3 + | GT_DVEC4 + | GT_BVEC2 + | GT_BVEC3 + | GT_BVEC4 + | GT_IVEC2 + | GT_IVEC3 + | GT_IVEC4 + | GT_UVEC2 + | GT_UVEC3 + | GT_UVEC4 + | GT_MAT2 + | GT_MAT3 + | GT_MAT4 + | GT_MAT2X2 + | GT_MAT2X3 + | GT_MAT2X4 + | GT_MAT3X2 + | GT_MAT3X3 + | GT_MAT3X4 + | GT_MAT4X2 + | GT_MAT4X3 + | GT_MAT4X4 + | GT_DMAT2 + | GT_DMAT3 + | GT_DMAT4 + | GT_DMAT2X2 + | GT_DMAT2X3 + | GT_DMAT2X4 + | GT_DMAT3X2 + | GT_DMAT3X3 + | GT_DMAT3X4 + | GT_DMAT4X2 + | GT_DMAT4X3 + | GT_DMAT4X4 + | GHT_SAMPLER1D + | GHT_SAMPLER2D + | GHT_SAMPLER3D + | GHT_SAMPLERCUBE + | GT_SAMPLER1DSHADOW + | GT_SAMPLER2DSHADOW + | GT_SAMPLERCUBESHADOW + | GT_SAMPLER1DARRAY + | GT_SAMPLER2DARRAY + | GT_SAMPLER1DARRAYSHADOW + | GT_SAMPLER2DARRAYSHADOW + | GT_SAMPLERCUBEARRAY + | GT_SAMPLERCUBEARRAYSHADOW + | GT_ISAMPLER1D + | GT_ISAMPLER2D + | GT_ISAMPLER3D + | GT_ISAMPLERCUBE + | GT_ISAMPLER1DARRAY + | GT_ISAMPLER2DARRAY + | GT_ISAMPLERCUBEARRAY + | GT_USAMPLER1D + | GT_USAMPLER2D + | GT_USAMPLER3D + | GT_USAMPLERCUBE + | GT_USAMPLER1DARRAY + | GT_USAMPLER2DARRAY + | GT_USAMPLERCUBEARRAY + | GT_SAMPLER2DRECT + | GT_SAMPLER2DRECTSHADOW + | GT_ISAMPLER2DRECT + | GT_USAMPLER2DRECT + | GT_SAMPLERBUFFER + | GT_ISAMPLERBUFFER + | GT_USAMPLERBUFFER + | GT_SAMPLER2DMS + | GT_ISAMPLER2DMS + | GT_USAMPLER2DMS + | GT_SAMPLER2DMSARRAY + | GT_ISAMPLER2DMSARRAY + | GT_USAMPLER2DMSARRAY + | glsl_struct_specifier + | TYPE_NAME + ; + +glsl_precision_qualifier: + HIGH_PRECISION + | MEDIUM_PRECISION + | LOW_PRECISION + ; + +glsl_struct_specifier: + GHT_STRUCT IDENTIFIER '{' glsl_struct_declaration_list '}' + | GHT_STRUCT '{' glsl_struct_declaration_list '}' + ; + +glsl_struct_declaration_list: + glsl_struct_declaration + | glsl_struct_declaration_list glsl_struct_declaration + ; + +glsl_struct_declaration: + glsl_type_specifier glsl_struct_declarator_list ';' + | glsl_type_qualifier glsl_type_specifier glsl_struct_declarator_list ';' + ; + +glsl_struct_declarator_list: + glsl_struct_declarator + | glsl_struct_declarator_list ',' glsl_struct_declarator + ; + +glsl_struct_declarator: + IDENTIFIER + | IDENTIFIER '[' ']' + | IDENTIFIER '[' glsl_constant_expression ']' + ; + +glsl_initializer: + glsl_assignment_expression + ; + +glsl_declaration_statement: + glsl_declaration + ; + +glsl_statement: + glsl_compound_statement + | glsl_simple_statement + ; + +glsl_simple_statement: + glsl_declaration_statement + | glsl_expression_statement + | glsl_selection_statement + | glsl_switch_statement + | glsl_case_label + | glsl_iteration_statement + | glsl_jump_statement + ; + +glsl_compound_statement: + '{' '}' + | '{' glsl_statement_list '}' + ; + +glsl_statement_no_new_scope: + glsl_compound_statement_no_new_scope + | glsl_simple_statement + ; + +glsl_compound_statement_no_new_scope: + '{' '}' + | '{' glsl_statement_list '}' + ; + +glsl_statement_list: + glsl_statement + | glsl_statement_list glsl_statement + ; + +glsl_expression_statement: + ';' + | glsl_expression ';' + ; + +glsl_selection_statement: + GHT_IF '(' glsl_expression ')' glsl_selection_rest_statement + ; + +glsl_selection_rest_statement: + glsl_statement GHT_ELSE glsl_statement + | glsl_statement + ; + +glsl_condition: + glsl_expression + | glsl_fully_specified_type IDENTIFIER '=' glsl_initializer + ; + +glsl_switch_statement: + GHT_SWITCH '(' glsl_expression ')' '{' glsl_switch_statement_list '}' + ; + +glsl_switch_statement_list: + /* nothing */ + | glsl_statement_list + ; + +glsl_case_label: + GHT_CASE glsl_expression ':' + | GHT_DEFAULT ':' + ; + +glsl_iteration_statement: + GHT_WHILE '(' glsl_condition ')' glsl_statement_no_new_scope + | GHT_DO glsl_statement GHT_WHILE '(' glsl_expression ')' ';' + | GHT_FOR '(' glsl_for_init_statement glsl_for_rest_statement ')' glsl_statement_no_new_scope + ; + +glsl_for_init_statement: + glsl_expression_statement + | glsl_declaration_statement + ; + +glsl_conditionopt: + glsl_condition + | /* empty */ + ; + +glsl_for_rest_statement: + glsl_conditionopt ';' + | glsl_conditionopt ';' glsl_expression + ; + +glsl_jump_statement: + GHT_CONTINUE ';' + | GHT_BREAK ';' + | GHT_RETURN ';' + | GHT_RETURN glsl_expression ';' + | GHT_DISCARD ';' + ; + +glsl_translation_unit: + glsl_external_declaration + glsl_translation_unit glsl_external_declaration + ; + +glsl_external_declaration: + glsl_function_definition + | glsl_declaration + ; + +glsl_function_definition: + glsl_function_prototype glsl_compound_statement_no_new_scope + ; + /* * Grammar for shaders */