Test gl_RayFlagsSkipTrianglesEXT and gl_RayFlagsSkipAABBEXT

Test support for following GLSL flags:
 * gl_RayFlagsSkipTrianglesEXT
 * gl_RayFlagsSkipAABBEXT
as well as pipeline creation flags:
 * VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR
 * VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR

Update and refreshes tests:
 * dEQP-VK.ray_tracing.builtin.incomingrayflagsext.*

Components: Vulkan

VK-GL-CTS issue: 2337, 2199

Change-Id: Ic8d944618cda035511c7cafac4f02df4d9051a2c
diff --git a/android/cts/master/vk-master-2020-03-01.txt b/android/cts/master/vk-master-2020-03-01.txt
index 0cfd254..222c69a 100644
--- a/android/cts/master/vk-master-2020-03-01.txt
+++ b/android/cts/master/vk-master-2020-03-01.txt
@@ -204951,20 +204951,258 @@
 dEQP-VK.ray_tracing.builtin.raytmaxext.chit_aabs
 dEQP-VK.ray_tracing.builtin.raytmaxext.sect_aabs
 dEQP-VK.ray_tracing.builtin.raytmaxext.miss_aabs
-dEQP-VK.ray_tracing.builtin.incomingrayflagsext.ahit_triangles
-dEQP-VK.ray_tracing.builtin.incomingrayflagsext.ahit_triangles_culling
-dEQP-VK.ray_tracing.builtin.incomingrayflagsext.chit_triangles
-dEQP-VK.ray_tracing.builtin.incomingrayflagsext.chit_triangles_culling
-dEQP-VK.ray_tracing.builtin.incomingrayflagsext.miss_triangles
-dEQP-VK.ray_tracing.builtin.incomingrayflagsext.miss_triangles_culling
-dEQP-VK.ray_tracing.builtin.incomingrayflagsext.ahit_aabs
-dEQP-VK.ray_tracing.builtin.incomingrayflagsext.ahit_aabs_culling
-dEQP-VK.ray_tracing.builtin.incomingrayflagsext.chit_aabs
-dEQP-VK.ray_tracing.builtin.incomingrayflagsext.chit_aabs_culling
-dEQP-VK.ray_tracing.builtin.incomingrayflagsext.sect_aabs
-dEQP-VK.ray_tracing.builtin.incomingrayflagsext.sect_aabs_culling
-dEQP-VK.ray_tracing.builtin.incomingrayflagsext.miss_aabs
-dEQP-VK.ray_tracing.builtin.incomingrayflagsext.miss_aabs_culling
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelinenoskipflags.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelinenoskipflags.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelinenoskipflags.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelinenoskipflags.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelinenoskipflags.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelinenoskipflags.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelinenoskipflags.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelinenoskipflags.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelinenoskipflags.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelinenoskipflags.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelinenoskipflags.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelinenoskipflags.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskiptriangles.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskiptriangles.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskiptriangles.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskiptriangles.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskiptriangles.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskiptriangles.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskiptriangles.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskiptriangles.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskiptriangles.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskiptriangles.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskiptriangles.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskiptriangles.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskipaabbs.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskipaabbs.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskipaabbs.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskipaabbs.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskipaabbs.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskipaabbs.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskipaabbs.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskipaabbs.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskipaabbs.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskipaabbs.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskipaabbs.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.raynoskipflags.pipelineskipaabbs.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelinenoskipflags.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelinenoskipflags.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelinenoskipflags.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelinenoskipflags.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelinenoskipflags.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelinenoskipflags.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelinenoskipflags.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelinenoskipflags.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelinenoskipflags.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelinenoskipflags.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelinenoskipflags.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelinenoskipflags.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskiptriangles.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskiptriangles.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskiptriangles.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskiptriangles.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskiptriangles.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskiptriangles.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskiptriangles.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskiptriangles.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskiptriangles.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskiptriangles.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskiptriangles.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskiptriangles.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskipaabbs.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskipaabbs.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskipaabbs.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskipaabbs.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskipaabbs.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskipaabbs.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskipaabbs.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskipaabbs.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskipaabbs.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskipaabbs.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskipaabbs.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskiptriangles.pipelineskipaabbs.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelinenoskipflags.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelinenoskipflags.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelinenoskipflags.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelinenoskipflags.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelinenoskipflags.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelinenoskipflags.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelinenoskipflags.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelinenoskipflags.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelinenoskipflags.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelinenoskipflags.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelinenoskipflags.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelinenoskipflags.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskiptriangles.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskiptriangles.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskiptriangles.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskiptriangles.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskiptriangles.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskiptriangles.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskiptriangles.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskiptriangles.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskiptriangles.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskiptriangles.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskiptriangles.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskiptriangles.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskipaabbs.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskipaabbs.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskipaabbs.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskipaabbs.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskipaabbs.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskipaabbs.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskipaabbs.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskipaabbs.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskipaabbs.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskipaabbs.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskipaabbs.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.triangles.rayskipaabbs.pipelineskipaabbs.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelinenoskipflags.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelinenoskipflags.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelinenoskipflags.opaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelinenoskipflags.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelinenoskipflags.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelinenoskipflags.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelinenoskipflags.opaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelinenoskipflags.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelinenoskipflags.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelinenoskipflags.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelinenoskipflags.noopaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelinenoskipflags.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelinenoskipflags.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelinenoskipflags.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelinenoskipflags.noopaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelinenoskipflags.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskiptriangles.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskiptriangles.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskiptriangles.opaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskiptriangles.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskiptriangles.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskiptriangles.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskiptriangles.opaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskiptriangles.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskiptriangles.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskiptriangles.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskiptriangles.noopaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskiptriangles.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskiptriangles.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskiptriangles.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskiptriangles.noopaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskiptriangles.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskipaabbs.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskipaabbs.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskipaabbs.opaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskipaabbs.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskipaabbs.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskipaabbs.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskipaabbs.opaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskipaabbs.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskipaabbs.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskipaabbs.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskipaabbs.noopaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskipaabbs.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskipaabbs.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskipaabbs.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskipaabbs.noopaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.raynoskipflags.pipelineskipaabbs.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelinenoskipflags.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelinenoskipflags.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelinenoskipflags.opaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelinenoskipflags.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelinenoskipflags.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelinenoskipflags.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelinenoskipflags.opaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelinenoskipflags.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelinenoskipflags.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelinenoskipflags.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelinenoskipflags.noopaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelinenoskipflags.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelinenoskipflags.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelinenoskipflags.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelinenoskipflags.noopaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelinenoskipflags.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskiptriangles.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskiptriangles.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskiptriangles.opaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskiptriangles.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskiptriangles.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskiptriangles.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskiptriangles.opaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskiptriangles.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskiptriangles.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskiptriangles.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskiptriangles.noopaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskiptriangles.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskiptriangles.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskiptriangles.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskiptriangles.noopaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskiptriangles.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskipaabbs.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskipaabbs.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskipaabbs.opaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskipaabbs.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskipaabbs.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskipaabbs.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskipaabbs.opaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskipaabbs.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskipaabbs.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskipaabbs.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskipaabbs.noopaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskipaabbs.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskipaabbs.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskipaabbs.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskipaabbs.noopaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskiptriangles.pipelineskipaabbs.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelinenoskipflags.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelinenoskipflags.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelinenoskipflags.opaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelinenoskipflags.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelinenoskipflags.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelinenoskipflags.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelinenoskipflags.opaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelinenoskipflags.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelinenoskipflags.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelinenoskipflags.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelinenoskipflags.noopaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelinenoskipflags.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelinenoskipflags.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelinenoskipflags.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelinenoskipflags.noopaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelinenoskipflags.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskiptriangles.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskiptriangles.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskiptriangles.opaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskiptriangles.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskiptriangles.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskiptriangles.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskiptriangles.opaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskiptriangles.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskiptriangles.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskiptriangles.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskiptriangles.noopaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskiptriangles.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskiptriangles.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskiptriangles.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskiptriangles.noopaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskiptriangles.noopaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskipaabbs.opaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskipaabbs.opaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskipaabbs.opaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskipaabbs.opaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskipaabbs.opaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskipaabbs.opaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskipaabbs.opaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskipaabbs.opaque_backface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskipaabbs.noopaque_frontface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskipaabbs.noopaque_frontface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskipaabbs.noopaque_frontface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskipaabbs.noopaque_frontface.miss
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskipaabbs.noopaque_backface.ahit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskipaabbs.noopaque_backface.chit
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskipaabbs.noopaque_backface.sect
+dEQP-VK.ray_tracing.builtin.incomingrayflagsext.aabs.rayskipaabbs.pipelineskipaabbs.noopaque_backface.miss
 dEQP-VK.ray_tracing.builtin.hittext.ahit_triangles
 dEQP-VK.ray_tracing.builtin.hittext.chit_triangles
 dEQP-VK.ray_tracing.builtin.hittext.ahit_aabs
diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt
index 3551bde..597c93a 100644
--- a/android/cts/master/vk-master.txt
+++ b/android/cts/master/vk-master.txt
Binary files differ
diff --git a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBuiltinTests.cpp b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBuiltinTests.cpp
index 516d2fe..8cd695d 100644
--- a/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBuiltinTests.cpp
+++ b/external/vulkancts/modules/vulkan/ray_tracing/vktRayTracingBuiltinTests.cpp
@@ -98,6 +98,7 @@
 	RAY_FLAG_BIT_CULL_FRONT_FACING_TRIANGLES_EXT	= 5,	//  const uint gl_RayFlagsCullFrontFacingTrianglesEXT = 32U;
 	RAY_FLAG_BIT_CULL_OPAQUE_EXT					= 6,	//  const uint gl_RayFlagsCullOpaqueEXT = 64U;
 	RAY_FLAG_BIT_CULL_NO_OPAQUE_EXT					= 7,	//  const uint gl_RayFlagsCullNoOpaqueEXT = 128U;
+	RAY_FLAG_BIT_LAST_PER_TEST,
 	RAY_FLAG_BIT_SKIP_TRIANGLES_EXT					= 8,	//  const uint gl_RayFlagsSkipTrianglesEXT = 256U;
 	RAY_FLAG_BIT_SKIP_AABB_EXT						= 9,	//  const uint gl_RayFlagsSkipAABBEXT = 512U;
 	RAY_FLAG_BIT_LAST
@@ -120,7 +121,11 @@
 	deUint32				geometriesGroupCount;
 	deUint32				instancesGroupCount;
 	VkShaderStageFlagBits	stage;
-	bool					cullingFlags;
+	bool					rayFlagSkipTriangles;
+	bool					rayFlagSkipAABSs;
+	bool					opaque;
+	bool					frontFace;
+	VkPipelineCreateFlags	pipelineCreateFlags;
 };
 
 const deUint32	DEFAULT_UINT_CLEAR_VALUE	= 0x8000;
@@ -314,6 +319,13 @@
 
 void RayTracingTestCase::checkSupport(Context& context) const
 {
+	const bool	pipelineFlagSkipTriangles	= ((m_data.pipelineCreateFlags & VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR) != 0);
+	const bool	pipelineFlagSkipAABSs		= ((m_data.pipelineCreateFlags & VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR) != 0);
+	const bool	cullingFlags				=  m_data.rayFlagSkipTriangles
+											|| m_data.rayFlagSkipAABSs
+											|| pipelineFlagSkipTriangles
+											|| pipelineFlagSkipAABSs;
+
 	context.requireDeviceFunctionality(getRayTracingExtensionUsed());
 
 	const VkPhysicalDeviceRayTracingFeaturesKHR&	rayTracingFeaturesKHR = context.getRayTracingFeatures();
@@ -321,13 +333,8 @@
 	if (rayTracingFeaturesKHR.rayTracing == DE_FALSE)
 		TCU_THROW(NotSupportedError, "Requires rayTracingFeaturesKHR.rayTracing");
 
-	if (m_data.cullingFlags && rayTracingFeaturesKHR.rayTracingPrimitiveCulling == DE_FALSE)
+	if (cullingFlags && rayTracingFeaturesKHR.rayTracingPrimitiveCulling == DE_FALSE)
 		TCU_THROW(NotSupportedError, "Requires rayTracingFeaturesKHR.rayTracingPrimitiveCulling");
-
-	// TODO: 1. allow this when GLSLang implementation will support these flags
-	//       2. Uncomment adding flags in shader generator (RayTracingTestCase::initPrograms)
-	if (m_data.cullingFlags)
-		TCU_THROW(NotSupportedError, "GLSLang support of gl_RayFlagsSkipTrianglesEXT and gl_RayFlagsSkipAABBEXT is required, but not implemented");
 }
 
 const std::string RayTracingTestCase::getIntersectionPassthrough (void)
@@ -704,6 +711,10 @@
 	}
 	else if (m_data.id == TEST_ID_INCOMING_RAY_FLAGS_EXT)
 	{
+		const bool			cullingFlags			= m_data.rayFlagSkipTriangles || m_data.rayFlagSkipAABSs;
+		const std::string	cullingFlagsInit		= m_data.rayFlagSkipTriangles ? "gl_RayFlagsSkipTrianglesEXT"
+													: m_data.rayFlagSkipAABSs ? "gl_RayFlagsSkipAABBEXT"
+													: "gl_RayFlagsNoneEXT";
 		const std::string	updateImage				=
 			"  ivec3 p = ivec3(gl_LaunchIDEXT);\n"
 			"  int   r = int(gl_" + std::string(m_data.name) + ");\n"
@@ -717,40 +728,34 @@
 			"\n"
 			"void main()\n"
 			"{\n"
-			"  uint part = (4 * gl_LaunchIDEXT.y) / gl_LaunchSizeEXT.y;\n"
-			"  uint hitKind = ((part & 1) == 0) ? gl_HitKindFrontFacingTriangleEXT : gl_HitKindBackFacingTriangleEXT;\n"
+			"  uint hitKind = " + std::string(m_data.frontFace ? "gl_HitKindFrontFacingTriangleEXT" : "gl_HitKindBackFacingTriangleEXT") + ";\n"
 			"  reportIntersectionEXT(0.95f, hitKind);\n"
 			"}\n";
-		const std::string	cullingFlagsFragment	=
-			"  else if (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_CULL_OPAQUE_EXT                   ) + "))) f = f | gl_RayFlagsCullOpaqueEXT;\n"
-			"  else if (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_CULL_NO_OPAQUE_EXT                ) + "))) f = f | gl_RayFlagsCullNoOpaqueEXT;\n"
-			"\n"
-			"  if      (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_CULL_BACK_FACING_TRIANGLES_EXT    ) + "))) f = f | gl_RayFlagsCullBackFacingTrianglesEXT;\n"
-			"  else if (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_CULL_FRONT_FACING_TRIANGLES_EXT   ) + "))) f = f | gl_RayFlagsCullFrontFacingTrianglesEXT;\n";
 		const std::string	raygenFlagsFragment		=
 			"\n"
-			"  if      (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_OPAQUE_EXT                        ) + "))) f = f | gl_RayFlagsOpaqueEXT;\n"
-			"  else if (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_NO_OPAQUE_EXT                     ) + "))) f = f | gl_RayFlagsNoOpaqueEXT;\n"
-			+ (m_data.cullingFlags ? cullingFlagsFragment : "") +
+			"  if      (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_OPAQUE_EXT                     ) + "))) f = f | gl_RayFlagsOpaqueEXT;\n"
+			"  else if (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_NO_OPAQUE_EXT                  ) + "))) f = f | gl_RayFlagsNoOpaqueEXT;\n"
+			"  else if (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_CULL_OPAQUE_EXT                ) + "))) f = f | gl_RayFlagsCullOpaqueEXT;\n"
+			"  else if (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_CULL_NO_OPAQUE_EXT             ) + "))) f = f | gl_RayFlagsCullNoOpaqueEXT;\n"
 			"\n"
-			"  if      (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_TERMINATE_ON_FIRST_HIT_EXT        ) + "))) f = f | gl_RayFlagsTerminateOnFirstHitEXT;\n"
-			"  if      (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_SKIP_CLOSEST_HIT_SHADER_EXT       ) + "))) f = f | gl_RayFlagsSkipClosestHitShaderEXT;\n"
-			// TODO: allow this when GLSLang implementation will support these flags
-			//"\n"
-			//"  if      (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_SKIP_TRIANGLES_EXT                ) + "))) f = f | gl_RayFlagsSkipTrianglesEXT;\n"
-			//"  if      (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_SKIP_AABB_EXT                     ) + "))) f = f | gl_RayFlagsSkipAABBEXT;\n"
+			"  if      (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_CULL_BACK_FACING_TRIANGLES_EXT ) + "))) f = f | gl_RayFlagsCullBackFacingTrianglesEXT;\n"
+			"  else if (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_CULL_FRONT_FACING_TRIANGLES_EXT) + "))) f = f | gl_RayFlagsCullFrontFacingTrianglesEXT;\n"
+			"\n"
+			"  if      (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_TERMINATE_ON_FIRST_HIT_EXT     ) + "))) f = f | gl_RayFlagsTerminateOnFirstHitEXT;\n"
+			"  if      (0 != (n & (1<<" + de::toString(RAY_FLAG_BIT_SKIP_CLOSEST_HIT_SHADER_EXT    ) + "))) f = f | gl_RayFlagsSkipClosestHitShaderEXT;\n"
 			"\n";
 		const std::string	raygenShader			=
 			"#version 460 core\n"
 			"#extension GL_EXT_nonuniform_qualifier : enable\n"
 			"#extension GL_EXT_ray_tracing : require\n"
+			+ (cullingFlags ? std::string("#extension GL_EXT_ray_flags_primitive_culling : require\n") : "") +
 			"layout(location = 0) rayPayloadEXT vec3 hitValue;\n"
 			"layout(set = 0, binding = 1) uniform accelerationStructureEXT topLevelAS;\n"
 			"\n"
 			"void main()\n"
 			"{\n"
-			"  uint  n        = (gl_LaunchIDEXT.x + gl_LaunchSizeEXT.x * (gl_LaunchIDEXT.y + gl_LaunchSizeEXT.y * gl_LaunchIDEXT.z)) & 0xFF;\n"
-			"  uint  f        = gl_RayFlagsNoneEXT;\n"
+			"  uint  n        = gl_LaunchIDEXT.x + gl_LaunchSizeEXT.x * (gl_LaunchIDEXT.y + gl_LaunchSizeEXT.y * gl_LaunchIDEXT.z);\n"
+			"  uint  f        = " + cullingFlagsInit + ";\n"
 			+ raygenFlagsFragment +
 			"  uint  rayFlags = f;\n"
 			"  uint  cullMask = 0xFF;\n"
@@ -1337,7 +1342,7 @@
 			result->addGeometry(geometryData, triangles);
 		}
 	}
-	else if (m_data.id == TEST_ID_INCOMING_RAY_FLAGS_EXT || m_data.id == TEST_ID_HIT_KIND_EXT)
+	else if (m_data.id == TEST_ID_HIT_KIND_EXT)
 	{
 		const bool	triangles	= (m_data.geomType == GEOM_TYPE_TRIANGLES);
 		const bool	missShader	= (m_data.stage == VK_SHADER_STAGE_MISS_BIT_KHR);
@@ -1400,6 +1405,61 @@
 		result->addGeometry(geometryDataOpaque, triangles, (VkGeometryFlagsKHR)VK_GEOMETRY_OPAQUE_BIT_KHR);
 		result->addGeometry(geometryDataNonOpaque, triangles, (VkGeometryFlagsKHR)0);
 	}
+	else if (m_data.id == TEST_ID_INCOMING_RAY_FLAGS_EXT)
+	{
+		const bool					triangles		= (m_data.geomType == GEOM_TYPE_TRIANGLES);
+		const bool					missShader		= (m_data.stage == VK_SHADER_STAGE_MISS_BIT_KHR);
+		const float					z				= !missShader ? -1.0f : -100.0f;
+		const VkGeometryFlagsKHR	geometryFlags	= m_data.opaque ? static_cast<VkGeometryFlagsKHR>(VK_GEOMETRY_OPAQUE_BIT_KHR) : static_cast<VkGeometryFlagsKHR>(0);
+		const bool					cw				= m_data.frontFace;
+		std::vector<tcu::Vec3>		geometryData;
+
+		DE_ASSERT(m_data.geometriesGroupCount == 1);
+		DE_ASSERT(m_data.squaresGroupCount != 1);
+
+		geometryData.reserve(m_data.squaresGroupCount * (triangles ? 3u : 2u));
+
+		for (size_t squareNdx = 0; squareNdx < m_data.squaresGroupCount; ++squareNdx)
+		{
+			const deUint32	n	= m_data.width * startPos.y() + startPos.x();
+			const deUint32	m	= n + 1;
+			const float		x0	= float(startPos.x() + 0) / float(m_data.width);
+			const float		y0	= float(startPos.y() + 0) / float(m_data.height);
+			const float		x1	= float(startPos.x() + 1) / float(m_data.width);
+			const float		y1	= float(startPos.y() + 1) / float(m_data.height);
+
+			if (triangles)
+			{
+				const float	xm	= (x0 + x1) / 2.0f;
+				const float	ym	= (y0 + y1) / 2.0f;
+
+				if (cw)
+				{
+					geometryData.push_back(tcu::Vec3(x0, y0, z));
+					geometryData.push_back(tcu::Vec3(x1, ym, z));
+					geometryData.push_back(tcu::Vec3(xm, y1, z));
+				}
+				else
+				{
+					geometryData.push_back(tcu::Vec3(x0, y0, z));
+					geometryData.push_back(tcu::Vec3(xm, y1, z));
+					geometryData.push_back(tcu::Vec3(x1, ym, z));
+				}
+			}
+			else
+			{
+				geometryData.push_back(tcu::Vec3(x0, y0, z));
+				geometryData.push_back(tcu::Vec3(x1, y1, z * 0.9f));
+			}
+
+			startPos.y() = m / m_data.width;
+			startPos.x() = m % m_data.width;
+		}
+
+		DE_ASSERT(startPos.y() == m_data.height && startPos.x() == 0);
+
+		result->addGeometry(geometryData, triangles, geometryFlags);
+	}
 	else if (m_data.id == TEST_ID_HIT_T_EXT		||
 			 m_data.id == TEST_ID_RAY_T_MIN_EXT	||
 			 m_data.id == TEST_ID_RAY_T_MAX_EXT	)
@@ -1532,6 +1592,9 @@
 	if (0 != (m_shaders & VK_SHADER_STAGE_INTERSECTION_BIT_KHR))	rayTracingPipeline->addShader(VK_SHADER_STAGE_INTERSECTION_BIT_KHR	, createShaderModule(vkd, device, collection.get("sect"), 0), m_hitShaderGroup);
 	if (0 != (m_shaders & VK_SHADER_STAGE_CALLABLE_BIT_KHR))		rayTracingPipeline->addShader(VK_SHADER_STAGE_CALLABLE_BIT_KHR		, createShaderModule(vkd, device, collection.get("call"), 0), m_callableShaderGroup);
 
+	if (m_data.pipelineCreateFlags != 0)
+		rayTracingPipeline->setCreateFlags(m_data.pipelineCreateFlags);
+
 	Move<VkPipeline> pipeline = rayTracingPipeline->createPipeline(vkd, device, pipelineLayout);
 
 	return pipeline;
@@ -1774,27 +1837,29 @@
 	}
 	else if (m_data.id == TEST_ID_INCOMING_RAY_FLAGS_EXT)
 	{
-		DE_ASSERT(m_data.squaresGroupCount == (1<<RAY_FLAG_BIT_LAST));
-		DE_ASSERT(DEFAULT_UINT_CLEAR_VALUE != (1<<RAY_FLAG_BIT_LAST));
+		DE_ASSERT(m_data.squaresGroupCount == (1<<RAY_FLAG_BIT_LAST_PER_TEST));
+		DE_ASSERT(DEFAULT_UINT_CLEAR_VALUE != (1<<RAY_FLAG_BIT_LAST_PER_TEST));
 
 		for (deUint32 z = 0; z < m_data.depth; ++z)
 		for (deUint32 y = 0; y < m_data.height; ++y)
 		for (deUint32 x = 0; x < m_data.width; ++x)
 		{
 			const deUint32	n						= x + m_data.width * (y + m_data.height * z);
-			const bool		rayOpaque				=                        (0 != (n & (1<<RAY_FLAG_BIT_OPAQUE_EXT                     )));
-			const bool		rayNoOpaque				=                        (0 != (n & (1<<RAY_FLAG_BIT_NO_OPAQUE_EXT                  ))) && !rayOpaque;
-			const bool		rayTerminateOnFirstHit	=                        (0 != (n & (1<<RAY_FLAG_BIT_TERMINATE_ON_FIRST_HIT_EXT     )));
-			const bool		raySkipClosestHitShader	=                        (0 != (n & (1<<RAY_FLAG_BIT_SKIP_CLOSEST_HIT_SHADER_EXT    )));
-			const bool		rayCullBack				= m_data.cullingFlags && (0 != (n & (1<<RAY_FLAG_BIT_CULL_BACK_FACING_TRIANGLES_EXT )));
-			const bool		rayCullFront			= m_data.cullingFlags && (0 != (n & (1<<RAY_FLAG_BIT_CULL_FRONT_FACING_TRIANGLES_EXT))) && !rayCullBack;
-			const bool		rayCullOpaque			= m_data.cullingFlags && (0 != (n & (1<<RAY_FLAG_BIT_CULL_OPAQUE_EXT                ))) && !rayOpaque && !rayNoOpaque;
-			const bool		rayCullNoOpaque			= m_data.cullingFlags && (0 != (n & (1<<RAY_FLAG_BIT_CULL_NO_OPAQUE_EXT             ))) && !rayOpaque && !rayNoOpaque && !rayCullOpaque;
-			const bool		raySkipTriangles		= m_data.cullingFlags && (0 != (n & (1<<RAY_FLAG_BIT_SKIP_TRIANGLES_EXT             )));
-			const bool		raySkipAABBs			= m_data.cullingFlags && (0 != (n & (1<<RAY_FLAG_BIT_SKIP_AABB_EXT                  )));
-			const deUint32	geometryNdx				= n / m_data.squaresGroupCount;
-			const bool		geometryFrontFace		= ((geometryNdx & 1) == 0) ? true : false;
-			const bool		geometryOpaque			= ((geometryNdx & 2) == 0) ? true : false;
+			const bool		rayOpaque				= (0 != (n & (1<<RAY_FLAG_BIT_OPAQUE_EXT                     )));
+			const bool		rayNoOpaque				= (0 != (n & (1<<RAY_FLAG_BIT_NO_OPAQUE_EXT                  ))) && !rayOpaque;
+			const bool		rayTerminateOnFirstHit	= (0 != (n & (1<<RAY_FLAG_BIT_TERMINATE_ON_FIRST_HIT_EXT     )));
+			const bool		raySkipClosestHitShader	= (0 != (n & (1<<RAY_FLAG_BIT_SKIP_CLOSEST_HIT_SHADER_EXT    )));
+			const bool		rayCullBack				= (0 != (n & (1<<RAY_FLAG_BIT_CULL_BACK_FACING_TRIANGLES_EXT )));
+			const bool		rayCullFront			= (0 != (n & (1<<RAY_FLAG_BIT_CULL_FRONT_FACING_TRIANGLES_EXT))) && !rayCullBack;
+			const bool		rayCullOpaque			= (0 != (n & (1<<RAY_FLAG_BIT_CULL_OPAQUE_EXT                ))) && !rayOpaque && !rayNoOpaque;
+			const bool		rayCullNoOpaque			= (0 != (n & (1<<RAY_FLAG_BIT_CULL_NO_OPAQUE_EXT             ))) && !rayOpaque && !rayNoOpaque && !rayCullOpaque;
+			const bool		raySkipTriangles		= m_data.rayFlagSkipTriangles;
+			const bool		raySkipAABBs			= m_data.rayFlagSkipAABSs;
+			const bool		pipelineSkipTriangles	= (m_data.pipelineCreateFlags & VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR) != 0;
+			const bool		pipelineSkipAABBs		= (m_data.pipelineCreateFlags & VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR) != 0;
+			const bool		cullingTest				= m_data.rayFlagSkipTriangles || m_data.rayFlagSkipAABSs || pipelineSkipTriangles || pipelineSkipAABBs;
+			const bool		geometryFrontFace		= m_data.frontFace;
+			const bool		geometryOpaque			= m_data.opaque;
 			const bool		geometryTriangles		= (m_data.geomType == GEOM_TYPE_TRIANGLES) ? true : false;
 			const bool		geometryAABBs			= (m_data.geomType == GEOM_TYPE_AABBS) ? true : false;
 			deUint32		v						= 0
@@ -1812,44 +1877,54 @@
 			if (m_data.stage == VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR && raySkipClosestHitShader)
 				v = DEFAULT_UINT_CLEAR_VALUE;
 
-			if (m_data.stage == VK_SHADER_STAGE_ANY_HIT_BIT_KHR && (rayOpaque || (!rayOpaque && !rayNoOpaque && geometryOpaque)))
+			if (m_data.stage == VK_SHADER_STAGE_ANY_HIT_BIT_KHR && (rayOpaque || (geometryOpaque && !rayOpaque && !rayNoOpaque)))
 				v = DEFAULT_UINT_CLEAR_VALUE;
 
-			if (m_data.cullingFlags)
+			if (geometryOpaque)
 			{
-				if (geometryOpaque)
-				{
-					if (rayCullOpaque)
+				if (rayCullOpaque)
+					if (m_data.stage != VK_SHADER_STAGE_MISS_BIT_KHR)
 						v = DEFAULT_UINT_CLEAR_VALUE;
+			}
+			else
+			{
+				if (rayCullNoOpaque)
+					if (m_data.stage != VK_SHADER_STAGE_MISS_BIT_KHR)
+						v = DEFAULT_UINT_CLEAR_VALUE;
+			}
+
+			if (geometryTriangles)
+			{
+				if (geometryFrontFace)
+				{
+					if (rayCullFront)
+						if (m_data.stage != VK_SHADER_STAGE_MISS_BIT_KHR)
+							v = DEFAULT_UINT_CLEAR_VALUE;
 				}
 				else
 				{
-					if (rayCullNoOpaque)
-						v = DEFAULT_UINT_CLEAR_VALUE;
+					if (rayCullBack)
+						if (m_data.stage != VK_SHADER_STAGE_MISS_BIT_KHR)
+							v = DEFAULT_UINT_CLEAR_VALUE;
 				}
+			}
 
-				if (geometryTriangles)
+			if (cullingTest)
+			{
+				if (m_data.stage != VK_SHADER_STAGE_MISS_BIT_KHR)
 				{
 					if (geometryTriangles)
-						v = DEFAULT_UINT_CLEAR_VALUE;
-
-					if (geometryFrontFace)
 					{
-						if (rayCullFront)
+						if (raySkipTriangles || pipelineSkipTriangles)
 							v = DEFAULT_UINT_CLEAR_VALUE;
 					}
-					else
+
+					if (geometryAABBs)
 					{
-						if (rayCullBack)
+						if (raySkipAABBs || pipelineSkipAABBs)
 							v = DEFAULT_UINT_CLEAR_VALUE;
 					}
 				}
-
-				if (geometryAABBs)
-				{
-					if (raySkipAABBs)
-						v = DEFAULT_UINT_CLEAR_VALUE;
-				}
 			}
 
 			result.push_back(deInt32(v));
@@ -2344,7 +2419,7 @@
 		return tcu::TestStatus::fail("fail");
 }
 
-static const struct
+static const struct Stages
 {
 	const char*				name;
 	VkShaderStageFlagBits	stage;
@@ -2359,7 +2434,7 @@
 	{ "call", VK_SHADER_STAGE_CALLABLE_BIT_KHR		},
 };
 
-static const struct
+static const struct GeomTypes
 {
 	const char*	name;
 	GeomType	geomType;
@@ -2412,22 +2487,26 @@
 			const deUint32	instancesGroupCount		= 1;
 			const CaseDef	caseDef					=
 			{
-				id,										//  TestId					id;
-				name,									//  const char*				name;
-				width,									//  deUint32				width;
-				height,									//  deUint32				height;
-				depth,									//  deUint32				depth;
-				depth,									//  deUint32				raysDepth;
-				VK_FORMAT_R32_SINT,						//  VkFormat				format;
-				false,									//  bool					fixedPointScalarOutput;
-				false,									//  bool					fixedPointVectorOutput;
-				false,									//  bool					fixedPointMatrixOutput;
-				GEOM_TYPE_TRIANGLES,					//  GeomType				geomType;
-				squaresGroupCount,						//  deUint32				squaresGroupCount;
-				geometriesGroupCount,					//  deUint32				geometriesGroupCount;
-				instancesGroupCount,					//  deUint32				instancesGroupCount;
-				stages[stageNdx].stage,					//  VkShaderStageFlagBits	stage;
-				false									//  bool					cullingFlags;
+				id,						//  TestId					id;
+				name,					//  const char*				name;
+				width,					//  deUint32				width;
+				height,					//  deUint32				height;
+				depth,					//  deUint32				depth;
+				depth,					//  deUint32				raysDepth;
+				VK_FORMAT_R32_SINT,		//  VkFormat				format;
+				false,					//  bool					fixedPointScalarOutput;
+				false,					//  bool					fixedPointVectorOutput;
+				false,					//  bool					fixedPointMatrixOutput;
+				GEOM_TYPE_TRIANGLES,	//  GeomType				geomType;
+				squaresGroupCount,		//  deUint32				squaresGroupCount;
+				geometriesGroupCount,	//  deUint32				geometriesGroupCount;
+				instancesGroupCount,	//  deUint32				instancesGroupCount;
+				stages[stageNdx].stage,	//  VkShaderStageFlagBits	stage;
+				false,					//  bool					skipTriangles;
+				false,					//  bool					skipAABSs;
+				false,					//  bool					opaque;
+				false,					//  bool					frontFace;
+				0						//  VkPipelineCreateFlags	pipelineCreateFlags;
 			};
 			const std::string	suffix		= de::toString(caseDef.width) + '_' + de::toString(caseDef.height) + '_' + de::toString(caseDef.depth);
 			const std::string	testName	= string(stages[stageNdx].name) + '_' + suffix;
@@ -2449,17 +2528,15 @@
 	}
 	sizes[] =
 	{
-		{  16, 256, TEST_ID_INCOMING_RAY_FLAGS_EXT	},
-		{  16,  16, TEST_ID_HIT_KIND_EXT			},
-		{  16,  16, TEST_ID_HIT_T_EXT				},
-		{  16,  16, TEST_ID_RAY_T_MIN_EXT			},
-		{  16,  16, TEST_ID_RAY_T_MAX_EXT			},
-		{  32,  32, TEST_ID_LAST					},
-		{  64,  64, TEST_ID_LAST					},
-		{ 256, 256, TEST_ID_LAST					},
+		{  16,  16, TEST_ID_HIT_KIND_EXT	},
+		{  16,  16, TEST_ID_HIT_T_EXT		},
+		{  16,  16, TEST_ID_RAY_T_MIN_EXT	},
+		{  16,  16, TEST_ID_RAY_T_MAX_EXT	},
+		{  32,  32, TEST_ID_LAST			},
+		{  64,  64, TEST_ID_LAST			},
+		{ 256, 256, TEST_ID_LAST			},
 	};
-	const bool		fourGeometryGroups		=  id == TEST_ID_INCOMING_RAY_FLAGS_EXT
-											|| id == TEST_ID_HIT_KIND_EXT
+	const bool		fourGeometryGroups		=  id == TEST_ID_HIT_KIND_EXT
 											|| id == TEST_ID_HIT_T_EXT
 											|| id == TEST_ID_RAY_T_MIN_EXT
 											|| id == TEST_ID_RAY_T_MAX_EXT;
@@ -2474,6 +2551,8 @@
 	for (size_t geomTypesNdx = 0; geomTypesNdx < DE_LENGTH_OF_ARRAY(geomTypes); ++geomTypesNdx)
 	for (size_t stageNdx = 0; stageNdx < DE_LENGTH_OF_ARRAY(stages); ++stageNdx)
 	{
+		const GeomType	geomType	= geomTypes[geomTypesNdx].geomType;
+
 		if ((shaderStageFlags & stages[stageNdx].stage) == 0)
 			continue;
 
@@ -2494,22 +2573,26 @@
 			const deUint32	squaresGroupCount		= largestGroup;
 			const CaseDef	caseDef					=
 			{
-				id,										//  TestId					id;
-				name,									//  const char*				name;
-				width,									//  deUint32				width;
-				height,									//  deUint32				height;
-				imageDepth,								//  deUint32				depth;
-				rayDepth,								//  deUint32				raysDepth;
-				VK_FORMAT_R32_SINT,						//  VkFormat				format;
-				fixedPointScalarOutput,					//  bool					fixedPointScalarOutput;
-				false,									//  bool					fixedPointVectorOutput;
-				false,									//  bool					fixedPointMatrixOutput;
-				geomTypes[geomTypesNdx].geomType,		//  GeomType				geomType;
-				squaresGroupCount,						//  deUint32				squaresGroupCount;
-				geometriesGroupCount,					//  deUint32				geometriesGroupCount;
-				instancesGroupCount,					//  deUint32				instancesGroupCount;
-				stages[stageNdx].stage,					//  VkShaderStageFlagBits	stage;
-				false									//  bool					cullingFlags;
+				id,						//  TestId					id;
+				name,					//  const char*				name;
+				width,					//  deUint32				width;
+				height,					//  deUint32				height;
+				imageDepth,				//  deUint32				depth;
+				rayDepth,				//  deUint32				raysDepth;
+				VK_FORMAT_R32_SINT,		//  VkFormat				format;
+				fixedPointScalarOutput,	//  bool					fixedPointScalarOutput;
+				false,					//  bool					fixedPointVectorOutput;
+				false,					//  bool					fixedPointMatrixOutput;
+				geomType,				//  GeomType				geomType;
+				squaresGroupCount,		//  deUint32				squaresGroupCount;
+				geometriesGroupCount,	//  deUint32				geometriesGroupCount;
+				instancesGroupCount,	//  deUint32				instancesGroupCount;
+				stages[stageNdx].stage,	//  VkShaderStageFlagBits	stage;
+				false,					//  bool					skipTriangles;
+				false,					//  bool					skipAABSs;
+				false,					//  bool					opaque;
+				false,					//  bool					frontFace;
+				0						//  VkPipelineCreateFlags	pipelineCreateFlags;
 			};
 			const std::string	suffix		= '_' + de::toString(caseDef.width) + '_' + de::toString(caseDef.height);
 			const std::string	testName	= string(stages[stageNdx].name) + '_' + geomTypes[geomTypesNdx].name + (specializedTest ? "" : suffix);
@@ -2530,17 +2613,6 @@
 			group->addChild(new RayTracingTestCase(testCtx, testName.c_str(), "", caseDef));
 			testAdded = true;
 
-			if (id == TEST_ID_INCOMING_RAY_FLAGS_EXT)
-			{
-				CaseDef	caseDefCulling	= caseDef;
-
-				caseDefCulling.cullingFlags = true;
-
-				group->addChild(new RayTracingTestCase(testCtx, (testName + "_culling").c_str(), "", caseDefCulling));
-
-				testAdded = true;
-			}
-
 			if (specializedTest)
 				break;
 		}
@@ -2552,6 +2624,133 @@
 	builtinGroup->addChild(group.release());
 }
 
+void createRayFlagsTests (tcu::TestContext& testCtx, tcu::TestCaseGroup* builtinGroup, TestId id, const char* name, const VkShaderStageFlags shaderStageFlags)
+{
+	const deUint32	width		= 16;
+	const deUint32	height		= 16;
+	const deUint32	imageDepth	= 1;
+	const deUint32	rayDepth	= 1;
+
+	const struct Opaques
+	{
+		const char*	name;
+		bool		flag;
+	}
+	opaques[] =
+	{
+		{ "opaque",		true	},
+		{ "noopaque",	false	},
+	};
+	const struct Faces
+	{
+		const char*	name;
+		bool		flag;
+	}
+	faces[] =
+	{
+		{ "frontface",	true	},
+		{ "backface",	false	},
+	};
+	const struct SkipRayFlags
+	{
+		const char*	name;
+		bool		skipTriangles;
+		bool		skipAABBs;
+	}
+	skipRayFlags[] =
+	{
+		{ "raynoskipflags",			false,	false	},
+		{ "rayskiptriangles",		true,	false	},
+		{ "rayskipaabbs",			false,	true	},
+	};
+	const struct PipelineFlags
+	{
+		const char*				name;
+		VkPipelineCreateFlags	flag;
+	}
+	pipelineFlags[] =
+	{
+		{ "pipelinenoskipflags",	static_cast<VkPipelineCreateFlags>(0)					},
+		{ "pipelineskiptriangles",	VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR	},
+		{ "pipelineskipaabbs",		VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR		},
+	};
+
+	de::MovePtr<tcu::TestCaseGroup>	group	(new tcu::TestCaseGroup(testCtx, de::toLower(name).c_str(), ""));
+
+	for (size_t geomTypesNdx = 0; geomTypesNdx < DE_LENGTH_OF_ARRAY(geomTypes); ++geomTypesNdx)
+	{
+		const GeomType					geomType	= geomTypes[geomTypesNdx].geomType;
+		de::MovePtr<tcu::TestCaseGroup>	geomGroup	(new tcu::TestCaseGroup(testCtx, geomTypes[geomTypesNdx].name, ""));
+
+		for (size_t skipRayFlagsNdx = 0; skipRayFlagsNdx < DE_LENGTH_OF_ARRAY(skipRayFlags); ++skipRayFlagsNdx)
+		{
+			de::MovePtr<tcu::TestCaseGroup>	rayFlagsGroup	(new tcu::TestCaseGroup(testCtx, skipRayFlags[skipRayFlagsNdx].name, ""));
+
+			for (size_t pipelineFlagsNdx = 0; pipelineFlagsNdx < DE_LENGTH_OF_ARRAY(pipelineFlags); ++pipelineFlagsNdx)
+			{
+				de::MovePtr<tcu::TestCaseGroup>	pipelineFlagsGroup	(new tcu::TestCaseGroup(testCtx, pipelineFlags[pipelineFlagsNdx].name, ""));
+
+				for (size_t opaquesNdx = 0; opaquesNdx < DE_LENGTH_OF_ARRAY(opaques); ++opaquesNdx)
+				for (size_t facesNdx = 0; facesNdx < DE_LENGTH_OF_ARRAY(faces); ++facesNdx)
+				{
+					const std::string				geomPropertiesGroupName	= string(opaques[opaquesNdx].name) + '_' + string(faces[facesNdx].name);
+					de::MovePtr<tcu::TestCaseGroup>	geomPropertiesGroup		(new tcu::TestCaseGroup(testCtx, geomPropertiesGroupName.c_str(), ""));
+
+					for (size_t stageNdx = 0; stageNdx < DE_LENGTH_OF_ARRAY(stages); ++stageNdx)
+					{
+						if ((shaderStageFlags & stages[stageNdx].stage) == 0)
+							continue;
+
+						if (stages[stageNdx].stage == VK_SHADER_STAGE_INTERSECTION_BIT_KHR && geomTypes[geomTypesNdx].geomType == GEOM_TYPE_TRIANGLES)
+							continue;
+
+						const deUint32		instancesGroupCount		= 1;
+						const deUint32		geometriesGroupCount	= 1;
+						const deUint32		largestGroup			= width * height / geometriesGroupCount / instancesGroupCount;
+						const deUint32		squaresGroupCount		= largestGroup;
+						const CaseDef		caseDef					=
+						{
+							id,												//  TestId					id;
+							name,											//  const char*				name;
+							width,											//  deUint32				width;
+							height,											//  deUint32				height;
+							imageDepth,										//  deUint32				depth;
+							rayDepth,										//  deUint32				raysDepth;
+							VK_FORMAT_R32_SINT,								//  VkFormat				format;
+							false,											//  bool					fixedPointScalarOutput;
+							false,											//  bool					fixedPointVectorOutput;
+							false,											//  bool					fixedPointMatrixOutput;
+							geomType,										//  GeomType				geomType;
+							squaresGroupCount,								//  deUint32				squaresGroupCount;
+							geometriesGroupCount,							//  deUint32				geometriesGroupCount;
+							instancesGroupCount,							//  deUint32				instancesGroupCount;
+							stages[stageNdx].stage,							//  VkShaderStageFlagBits	stage;
+							skipRayFlags[skipRayFlagsNdx].skipTriangles,	//  bool					skipTriangles;
+							skipRayFlags[skipRayFlagsNdx].skipAABBs,		//  bool					skipAABSs;
+							opaques[opaquesNdx].flag,						//  bool					opaque;
+							faces[facesNdx].flag,							//  bool					frontFace;
+							pipelineFlags[pipelineFlagsNdx].flag,			//  VkPipelineCreateFlags	pipelineCreateFlags;
+						};
+						const std::string	testName				= string(stages[stageNdx].name) ;
+
+						geomPropertiesGroup->addChild(new RayTracingTestCase(testCtx, testName.c_str(), "", caseDef));
+					}
+
+					pipelineFlagsGroup->addChild(geomPropertiesGroup.release());
+				}
+
+				rayFlagsGroup->addChild(pipelineFlagsGroup.release());
+			}
+
+			geomGroup->addChild(rayFlagsGroup.release());
+		}
+
+		group->addChild(geomGroup.release());
+	}
+
+	builtinGroup->addChild(group.release());
+}
+
 void createMultiOutputTests (tcu::TestContext& testCtx, tcu::TestCaseGroup* builtinGroup, TestId id, const char* name, const VkShaderStageFlags shaderStageFlags)
 {
 	const bool		fixedPointVectorOutput	=  id == TEST_ID_WORLD_RAY_ORIGIN_EXT
@@ -2574,6 +2773,8 @@
 	for (size_t geomTypesNdx = 0; geomTypesNdx < DE_LENGTH_OF_ARRAY(geomTypes); ++geomTypesNdx)
 	for (size_t stageNdx = 0; stageNdx < DE_LENGTH_OF_ARRAY(stages); ++stageNdx)
 	{
+		const GeomType	geomType	= geomTypes[geomTypesNdx].geomType;
+
 		if ((shaderStageFlags & stages[stageNdx].stage) == 0)
 			continue;
 
@@ -2588,22 +2789,26 @@
 		const deUint32		squaresGroupCount		= largestGroup;
 		const CaseDef		caseDef					=
 		{
-			id,											//  TestId					id;
-			name,										//  const char*				name;
-			width,										//  deUint32				width;
-			height,										//  deUint32				height;
-			imageDepth,									//  deUint32				depth;
-			rayDepth,									//  deUint32				raysDepth;
-			VK_FORMAT_R32_SINT,							//  VkFormat				format;
-			false,										//  bool					fixedPointScalarOutput;
-			fixedPointVectorOutput,						//  bool					fixedPointVectorOutput;
-			fixedPointMatrixOutput,						//  bool					fixedPointMatrixOutput;
-			geomTypes[geomTypesNdx].geomType,			//  GeomType				geomType;
-			squaresGroupCount,							//  deUint32				squaresGroupCount;
-			geometriesGroupCount,						//  deUint32				geometriesGroupCount;
-			instancesGroupCount,						//  deUint32				instancesGroupCount;
-			stages[stageNdx].stage,						//  VkShaderStageFlagBits	stage;
-			false										//  bool					cullingFlags;
+			id,						//  TestId					id;
+			name,					//  const char*				name;
+			width,					//  deUint32				width;
+			height,					//  deUint32				height;
+			imageDepth,				//  deUint32				depth;
+			rayDepth,				//  deUint32				raysDepth;
+			VK_FORMAT_R32_SINT,		//  VkFormat				format;
+			false,					//  bool					fixedPointScalarOutput;
+			fixedPointVectorOutput,	//  bool					fixedPointVectorOutput;
+			fixedPointMatrixOutput,	//  bool					fixedPointMatrixOutput;
+			geomType,				//  GeomType				geomType;
+			squaresGroupCount,		//  deUint32				squaresGroupCount;
+			geometriesGroupCount,	//  deUint32				geometriesGroupCount;
+			instancesGroupCount,	//  deUint32				instancesGroupCount;
+			stages[stageNdx].stage,	//  VkShaderStageFlagBits	stage;
+			false,					//  bool					rayFlagSkipTriangles;
+			false,					//  bool					rayFlagSkipAABSs;
+			false,					//  bool					opaque;
+			false,					//  bool					frontFace;
+			0						//  VkPipelineCreateFlags	pipelineCreateFlags;
 		};
 		const std::string	testName				= string(stages[stageNdx].name) + '_' + geomTypes[geomTypesNdx].name;
 
@@ -2646,7 +2851,7 @@
 		{ TEST_ID_OBJECT_RAY_DIRECTION_EXT,		"ObjectRayDirectionEXT"	,			A	|	C	|	I					, createMultiOutputTests	},
 		{ TEST_ID_RAY_T_MIN_EXT,				"RayTminEXT"			,			A	|	C	|	I	|	M			, createScalarTests			},
 		{ TEST_ID_RAY_T_MAX_EXT,				"RayTmaxEXT"			,			A	|	C	|	I	|	M			, createScalarTests			},
-		{ TEST_ID_INCOMING_RAY_FLAGS_EXT,		"IncomingRayFlagsEXT"	,			A	|	C	|	I	|	M			, createScalarTests			},
+		{ TEST_ID_INCOMING_RAY_FLAGS_EXT,		"IncomingRayFlagsEXT"	,			A	|	C	|	I	|	M			, createRayFlagsTests		},
 		{ TEST_ID_HIT_T_EXT,					"HitTEXT"				,			A	|	C							, createScalarTests			},
 		{ TEST_ID_HIT_KIND_EXT,					"HitKindEXT"			,			A	|	C							, createScalarTests			},
 		{ TEST_ID_OBJECT_TO_WORLD_EXT,			"ObjectToWorldEXT"		,			A	|	C	|	I					, createMultiOutputTests	},
diff --git a/external/vulkancts/mustpass/master/vk-default.txt b/external/vulkancts/mustpass/master/vk-default.txt
index 37eaccc..d5b08da 100644
--- a/external/vulkancts/mustpass/master/vk-default.txt
+++ b/external/vulkancts/mustpass/master/vk-default.txt
Binary files differ