| group extension_macros "Extension macro definitions" |
| |
| case android_extension_pack_es31a |
| version 310 es |
| desc "Test GL_ANDROID_extension_pack_es31a macro" |
| require extension { "GL_ANDROID_extension_pack_es31a" } |
| values |
| { |
| output float out0 = 1.0; |
| } |
| |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| |
| void main() |
| { |
| out0 = float(GL_ANDROID_extension_pack_es31a); |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| end |
| |
| group extension_directive "Extension directive" |
| |
| case oes_sample_variables |
| version 310 es |
| desc "Test oes_sample_variables extension" |
| require extension { "GL_ANDROID_extension_pack_es31a" } |
| values |
| { |
| output float out0 = 1.0; |
| } |
| |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| |
| void main() |
| { |
| out0 = (gl_SampleID < 0) ? (0.0) : (1.0); |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case oes_shader_image_atomic |
| version 310 es |
| desc "Test oes_shader_image_atomic extension" |
| require extension { "GL_ANDROID_extension_pack_es31a" } |
| expect build_successful |
| |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| layout(binding=0, r32i) coherent uniform highp iimage2D u_image; |
| |
| void main() |
| { |
| if (imageAtomicXor(u_image, ivec2(0, 0), 1) == 0) |
| discard; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case oes_shader_multisample_interpolation |
| version 310 es |
| desc "Test oes_shader_multisample_interpolation extension" |
| require extension { "GL_ANDROID_extension_pack_es31a" } |
| values |
| { |
| input float in0 = 1.0; |
| output float out0 = 1.0; |
| } |
| |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| sample out highp float v_var; |
| |
| void main() |
| { |
| v_var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| sample in mediump float v_var; |
| |
| void main() |
| { |
| out0 = v_var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case oes_texture_storage_multisample_2d_array |
| version 310 es |
| desc "Test oes_texture_storage_multisample_2d_array extension" |
| require extension { "GL_ANDROID_extension_pack_es31a" } |
| expect build_successful |
| |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| uniform mediump sampler2DMSArray u_sampler; |
| |
| void main() |
| { |
| if (texelFetch(u_sampler, ivec3(0, 0, 0), 0).r > 0.5) |
| discard; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case ext_geometry_shader |
| version 310 es |
| desc "Test ext_geometry_shader extension" |
| require extension { "GL_ANDROID_extension_pack_es31a" } |
| values |
| { |
| input float in0 = 1.0; |
| output float out0 = 1.0; |
| } |
| |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| out highp float geo_in; |
| void main() |
| { |
| geo_in = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| geometry "" |
| #version 310 es |
| ${GEOMETRY_DECLARATIONS} |
| in lowp float geo_in[]; |
| out mediump float geo_out; |
| void main() |
| { |
| for (int ndx = 0; ndx < gl_in.length(); ++ndx) |
| { |
| geo_out = geo_in[ndx]; |
| gl_Position = gl_in[ndx].gl_Position; |
| EmitVertex(); |
| } |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float geo_out; |
| void main() |
| { |
| out0 = geo_out; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case ext_gpu_shader5 |
| version 310 es |
| desc "Test ext_gpu_shader5 extension" |
| require extension { "GL_ANDROID_extension_pack_es31a" } |
| values |
| { |
| input float in0 = 1.0; |
| output float out0 = 2.0; |
| } |
| |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| out highp float v_var; |
| void main() |
| { |
| v_var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float v_var; |
| void main() |
| { |
| precise float fmaResult = fma(v_var, v_var, v_var); |
| out0 = fmaResult; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case ext_primitive_bounding_box |
| version 310 es |
| desc "Test ext_primitive_bounding_box extension" |
| require extension { "GL_ANDROID_extension_pack_es31a" } |
| values |
| { |
| input float in0 = 1.0; |
| output float out0 = 1.0; |
| } |
| |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| out highp float tc_in; |
| void main() |
| { |
| tc_in = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| tessellation_control "" |
| #version 310 es |
| ${TESSELLATION_CONTROL_DECLARATIONS} |
| in highp float tc_in[]; |
| out highp float tc_out[]; |
| void main() |
| { |
| tc_out[gl_InvocationID] = tc_in[gl_InvocationID]; |
| // set bounding box to (-1,-1,-1, 1) .. (1,1,1,1) |
| gl_BoundingBoxEXT[0] = vec4(tc_in[0]-2.0, tc_in[1]-2.0, tc_in[2]-2.0, 1.0); |
| gl_BoundingBoxEXT[1] = vec4(tc_in[0], tc_in[1], tc_in[2], 1.0); |
| ${TESSELLATION_CONTROL_OUTPUT} |
| } |
| "" |
| tessellation_evaluation "" |
| #version 310 es |
| ${TESSELLATION_EVALUATION_DECLARATIONS} |
| in highp float tc_out[]; |
| out highp float te_out; |
| void main() |
| { |
| te_out = tc_out[2]; |
| ${TESSELLATION_EVALUATION_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float te_out; |
| void main() |
| { |
| out0 = te_out; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case ext_shader_io_blocks |
| version 310 es |
| desc "Test ext_shader_io_blocks extension" |
| require extension { "GL_ANDROID_extension_pack_es31a" } |
| values |
| { |
| input float in0 = 1.0; |
| output float out0 = 1.0; |
| } |
| |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| out VaryingIOBlockName { highp float v_var; } instanceName; |
| void main() |
| { |
| instanceName.v_var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in VaryingIOBlockName { highp float v_var; } instanceName; |
| void main() |
| { |
| out0 = instanceName.v_var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case ext_tessellation_shader |
| version 310 es |
| desc "Test ext_tessellation_shader extension" |
| require extension { "GL_ANDROID_extension_pack_es31a" } |
| values |
| { |
| input float in0 = 1.0; |
| output float out0 = 1.0; |
| } |
| |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| out highp float tc_in; |
| void main() |
| { |
| tc_in = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| tessellation_control "" |
| #version 310 es |
| ${TESSELLATION_CONTROL_DECLARATIONS} |
| in highp float tc_in[]; |
| out highp float tc_out[]; |
| void main() |
| { |
| tc_out[gl_InvocationID] = tc_in[gl_InvocationID]; |
| ${TESSELLATION_CONTROL_OUTPUT} |
| } |
| "" |
| tessellation_evaluation "" |
| #version 310 es |
| ${TESSELLATION_EVALUATION_DECLARATIONS} |
| in highp float tc_out[]; |
| out highp float te_out; |
| void main() |
| { |
| te_out = tc_out[2]; |
| ${TESSELLATION_EVALUATION_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float te_out; |
| void main() |
| { |
| out0 = te_out; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case ext_texture_buffer |
| version 310 es |
| desc "Test ext_texture_buffer extension" |
| require extension { "GL_ANDROID_extension_pack_es31a" } |
| expect build_successful |
| |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| uniform mediump samplerBuffer u_sampler; |
| |
| void main() |
| { |
| if (textureSize(u_sampler) > 10) |
| discard; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case ext_texture_cube_map_array |
| version 310 es |
| desc "Test ext_texture_cube_map_array extension" |
| require extension { "GL_ANDROID_extension_pack_es31a" } |
| expect build_successful |
| |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| uniform mediump samplerCubeArray u_sampler; |
| |
| void main() |
| { |
| if (textureSize(u_sampler, 3).y > 10) |
| discard; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| end |
| |
| group implementation_limits "Extended implementation limits" |
| |
| case max_fragment_atomic_counter_buffers |
| version 310 es |
| desc "Test MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS limit" |
| require extension { "GL_ANDROID_extension_pack_es31a" } |
| expect build_successful |
| |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| layout(binding=0) uniform atomic_uint u_counter; |
| |
| void main() |
| { |
| if (atomicCounterIncrement(u_counter) == 0u) |
| discard; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case max_fragment_atomic_counters |
| version 310 es |
| desc "Test MAX_FRAGMENT_ATOMIC_COUNTERS limit" |
| require extension { "GL_ANDROID_extension_pack_es31a" } |
| expect build_successful |
| |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| layout(binding=0) uniform atomic_uint u_counter[8]; |
| |
| void main() |
| { |
| if (atomicCounterIncrement(u_counter[0]) == 0u) |
| discard; |
| if (atomicCounterIncrement(u_counter[1]) == 0u) |
| discard; |
| if (atomicCounterIncrement(u_counter[2]) == 0u) |
| discard; |
| if (atomicCounterIncrement(u_counter[3]) == 0u) |
| discard; |
| if (atomicCounterIncrement(u_counter[4]) == 0u) |
| discard; |
| if (atomicCounterIncrement(u_counter[5]) == 0u) |
| discard; |
| if (atomicCounterIncrement(u_counter[6]) == 0u) |
| discard; |
| if (atomicCounterIncrement(u_counter[7]) == 0u) |
| discard; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case max_fragment_image_uniforms |
| version 310 es |
| desc "Test MAX_FRAGMENT_IMAGE_UNIFORMS limit" |
| require extension { "GL_ANDROID_extension_pack_es31a" } |
| expect build_successful |
| |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| layout(binding=0, r32i) uniform readonly highp iimage2D u_image0; |
| layout(binding=1, rgba16i) uniform readonly highp iimage3D u_image1; |
| layout(binding=2, rgba8ui) uniform readonly highp uimageCube u_image2; |
| layout(binding=3, rgba16f) uniform readonly highp image2DArray u_image3; |
| |
| void main() |
| { |
| if (imageLoad(u_image0, ivec2(0, 0)).r == 0) |
| discard; |
| if (imageLoad(u_image1, ivec3(0, 0, 0)).r == 0) |
| discard; |
| if (imageLoad(u_image2, ivec3(0, 0, 0)).r == 0u) |
| discard; |
| if (imageLoad(u_image3, ivec3(0, 0, 0)).r == 0.0) |
| discard; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case max_fragment_shader_storage_blocks |
| version 310 es |
| desc "Test MAX_FRAGMENT_SHADER_STORAGE_BLOCKS limit" |
| require extension { "GL_ANDROID_extension_pack_es31a" } |
| expect build_successful |
| |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| layout(binding=0, std430) coherent readonly buffer Buffer0 |
| { |
| highp int val; |
| highp float vals[32]; |
| } buffer0; |
| layout(binding=1, std140) volatile buffer Buffer1 |
| { |
| highp float vals[]; |
| } buffer1; |
| layout(binding=2, packed) restrict buffer Buffer2 |
| { |
| highp int vals[15]; |
| } buffer2; |
| layout(binding=3, std140) writeonly buffer Buffer3 |
| { |
| highp vec3 vals[8]; |
| } buffer3; |
| |
| void main() |
| { |
| highp int readNdx = abs(int(gl_FragCoord.x)); |
| highp int writeNdx = abs(int(gl_FragCoord.y)); |
| |
| if (buffer0.vals[readNdx % 32] == 0.0) |
| discard; |
| |
| if (buffer1.vals[readNdx % 1024] == 0.0) |
| discard; |
| buffer1.vals[writeNdx % 1024] = float(readNdx); |
| |
| if (buffer2.vals[readNdx % 15] == 0) |
| discard; |
| buffer2.vals[writeNdx % 15] = readNdx; |
| |
| buffer3.vals[writeNdx % 8] = vec3(float(writeNdx), 0.0, float(readNdx)); |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| end |