629 lines
12 KiB
Plaintext
629 lines
12 KiB
Plaintext
# -------------------------------------------------
|
|
# drawElements Quality Program OpenGL ES 3.2 Module
|
|
# -------------------------------------------------
|
|
#
|
|
# Copyright 2016 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
|
|
group extension_macros "Extension macro definitions"
|
|
|
|
case android_extension_pack_es31a
|
|
version 320 es
|
|
desc "Test GL_ANDROID_extension_pack_es31a macro"
|
|
values
|
|
{
|
|
output float out0 = 1.0;
|
|
}
|
|
|
|
vertex ""
|
|
#version 320 es
|
|
${VERTEX_DECLARATIONS}
|
|
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 320 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 320 es
|
|
desc "Test oes_sample_variables extension"
|
|
values
|
|
{
|
|
output float out0 = 1.0;
|
|
}
|
|
|
|
vertex ""
|
|
#version 320 es
|
|
${VERTEX_DECLARATIONS}
|
|
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 320 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 320 es
|
|
desc "Test oes_shader_image_atomic extension"
|
|
expect build_successful
|
|
|
|
vertex ""
|
|
#version 320 es
|
|
${VERTEX_DECLARATIONS}
|
|
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 320 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 320 es
|
|
desc "Test oes_shader_multisample_interpolation extension"
|
|
values
|
|
{
|
|
input float in0 = 1.0;
|
|
output float out0 = 1.0;
|
|
}
|
|
|
|
vertex ""
|
|
#version 320 es
|
|
${VERTEX_DECLARATIONS}
|
|
sample out highp float v_var;
|
|
|
|
void main()
|
|
{
|
|
v_var = in0;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 320 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 320 es
|
|
desc "Test oes_texture_storage_multisample_2d_array extension"
|
|
expect build_successful
|
|
|
|
vertex ""
|
|
#version 320 es
|
|
${VERTEX_DECLARATIONS}
|
|
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 320 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 320 es
|
|
desc "Test ext_geometry_shader extension"
|
|
values
|
|
{
|
|
input float in0 = 1.0;
|
|
output float out0 = 1.0;
|
|
}
|
|
|
|
vertex ""
|
|
#version 320 es
|
|
${VERTEX_DECLARATIONS}
|
|
out highp float geo_in;
|
|
void main()
|
|
{
|
|
geo_in = in0;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
geometry ""
|
|
#version 320 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 320 es
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float geo_out;
|
|
void main()
|
|
{
|
|
out0 = geo_out;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case ext_gpu_shader5
|
|
version 320 es
|
|
desc "Test ext_gpu_shader5 extension"
|
|
values
|
|
{
|
|
input float in0 = 1.0;
|
|
output float out0 = 2.0;
|
|
}
|
|
|
|
vertex ""
|
|
#version 320 es
|
|
${VERTEX_DECLARATIONS}
|
|
out highp float v_var;
|
|
void main()
|
|
{
|
|
v_var = in0;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 320 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 320 es
|
|
desc "Test ext_primitive_bounding_box extension"
|
|
values
|
|
{
|
|
input float in0 = 1.0;
|
|
output float out0 = 1.0;
|
|
}
|
|
|
|
vertex ""
|
|
#version 320 es
|
|
${VERTEX_DECLARATIONS}
|
|
out highp float tc_in;
|
|
void main()
|
|
{
|
|
tc_in = in0;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_control ""
|
|
#version 320 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_BoundingBox[0] = vec4(tc_in[0]-2.0, tc_in[1]-2.0, tc_in[2]-2.0, 1.0);
|
|
gl_BoundingBox[1] = vec4(tc_in[0], tc_in[1], tc_in[2], 1.0);
|
|
${TESSELLATION_CONTROL_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_evaluation ""
|
|
#version 320 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 320 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 320 es
|
|
desc "Test ext_shader_io_blocks extension"
|
|
values
|
|
{
|
|
input float in0 = 1.0;
|
|
output float out0 = 1.0;
|
|
}
|
|
|
|
vertex ""
|
|
#version 320 es
|
|
${VERTEX_DECLARATIONS}
|
|
out VaryingIOBlockName { highp float v_var; } instanceName;
|
|
void main()
|
|
{
|
|
instanceName.v_var = in0;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 320 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 320 es
|
|
desc "Test ext_tessellation_shader extension"
|
|
values
|
|
{
|
|
input float in0 = 1.0;
|
|
output float out0 = 1.0;
|
|
}
|
|
|
|
vertex ""
|
|
#version 320 es
|
|
${VERTEX_DECLARATIONS}
|
|
out highp float tc_in;
|
|
void main()
|
|
{
|
|
tc_in = in0;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
tessellation_control ""
|
|
#version 320 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 320 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 320 es
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float te_out;
|
|
void main()
|
|
{
|
|
out0 = te_out;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case ext_texture_buffer
|
|
version 320 es
|
|
desc "Test ext_texture_buffer extension"
|
|
expect build_successful
|
|
|
|
vertex ""
|
|
#version 320 es
|
|
${VERTEX_DECLARATIONS}
|
|
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 320 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 320 es
|
|
desc "Test ext_texture_cube_map_array extension"
|
|
expect build_successful
|
|
|
|
vertex ""
|
|
#version 320 es
|
|
${VERTEX_DECLARATIONS}
|
|
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 320 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 320 es
|
|
desc "Test MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS limit"
|
|
expect build_successful
|
|
|
|
vertex ""
|
|
#version 320 es
|
|
${VERTEX_DECLARATIONS}
|
|
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 320 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 320 es
|
|
desc "Test MAX_FRAGMENT_ATOMIC_COUNTERS limit"
|
|
expect build_successful
|
|
|
|
vertex ""
|
|
#version 320 es
|
|
${VERTEX_DECLARATIONS}
|
|
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 320 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 320 es
|
|
desc "Test MAX_FRAGMENT_IMAGE_UNIFORMS limit"
|
|
expect build_successful
|
|
|
|
vertex ""
|
|
#version 320 es
|
|
${VERTEX_DECLARATIONS}
|
|
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 320 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 320 es
|
|
desc "Test MAX_FRAGMENT_SHADER_STORAGE_BLOCKS limit"
|
|
expect build_successful
|
|
|
|
vertex ""
|
|
#version 320 es
|
|
${VERTEX_DECLARATIONS}
|
|
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 320 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
|