Home | History | Annotate | Download | only in shaders
      1 group extension_macros "Extension macro definitions"
      2 
      3 	case android_extension_pack_es31a
      4 		version 310 es
      5 		desc "Test GL_ANDROID_extension_pack_es31a macro"
      6 		require extension { "GL_ANDROID_extension_pack_es31a" }
      7 		values
      8 		{
      9 			output float out0 = 1.0;
     10 		}
     11 
     12 		vertex ""
     13 			#version 310 es
     14 			${VERTEX_DECLARATIONS}
     15 
     16 			void main()
     17 			{
     18 				${VERTEX_OUTPUT}
     19 			}
     20 		""
     21 		fragment ""
     22 			#version 310 es
     23 			precision mediump float;
     24 			${FRAGMENT_DECLARATIONS}
     25 
     26 			void main()
     27 			{
     28 				out0 = float(GL_ANDROID_extension_pack_es31a);
     29 				${FRAGMENT_OUTPUT}
     30 			}
     31 		""
     32 	end
     33 end
     34 
     35 group extension_directive "Extension directive"
     36 
     37 	case oes_sample_variables
     38 		version 310 es
     39 		desc "Test oes_sample_variables extension"
     40 		require extension { "GL_ANDROID_extension_pack_es31a" }
     41 		values
     42 		{
     43 			output float out0 = 1.0;
     44 		}
     45 
     46 		vertex ""
     47 			#version 310 es
     48 			${VERTEX_DECLARATIONS}
     49 
     50 			void main()
     51 			{
     52 				${VERTEX_OUTPUT}
     53 			}
     54 		""
     55 		fragment ""
     56 			#version 310 es
     57 			precision mediump float;
     58 			${FRAGMENT_DECLARATIONS}
     59 
     60 			void main()
     61 			{
     62 				out0 = (gl_SampleID < 0) ? (0.0) : (1.0);
     63 				${FRAGMENT_OUTPUT}
     64 			}
     65 		""
     66 	end
     67 
     68 	case oes_shader_image_atomic
     69 		version 310 es
     70 		desc "Test oes_shader_image_atomic extension"
     71 		require extension { "GL_ANDROID_extension_pack_es31a" }
     72 		expect build_successful
     73 
     74 		vertex ""
     75 			#version 310 es
     76 			${VERTEX_DECLARATIONS}
     77 
     78 			void main()
     79 			{
     80 				${VERTEX_OUTPUT}
     81 			}
     82 		""
     83 		fragment ""
     84 			#version 310 es
     85 			precision mediump float;
     86 			${FRAGMENT_DECLARATIONS}
     87 			layout(binding=0, r32i) coherent uniform highp iimage2D u_image;
     88 
     89 			void main()
     90 			{
     91 				if (imageAtomicXor(u_image, ivec2(0, 0), 1) == 0)
     92 					discard;
     93 				${FRAGMENT_OUTPUT}
     94 			}
     95 		""
     96 	end
     97 
     98 	case oes_shader_multisample_interpolation
     99 		version 310 es
    100 		desc "Test oes_shader_multisample_interpolation extension"
    101 		require extension { "GL_ANDROID_extension_pack_es31a" }
    102 		values
    103 		{
    104 			input float in0 = 1.0;
    105 			output float out0 = 1.0;
    106 		}
    107 
    108 		vertex ""
    109 			#version 310 es
    110 			${VERTEX_DECLARATIONS}
    111 			sample out highp float v_var;
    112 
    113 			void main()
    114 			{
    115 				v_var = in0;
    116 				${VERTEX_OUTPUT}
    117 			}
    118 		""
    119 		fragment ""
    120 			#version 310 es
    121 			precision mediump float;
    122 			${FRAGMENT_DECLARATIONS}
    123 			sample in mediump float v_var;
    124 
    125 			void main()
    126 			{
    127 				out0 = v_var;
    128 				${FRAGMENT_OUTPUT}
    129 			}
    130 		""
    131 	end
    132 
    133 	case oes_texture_storage_multisample_2d_array
    134 		version 310 es
    135 		desc "Test oes_texture_storage_multisample_2d_array extension"
    136 		require extension { "GL_ANDROID_extension_pack_es31a" }
    137 		expect build_successful
    138 
    139 		vertex ""
    140 			#version 310 es
    141 			${VERTEX_DECLARATIONS}
    142 
    143 			void main()
    144 			{
    145 				${VERTEX_OUTPUT}
    146 			}
    147 		""
    148 		fragment ""
    149 			#version 310 es
    150 			precision mediump float;
    151 			${FRAGMENT_DECLARATIONS}
    152 			uniform mediump sampler2DMSArray u_sampler;
    153 
    154 			void main()
    155 			{
    156 				if (texelFetch(u_sampler, ivec3(0, 0, 0), 0).r > 0.5)
    157 					discard;
    158 				${FRAGMENT_OUTPUT}
    159 			}
    160 		""
    161 	end
    162 
    163 	case ext_geometry_shader
    164 		version 310 es
    165 		desc "Test ext_geometry_shader extension"
    166 		require extension { "GL_ANDROID_extension_pack_es31a" }
    167 		values
    168 		{
    169 			input float in0 = 1.0;
    170 			output float out0 = 1.0;
    171 		}
    172 
    173 		vertex ""
    174 			#version 310 es
    175 			${VERTEX_DECLARATIONS}
    176 			out highp float geo_in;
    177 			void main()
    178 			{
    179 				geo_in = in0;
    180 				${VERTEX_OUTPUT}
    181 			}
    182 		""
    183 		geometry ""
    184 			#version 310 es
    185 			${GEOMETRY_DECLARATIONS}
    186 			in lowp float geo_in[];
    187 			out mediump float geo_out;
    188 			void main()
    189 			{
    190 				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
    191 				{
    192 					geo_out = geo_in[ndx];
    193 					gl_Position = gl_in[ndx].gl_Position;
    194 					EmitVertex();
    195 				}
    196 			}
    197 		""
    198 		fragment ""
    199 			#version 310 es
    200 			precision mediump float;
    201 			${FRAGMENT_DECLARATIONS}
    202 			in mediump float geo_out;
    203 			void main()
    204 			{
    205 				out0 = geo_out;
    206 				${FRAGMENT_OUTPUT}
    207 			}
    208 		""
    209 	end
    210 
    211 	case ext_gpu_shader5
    212 		version 310 es
    213 		desc "Test ext_gpu_shader5 extension"
    214 		require extension { "GL_ANDROID_extension_pack_es31a" }
    215 		values
    216 		{
    217 			input float in0 = 1.0;
    218 			output float out0 = 2.0;
    219 		}
    220 
    221 		vertex ""
    222 			#version 310 es
    223 			${VERTEX_DECLARATIONS}
    224 			out highp float v_var;
    225 			void main()
    226 			{
    227 				v_var = in0;
    228 				${VERTEX_OUTPUT}
    229 			}
    230 		""
    231 		fragment ""
    232 			#version 310 es
    233 			precision mediump float;
    234 			${FRAGMENT_DECLARATIONS}
    235 			in mediump float v_var;
    236 			void main()
    237 			{
    238 				precise float fmaResult = fma(v_var, v_var, v_var);
    239 				out0 = fmaResult;
    240 				${FRAGMENT_OUTPUT}
    241 			}
    242 		""
    243 	end
    244 
    245 	case ext_primitive_bounding_box
    246 		version 310 es
    247 		desc "Test ext_primitive_bounding_box extension"
    248 		require extension { "GL_ANDROID_extension_pack_es31a" }
    249 		values
    250 		{
    251 			input float in0 = 1.0;
    252 			output float out0 = 1.0;
    253 		}
    254 
    255 		vertex ""
    256 			#version 310 es
    257 			${VERTEX_DECLARATIONS}
    258 			out highp float tc_in;
    259 			void main()
    260 			{
    261 				tc_in = in0;
    262 				${VERTEX_OUTPUT}
    263 			}
    264 		""
    265 		tessellation_control ""
    266 			#version 310 es
    267 			${TESSELLATION_CONTROL_DECLARATIONS}
    268 			in highp float tc_in[];
    269 			out highp float tc_out[];
    270 			void main()
    271 			{
    272 				tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
    273 				// set bounding box to (-1,-1,-1, 1) .. (1,1,1,1)
    274 				gl_BoundingBoxEXT[0] = vec4(tc_in[0]-2.0, tc_in[1]-2.0, tc_in[2]-2.0, 1.0);
    275 				gl_BoundingBoxEXT[1] = vec4(tc_in[0], tc_in[1], tc_in[2], 1.0);
    276 				${TESSELLATION_CONTROL_OUTPUT}
    277 			}
    278 		""
    279 		tessellation_evaluation ""
    280 			#version 310 es
    281 			${TESSELLATION_EVALUATION_DECLARATIONS}
    282 			in highp float tc_out[];
    283 			out highp float te_out;
    284 			void main()
    285 			{
    286 				te_out = tc_out[2];
    287 				${TESSELLATION_EVALUATION_OUTPUT}
    288 			}
    289 		""
    290 		fragment ""
    291 			#version 310 es
    292 			precision mediump float;
    293 			${FRAGMENT_DECLARATIONS}
    294 			in mediump float te_out;
    295 			void main()
    296 			{
    297 				out0 = te_out;
    298 				${FRAGMENT_OUTPUT}
    299 			}
    300 		""
    301 	end
    302 
    303 	case ext_shader_io_blocks
    304 		version 310 es
    305 		desc "Test ext_shader_io_blocks extension"
    306 		require extension { "GL_ANDROID_extension_pack_es31a" }
    307 		values
    308 		{
    309 			input float in0 = 1.0;
    310 			output float out0 = 1.0;
    311 		}
    312 
    313 		vertex ""
    314 			#version 310 es
    315 			${VERTEX_DECLARATIONS}
    316 			out VaryingIOBlockName { highp float v_var; } instanceName;
    317 			void main()
    318 			{
    319 				instanceName.v_var = in0;
    320 				${VERTEX_OUTPUT}
    321 			}
    322 		""
    323 		fragment ""
    324 			#version 310 es
    325 			precision mediump float;
    326 			${FRAGMENT_DECLARATIONS}
    327 			in VaryingIOBlockName { highp float v_var; } instanceName;
    328 			void main()
    329 			{
    330 				out0 = instanceName.v_var;
    331 				${FRAGMENT_OUTPUT}
    332 			}
    333 		""
    334 	end
    335 
    336 	case ext_tessellation_shader
    337 		version 310 es
    338 		desc "Test ext_tessellation_shader extension"
    339 		require extension { "GL_ANDROID_extension_pack_es31a" }
    340 		values
    341 		{
    342 			input float in0 = 1.0;
    343 			output float out0 = 1.0;
    344 		}
    345 
    346 		vertex ""
    347 			#version 310 es
    348 			${VERTEX_DECLARATIONS}
    349 			out highp float tc_in;
    350 			void main()
    351 			{
    352 				tc_in = in0;
    353 				${VERTEX_OUTPUT}
    354 			}
    355 		""
    356 		tessellation_control ""
    357 			#version 310 es
    358 			${TESSELLATION_CONTROL_DECLARATIONS}
    359 			in highp float tc_in[];
    360 			out highp float tc_out[];
    361 			void main()
    362 			{
    363 				tc_out[gl_InvocationID] = tc_in[gl_InvocationID];
    364 				${TESSELLATION_CONTROL_OUTPUT}
    365 			}
    366 		""
    367 		tessellation_evaluation ""
    368 			#version 310 es
    369 			${TESSELLATION_EVALUATION_DECLARATIONS}
    370 			in highp float tc_out[];
    371 			out highp float te_out;
    372 			void main()
    373 			{
    374 				te_out = tc_out[2];
    375 				${TESSELLATION_EVALUATION_OUTPUT}
    376 			}
    377 		""
    378 		fragment ""
    379 			#version 310 es
    380 			precision mediump float;
    381 			${FRAGMENT_DECLARATIONS}
    382 			in mediump float te_out;
    383 			void main()
    384 			{
    385 				out0 = te_out;
    386 				${FRAGMENT_OUTPUT}
    387 			}
    388 		""
    389 	end
    390 
    391 	case ext_texture_buffer
    392 		version 310 es
    393 		desc "Test ext_texture_buffer extension"
    394 		require extension { "GL_ANDROID_extension_pack_es31a" }
    395 		expect build_successful
    396 
    397 		vertex ""
    398 			#version 310 es
    399 			${VERTEX_DECLARATIONS}
    400 
    401 			void main()
    402 			{
    403 				${VERTEX_OUTPUT}
    404 			}
    405 		""
    406 		fragment ""
    407 			#version 310 es
    408 			precision mediump float;
    409 			${FRAGMENT_DECLARATIONS}
    410 			uniform mediump samplerBuffer u_sampler;
    411 
    412 			void main()
    413 			{
    414 				if (textureSize(u_sampler) > 10)
    415 					discard;
    416 				${FRAGMENT_OUTPUT}
    417 			}
    418 		""
    419 	end
    420 
    421 	case ext_texture_cube_map_array
    422 		version 310 es
    423 		desc "Test ext_texture_cube_map_array extension"
    424 		require extension { "GL_ANDROID_extension_pack_es31a" }
    425 		expect build_successful
    426 
    427 		vertex ""
    428 			#version 310 es
    429 			${VERTEX_DECLARATIONS}
    430 
    431 			void main()
    432 			{
    433 				${VERTEX_OUTPUT}
    434 			}
    435 		""
    436 		fragment ""
    437 			#version 310 es
    438 			precision mediump float;
    439 			${FRAGMENT_DECLARATIONS}
    440 			uniform mediump samplerCubeArray u_sampler;
    441 
    442 			void main()
    443 			{
    444 				if (textureSize(u_sampler, 3).y > 10)
    445 					discard;
    446 				${FRAGMENT_OUTPUT}
    447 			}
    448 		""
    449 	end
    450 end
    451 
    452 group implementation_limits "Extended implementation limits"
    453 
    454 	case max_fragment_atomic_counter_buffers
    455 		version 310 es
    456 		desc "Test MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS limit"
    457 		require extension { "GL_ANDROID_extension_pack_es31a" }
    458 		expect build_successful
    459 
    460 		vertex ""
    461 			#version 310 es
    462 			${VERTEX_DECLARATIONS}
    463 
    464 			void main()
    465 			{
    466 				${VERTEX_OUTPUT}
    467 			}
    468 		""
    469 		fragment ""
    470 			#version 310 es
    471 			precision mediump float;
    472 			${FRAGMENT_DECLARATIONS}
    473 			layout(binding=0) uniform atomic_uint u_counter;
    474 
    475 			void main()
    476 			{
    477 				if (atomicCounterIncrement(u_counter) == 0u)
    478 					discard;
    479 				${FRAGMENT_OUTPUT}
    480 			}
    481 		""
    482 	end
    483 
    484 	case max_fragment_atomic_counters
    485 		version 310 es
    486 		desc "Test MAX_FRAGMENT_ATOMIC_COUNTERS limit"
    487 		require extension { "GL_ANDROID_extension_pack_es31a" }
    488 		expect build_successful
    489 
    490 		vertex ""
    491 			#version 310 es
    492 			${VERTEX_DECLARATIONS}
    493 
    494 			void main()
    495 			{
    496 				${VERTEX_OUTPUT}
    497 			}
    498 		""
    499 		fragment ""
    500 			#version 310 es
    501 			precision mediump float;
    502 			${FRAGMENT_DECLARATIONS}
    503 			layout(binding=0) uniform atomic_uint u_counter[8];
    504 
    505 			void main()
    506 			{
    507 				if (atomicCounterIncrement(u_counter[0]) == 0u)
    508 					discard;
    509 				if (atomicCounterIncrement(u_counter[1]) == 0u)
    510 					discard;
    511 				if (atomicCounterIncrement(u_counter[2]) == 0u)
    512 					discard;
    513 				if (atomicCounterIncrement(u_counter[3]) == 0u)
    514 					discard;
    515 				if (atomicCounterIncrement(u_counter[4]) == 0u)
    516 					discard;
    517 				if (atomicCounterIncrement(u_counter[5]) == 0u)
    518 					discard;
    519 				if (atomicCounterIncrement(u_counter[6]) == 0u)
    520 					discard;
    521 				if (atomicCounterIncrement(u_counter[7]) == 0u)
    522 					discard;
    523 				${FRAGMENT_OUTPUT}
    524 			}
    525 		""
    526 	end
    527 
    528 	case max_fragment_image_uniforms
    529 		version 310 es
    530 		desc "Test MAX_FRAGMENT_IMAGE_UNIFORMS limit"
    531 		require extension { "GL_ANDROID_extension_pack_es31a" }
    532 		expect build_successful
    533 
    534 		vertex ""
    535 			#version 310 es
    536 			${VERTEX_DECLARATIONS}
    537 
    538 			void main()
    539 			{
    540 				${VERTEX_OUTPUT}
    541 			}
    542 		""
    543 		fragment ""
    544 			#version 310 es
    545 			precision mediump float;
    546 			${FRAGMENT_DECLARATIONS}
    547 			layout(binding=0, r32i) uniform readonly highp iimage2D u_image0;
    548 			layout(binding=1, rgba16i) uniform readonly highp iimage3D u_image1;
    549 			layout(binding=2, rgba8ui) uniform readonly highp uimageCube u_image2;
    550 			layout(binding=3, rgba16f) uniform readonly highp image2DArray u_image3;
    551 
    552 			void main()
    553 			{
    554 				if (imageLoad(u_image0, ivec2(0, 0)).r == 0)
    555 					discard;
    556 				if (imageLoad(u_image1, ivec3(0, 0, 0)).r == 0)
    557 					discard;
    558 				if (imageLoad(u_image2, ivec3(0, 0, 0)).r == 0u)
    559 					discard;
    560 				if (imageLoad(u_image3, ivec3(0, 0, 0)).r == 0.0)
    561 					discard;
    562 				${FRAGMENT_OUTPUT}
    563 			}
    564 		""
    565 	end
    566 
    567 	case max_fragment_shader_storage_blocks
    568 		version 310 es
    569 		desc "Test MAX_FRAGMENT_SHADER_STORAGE_BLOCKS limit"
    570 		require extension { "GL_ANDROID_extension_pack_es31a" }
    571 		expect build_successful
    572 
    573 		vertex ""
    574 			#version 310 es
    575 			${VERTEX_DECLARATIONS}
    576 
    577 			void main()
    578 			{
    579 				${VERTEX_OUTPUT}
    580 			}
    581 		""
    582 		fragment ""
    583 			#version 310 es
    584 			precision mediump float;
    585 			${FRAGMENT_DECLARATIONS}
    586 			layout(binding=0, std430) coherent readonly buffer Buffer0
    587 			{
    588 				highp int val;
    589 				highp float vals[32];
    590 			} buffer0;
    591 			layout(binding=1, std140) volatile buffer Buffer1
    592 			{
    593 				highp float vals[];
    594 			} buffer1;
    595 			layout(binding=2, packed) restrict buffer Buffer2
    596 			{
    597 				highp int vals[15];
    598 			} buffer2;
    599 			layout(binding=3, std140) writeonly buffer Buffer3
    600 			{
    601 				highp vec3 vals[8];
    602 			} buffer3;
    603 
    604 			void main()
    605 			{
    606 				highp int readNdx = abs(int(gl_FragCoord.x));
    607 				highp int writeNdx = abs(int(gl_FragCoord.y));
    608 
    609 				if (buffer0.vals[readNdx % 32] == 0.0)
    610 					discard;
    611 
    612 				if (buffer1.vals[readNdx % 1024] == 0.0)
    613 					discard;
    614 				buffer1.vals[writeNdx % 1024] = float(readNdx);
    615 
    616 				if (buffer2.vals[readNdx % 15] == 0)
    617 					discard;
    618 				buffer2.vals[writeNdx % 15] = readNdx;
    619 
    620 				buffer3.vals[writeNdx % 8] = vec3(float(writeNdx), 0.0, float(readNdx));
    621 				${FRAGMENT_OUTPUT}
    622 			}
    623 		""
    624 	end
    625 end
    626