#version 450 // constant_id specified scalar spec constants layout(constant_id = 200) const int spec_int = 3; layout(constant_id = 201) const float spec_float = 3.14; layout(constant_id = 202) const double spec_double = 3.1415926535897932384626433832795; layout(constant_id = 203) const bool spec_bool = true; // const float cast_spec_float = float(spec_float); // Flat struct struct flat_struct { int i; float f; double d; bool b; }; // Nesting struct struct nesting_struct { flat_struct nested; vec4 v; int i; }; // Expect OpSpecConstantComposite // Flat struct initializer //const flat_struct spec_flat_struct_all_spec = {spec_int, spec_float, // spec_double, spec_bool}; //const flat_struct spec_flat_struct_partial_spec = {30, 30.14, spec_double, // spec_bool}; // Nesting struct initializer //const nesting_struct nesting_struct_ctor = { // {spec_int, spec_float, spec_double, false}, // vec4(0.1, 0.1, 0.1, 0.1), // spec_int}; // Vector constructor //const vec4 spec_vec4_all_spec = // vec4(spec_float, spec_float, spec_float, spec_float); //const vec4 spec_vec4_partial_spec = // vec4(spec_float, spec_float, 300.14, 300.14); //const vec4 spec_vec4_from_one_scalar = vec4(spec_float); // Matrix constructor //const mat2x3 spec_mat2x3 = mat2x3(spec_float, spec_float, spec_float, 1.1, 2.2, 3.3); //const mat2x3 spec_mat2x3_from_one_scalar = mat2x3(spec_float); // Struct nesting constructor //const nesting_struct spec_nesting_struct_all_spec = { // spec_flat_struct_all_spec, spec_vec4_all_spec, spec_int}; //const nesting_struct spec_nesting_struct_partial_spec = { // spec_flat_struct_partial_spec, spec_vec4_partial_spec, 3000}; //const float spec_float_array[5] = {spec_float, spec_float, 1.0, 2.0, 3.0}; //const int spec_int_array[5] = {spec_int, spec_int, 1, 2, 30}; // global_vec4_array_with_spec_length is not a spec constant, but its array // size is. When calling global_vec4_array_with_spec_length.length(), A // TIntermSymbol Node should be returned, instead of a TIntermConstantUnion // node which represents a known constant value. in vec4 global_vec4_array_with_spec_length[spec_int]; out vec4 color; void refer_primary_spec_const() { if (spec_bool) color *= spec_int; } void refer_composite_spec_const() { //color += spec_vec4_all_spec; //color -= spec_vec4_partial_spec; } void refer_copmosite_dot_dereference() { //color *= spec_nesting_struct_all_spec.i; //color += spec_vec4_all_spec.x; } void refer_composite_bracket_dereference() { //color -= spec_float_array[1]; //color /= spec_int_array[spec_int_array[spec_int]]; } int refer_spec_const_array_length() { int len = global_vec4_array_with_spec_length.length(); return len; } void declare_spec_const_in_func() { //const nesting_struct spec_const_declared_in_func = { // spec_flat_struct_partial_spec, spec_vec4_partial_spec, 10}; //color /= spec_const_declared_in_func.i; } void main() {}