Add missing test coverage for a number of ray query built-in funcs
authorDominik Witczak <dominik.witczak@amd.com>
Fri, 24 Jul 2020 07:50:31 +0000 (09:50 +0200)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Thu, 13 Aug 2020 07:20:22 +0000 (03:20 -0400)
New tests:
dEQP-VK.ray_query.builtin.getraytmin.*
dEQP-VK.ray_query.builtin.getworldrayorigin.*
dEQP-VK.ray_query.builtin.getworldraydirection.*
dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.*
dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.*
dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.*
dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.*
dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.*
dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.*
dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.*
dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.*
dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.*

Components: Vulkan

VK-GL-CTS issue: 2444

Change-Id: If553b86e005c4860834dd63368d1b80e92d2fdc5

android/cts/master/vk-master-2020-03-01.txt
android/cts/master/vk-master.txt
external/vulkancts/modules/vulkan/ray_query/vktRayQueryBuiltinTests.cpp
external/vulkancts/mustpass/master/vk-default.txt

index aa364cd..ac12c08 100644 (file)
@@ -292565,6 +292565,234 @@ dEQP-VK.ray_query.builtin.worldtoobject.sect.triangles
 dEQP-VK.ray_query.builtin.worldtoobject.sect.aabbs
 dEQP-VK.ray_query.builtin.worldtoobject.call.triangles
 dEQP-VK.ray_query.builtin.worldtoobject.call.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.vert.triangles
+dEQP-VK.ray_query.builtin.getraytmin.vert.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.tesc.triangles
+dEQP-VK.ray_query.builtin.getraytmin.tesc.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.tese.triangles
+dEQP-VK.ray_query.builtin.getraytmin.tese.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.geom.triangles
+dEQP-VK.ray_query.builtin.getraytmin.geom.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.frag.triangles
+dEQP-VK.ray_query.builtin.getraytmin.frag.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.comp.triangles
+dEQP-VK.ray_query.builtin.getraytmin.comp.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.rgen.triangles
+dEQP-VK.ray_query.builtin.getraytmin.rgen.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.ahit.triangles
+dEQP-VK.ray_query.builtin.getraytmin.ahit.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.chit.triangles
+dEQP-VK.ray_query.builtin.getraytmin.chit.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.miss.triangles
+dEQP-VK.ray_query.builtin.getraytmin.miss.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.sect.triangles
+dEQP-VK.ray_query.builtin.getraytmin.sect.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.call.triangles
+dEQP-VK.ray_query.builtin.getraytmin.call.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.vert.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.vert.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.tesc.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.tesc.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.tese.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.tese.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.geom.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.geom.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.frag.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.frag.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.comp.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.comp.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.rgen.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.rgen.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.ahit.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.ahit.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.chit.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.chit.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.miss.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.miss.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.sect.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.sect.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.call.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.call.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.vert.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.vert.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.tesc.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.tesc.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.tese.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.tese.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.geom.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.geom.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.frag.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.frag.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.comp.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.comp.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.rgen.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.rgen.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.ahit.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.ahit.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.chit.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.chit.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.miss.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.miss.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.sect.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.sect.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.call.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.call.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.vert.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.tesc.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.tese.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.geom.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.frag.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.comp.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.rgen.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.ahit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.chit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.miss.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.sect.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.call.aabbs
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.call.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.call.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.vert.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.tesc.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.tese.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.geom.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.frag.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.comp.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.rgen.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.ahit.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.chit.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.miss.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.sect.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.call.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.call.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.vert.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.tesc.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.tese.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.geom.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.frag.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.comp.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.rgen.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.ahit.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.chit.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.miss.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.sect.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.call.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.call.aabbs
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.call.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.call.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.vert.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.tesc.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.tese.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.geom.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.frag.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.comp.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.rgen.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.ahit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.chit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.miss.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.sect.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.call.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.call.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.vert.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.tesc.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.tese.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.geom.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.frag.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.comp.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.rgen.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.ahit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.chit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.miss.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.sect.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.call.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.call.aabbs
 dEQP-VK.ray_query.traversal_control.vertex_shader.generate_intersection.triangles
 dEQP-VK.ray_query.traversal_control.vertex_shader.generate_intersection.aabbs
 dEQP-VK.ray_query.traversal_control.vertex_shader.skip_intersection.triangles
index 2d9229a..5ae9374 100644 (file)
@@ -702758,6 +702758,234 @@ dEQP-VK.ray_query.builtin.worldtoobject.sect.triangles
 dEQP-VK.ray_query.builtin.worldtoobject.sect.aabbs
 dEQP-VK.ray_query.builtin.worldtoobject.call.triangles
 dEQP-VK.ray_query.builtin.worldtoobject.call.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.vert.triangles
+dEQP-VK.ray_query.builtin.getraytmin.vert.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.tesc.triangles
+dEQP-VK.ray_query.builtin.getraytmin.tesc.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.tese.triangles
+dEQP-VK.ray_query.builtin.getraytmin.tese.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.geom.triangles
+dEQP-VK.ray_query.builtin.getraytmin.geom.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.frag.triangles
+dEQP-VK.ray_query.builtin.getraytmin.frag.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.comp.triangles
+dEQP-VK.ray_query.builtin.getraytmin.comp.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.rgen.triangles
+dEQP-VK.ray_query.builtin.getraytmin.rgen.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.ahit.triangles
+dEQP-VK.ray_query.builtin.getraytmin.ahit.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.chit.triangles
+dEQP-VK.ray_query.builtin.getraytmin.chit.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.miss.triangles
+dEQP-VK.ray_query.builtin.getraytmin.miss.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.sect.triangles
+dEQP-VK.ray_query.builtin.getraytmin.sect.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.call.triangles
+dEQP-VK.ray_query.builtin.getraytmin.call.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.vert.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.vert.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.tesc.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.tesc.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.tese.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.tese.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.geom.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.geom.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.frag.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.frag.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.comp.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.comp.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.rgen.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.rgen.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.ahit.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.ahit.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.chit.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.chit.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.miss.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.miss.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.sect.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.sect.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.call.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.call.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.vert.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.vert.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.tesc.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.tesc.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.tese.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.tese.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.geom.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.geom.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.frag.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.frag.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.comp.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.comp.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.rgen.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.rgen.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.ahit.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.ahit.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.chit.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.chit.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.miss.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.miss.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.sect.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.sect.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.call.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.call.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.vert.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.tesc.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.tese.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.geom.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.frag.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.comp.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.rgen.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.ahit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.chit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.miss.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.sect.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.call.aabbs
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.call.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.call.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.vert.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.tesc.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.tese.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.geom.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.frag.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.comp.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.rgen.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.ahit.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.chit.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.miss.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.sect.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.call.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.call.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.vert.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.tesc.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.tese.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.geom.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.frag.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.comp.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.rgen.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.ahit.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.chit.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.miss.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.sect.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.call.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.call.aabbs
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.call.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.call.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.vert.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.tesc.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.tese.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.geom.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.frag.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.comp.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.rgen.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.ahit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.chit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.miss.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.sect.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.call.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.call.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.vert.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.tesc.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.tese.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.geom.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.frag.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.comp.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.rgen.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.ahit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.chit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.miss.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.sect.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.call.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.call.aabbs
 dEQP-VK.ray_query.traversal_control.vertex_shader.generate_intersection.triangles
 dEQP-VK.ray_query.traversal_control.vertex_shader.generate_intersection.aabbs
 dEQP-VK.ray_query.traversal_control.vertex_shader.skip_intersection.triangles
index dc15601..72f9922 100644 (file)
 
 namespace vkt
 {
-namespace RayQuery
-{
-namespace
-{
-using namespace vk;
-using namespace vkt;
-
-static const VkFlags   ALL_RAY_TRACING_STAGES  = VK_SHADER_STAGE_RAYGEN_BIT_KHR
-                                                                                               | VK_SHADER_STAGE_ANY_HIT_BIT_KHR
-                                                                                               | VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR
-                                                                                               | VK_SHADER_STAGE_MISS_BIT_KHR
-                                                                                               | VK_SHADER_STAGE_INTERSECTION_BIT_KHR
-                                                                                               | VK_SHADER_STAGE_CALLABLE_BIT_KHR;
-
-enum TestType
-{
-       TEST_TYPE_FLOW                                                  = 0,
-       TEST_TYPE_PRIMITIVE_ID,
-       TEST_TYPE_INSTANCE_ID,
-       TEST_TYPE_INSTANCE_CUSTOM_INDEX,
-       TEST_TYPE_INTERSECTION_T_KHR,
-       TEST_TYPE_OBJECT_RAY_ORIGIN_KHR,
-       TEST_TYPE_OBJECT_RAY_DIRECTION_KHR,
-       TEST_TYPE_OBJECT_TO_WORLD_KHR,
-       TEST_TYPE_WORLD_TO_OBJECT_KHR,
-       TEST_TYPE_NULL_ACCELERATION_STRUCTURE,
-       TEST_TYPE_LAST
-};
-
-enum GeomType
-{
-       GEOM_TYPE_TRIANGLES,
-       GEOM_TYPE_AABBS,
-       GEOM_TYPE_LAST,
-};
-
-const deUint32 TEST_WIDTH                                      = 8;
-const deUint32 TEST_HEIGHT                                     = 8;
-const deUint32 FIXED_POINT_DIVISOR                     = 1024 * 1024;
-const deUint32 FIXED_POINT_ALLOWED_ERROR       = 4;
-
-struct TestParams;
-
-typedef void (*CheckSupportFunc)(Context& context, const TestParams& testParams);
-typedef void (*InitProgramsFunc)(SourceCollections& programCollection, const TestParams& testParams);
-typedef const std::string (*ShaderBodyTextFunc)(const TestParams& testParams);
-
-class PipelineConfiguration
-{
-public:
-                                       PipelineConfiguration   ()      {};
-       virtual                 ~PipelineConfiguration  ()      {};
-
-       virtual void    initConfiguration       (Context&                                                       context,
-                                                                                TestParams&                                            testParams) = 0;
-       virtual void    fillCommandBuffer       (Context&                                                       context,
-                                                                                TestParams&                                            testParams,
-                                                                                VkCommandBuffer                                        commandBuffer,
-                                                                                const VkAccelerationStructureKHR*      rayQueryTopAccelerationStructurePtr,
-                                                                                const VkDescriptorImageInfo&           resultImageInfo) = 0;
-};
-
-class TestConfiguration
-{
-public:
-                                                                                                                                       TestConfiguration                               ()
-                                                                                                                                               : m_bottomAccelerationStructures        ()
-                                                                                                                                               , m_topAccelerationStructure            ()
-                                                                                                                                               , m_expected                                            ()
-                                                                                                                                       {
-                                                                                                                                       }
-       virtual                                                                                                                 ~TestConfiguration                              ()
-                                                                                                                                       {
-                                                                                                                                       }
-
-       virtual const VkAccelerationStructureKHR*                                               initAccelerationStructures              (Context&                                                       context,
-                                                                                                                                                                                                        TestParams&                                            testParams,
-                                                                                                                                                                                                        VkCommandBuffer                                        cmdBuffer) = 0;
-       virtual bool                                                                                                    verify                                                  (BufferWithMemory*                                      resultBuffer,
-                                                                                                                                                                                                        Context&                                                       context,
-                                                                                                                                                                                                        TestParams&                                            testParams);
-
-protected:
-       std::vector<de::SharedPtr<BottomLevelAccelerationStructure>>    m_bottomAccelerationStructures;
-       de::SharedPtr<TopLevelAccelerationStructure>                                    m_topAccelerationStructure;
-       std::vector<deInt32>                                                                                    m_expected;
-};
-
-class TestConfigurationFloat : public TestConfiguration
-{
-public:
-                                                                                                                                       TestConfigurationFloat                  ()
-                                                                                                                                               : TestConfiguration     ()
-                                                                                                                                       {
-                                                                                                                                       }
-       virtual                                                                                                                 ~TestConfigurationFloat                 ()
-                                                                                                                                       {
-                                                                                                                                       }
-       virtual bool                                                                                                    verify                                                  (BufferWithMemory*                                      resultBuffer,
-                                                                                                                                                                                                        Context&                                                       context,
-                                                                                                                                                                                                        TestParams&                                            testParams) override;
-};
-
-class TestConfigurationVector : public TestConfiguration
-{
-public:
-                                                                                                                                       TestConfigurationVector                 ()
-                                                                                                                                               : TestConfiguration     ()
-                                                                                                                                       {
-                                                                                                                                       }
-       virtual                                                                                                                 ~TestConfigurationVector                ()
-                                                                                                                                       {
-                                                                                                                                       }
-       virtual bool                                                                                                    verify                                                  (BufferWithMemory*                                      resultBuffer,
-                                                                                                                                                                                                        Context&                                                       context,
-                                                                                                                                                                                                        TestParams&                                            testParams) override;
-};
-
-class TestConfigurationMatrix : public TestConfiguration
-{
-public:
-                                                                                                                                       TestConfigurationMatrix                 ()
-                                                                                                                                               : TestConfiguration     ()
-                                                                                                                                       {
-                                                                                                                                       }
-       virtual                                                                                                                 ~TestConfigurationMatrix                ()
-                                                                                                                                       {
-                                                                                                                                       }
-       virtual bool                                                                                                    verify                                                  (BufferWithMemory*                                      resultBuffer,
-                                                                                                                                                                                                        Context&                                                       context,
-                                                                                                                                                                                                        TestParams&                                            testParams) override;
-};
-
-struct TestParams
-{
-       deUint32                                width;
-       deUint32                                height;
-       deUint32                                depth;
-       TestType                                testType;
-       VkShaderStageFlagBits   stage;
-       GeomType                                geomType;
-       deUint32                                squaresGroupCount;
-       deUint32                                geometriesGroupCount;
-       deUint32                                instancesGroupCount;
-       VkFormat                                format;
-       CheckSupportFunc                pipelineCheckSupport;
-       InitProgramsFunc                pipelineInitPrograms;
-       ShaderBodyTextFunc              testConfigShaderBodyText;
-       CheckSupportFunc                testConfigCheckSupport;
-};
-
-deUint32 getShaderGroupHandleSize (const InstanceInterface&    vki,
-                                                                  const VkPhysicalDevice       physicalDevice)
-{
-       de::MovePtr<RayTracingProperties>       rayTracingPropertiesKHR;
-
-       rayTracingPropertiesKHR = makeRayTracingProperties(vki, physicalDevice);
-
-       return rayTracingPropertiesKHR->getShaderGroupHandleSize();
-}
-
-deUint32 getShaderGroupBaseAlignment (const InstanceInterface& vki,
-                                                                         const VkPhysicalDevice        physicalDevice)
-{
-       de::MovePtr<RayTracingProperties>       rayTracingPropertiesKHR;
+       namespace RayQuery
+       {
+               namespace
+               {
+                       using namespace vk;
+                       using namespace vkt;
 
-       rayTracingPropertiesKHR = makeRayTracingProperties(vki, physicalDevice);
+                       static const VkFlags    ALL_RAY_TRACING_STAGES = VK_SHADER_STAGE_RAYGEN_BIT_KHR
+                               | VK_SHADER_STAGE_ANY_HIT_BIT_KHR
+                               | VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR
+                               | VK_SHADER_STAGE_MISS_BIT_KHR
+                               | VK_SHADER_STAGE_INTERSECTION_BIT_KHR
+                               | VK_SHADER_STAGE_CALLABLE_BIT_KHR;
 
-       return rayTracingPropertiesKHR->getShaderGroupBaseAlignment();
-}
+                       enum TestType
+                       {
+                               TEST_TYPE_FLOW = 0,
+                               TEST_TYPE_PRIMITIVE_ID,
+                               TEST_TYPE_INSTANCE_ID,
+                               TEST_TYPE_INSTANCE_CUSTOM_INDEX,
+                               TEST_TYPE_INTERSECTION_T_KHR,
+                               TEST_TYPE_OBJECT_RAY_ORIGIN_KHR,
+                               TEST_TYPE_OBJECT_RAY_DIRECTION_KHR,
+                               TEST_TYPE_OBJECT_TO_WORLD_KHR,
+                               TEST_TYPE_WORLD_TO_OBJECT_KHR,
+                               TEST_TYPE_NULL_ACCELERATION_STRUCTURE,
+                               TEST_TYPE_GET_RAY_TMIN,
+                               TEST_TYPE_GET_WORLD_RAY_ORIGIN,
+                               TEST_TYPE_GET_WORLD_RAY_DIRECTION,
+                               TEST_TYPE_GET_INTERSECTION_CANDIDATE_AABB_OPAQUE,
+                               TEST_TYPE_GET_INTERSECTION_FRONT_FACE_CANDIDATE,
+                               TEST_TYPE_GET_INTERSECTION_FRONT_FACE_COMMITTED,
+                               TEST_TYPE_GET_INTERSECTION_GEOMETRY_INDEX_CANDIDATE,
+                               TEST_TYPE_GET_INTERSECTION_GEOMETRY_INDEX_COMMITTED,
+                               TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_CANDIDATE,
+                               TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_COMMITTED,
+                               TEST_TYPE_GET_INTERSECTION_INSTANCE_SHADER_BINDING_TABLE_RECORD_OFFSET_CANDIDATE,
+                               TEST_TYPE_GET_INTERSECTION_INSTANCE_SHADER_BINDING_TABLE_RECORD_OFFSET_COMMITTED,
+
+                               TEST_TYPE_LAST
+                       };
+
+                       enum GeomType
+                       {
+                               GEOM_TYPE_TRIANGLES,
+                               GEOM_TYPE_AABBS,
+                               GEOM_TYPE_LAST,
+                       };
 
-VkImageCreateInfo makeImageCreateInfo (VkFormat                                format,
-                                                                          deUint32                             width,
-                                                                          deUint32                             height,
-                                                                          deUint32                             depth,
-                                                                          VkImageType                  imageType       = VK_IMAGE_TYPE_3D,
-                                                                          VkImageUsageFlags    usageFlags      = VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT)
-{
-       const VkImageCreateInfo imageCreateInfo =
-       {
-               VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,    // VkStructureType                      sType;
-               DE_NULL,                                                                // const void*                          pNext;
-               (VkImageCreateFlags)0u,                                 // VkImageCreateFlags           flags;
-               imageType,                                                              // VkImageType                          imageType;
-               format,                                                                 // VkFormat                                     format;
-               makeExtent3D(width, height, depth),             // VkExtent3D                           extent;
-               1u,                                                                             // deUint32                                     mipLevels;
-               1u,                                                                             // deUint32                                     arrayLayers;
-               VK_SAMPLE_COUNT_1_BIT,                                  // VkSampleCountFlagBits        samples;
-               VK_IMAGE_TILING_OPTIMAL,                                // VkImageTiling                        tiling;
-               usageFlags,                                                             // VkImageUsageFlags            usage;
-               VK_SHARING_MODE_EXCLUSIVE,                              // VkSharingMode                        sharingMode;
-               0u,                                                                             // deUint32                                     queueFamilyIndexCount;
-               DE_NULL,                                                                // const deUint32*                      pQueueFamilyIndices;
-               VK_IMAGE_LAYOUT_UNDEFINED                               // VkImageLayout                        initialLayout;
-       };
-
-       return imageCreateInfo;
-}
-
-Move<VkPipeline> makeComputePipeline (const DeviceInterface&           vk,
-                                                                         const VkDevice                                device,
-                                                                         const VkPipelineLayout                pipelineLayout,
-                                                                         const VkShaderModule                  shaderModule)
-{
-       const VkPipelineShaderStageCreateInfo pipelineShaderStageParams =
-       {
-               VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,    // VkStructureType                                              sType;
-               DE_NULL,                                                                                                // const void*                                                  pNext;
-               0u,                                                                                                             // VkPipelineShaderStageCreateFlags             flags;
-               VK_SHADER_STAGE_COMPUTE_BIT,                                                    // VkShaderStageFlagBits                                stage;
-               shaderModule,                                                                                   // VkShaderModule                                               module;
-               "main",                                                                                                 // const char*                                                  pName;
-               DE_NULL,                                                                                                // const VkSpecializationInfo*                  pSpecializationInfo;
-       };
-       const VkComputePipelineCreateInfo pipelineCreateInfo =
-       {
-               VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,         // VkStructureType                                      sType;
-               DE_NULL,                                                                                        // const void*                                          pNext;
-               0u,                                                                                                     // VkPipelineCreateFlags                        flags;
-               pipelineShaderStageParams,                                                      // VkPipelineShaderStageCreateInfo      stage;
-               pipelineLayout,                                                                         // VkPipelineLayout                                     layout;
-               DE_NULL,                                                                                        // VkPipeline                                           basePipelineHandle;
-               0,                                                                                                      // deInt32                                                      basePipelineIndex;
-       };
-
-       return createComputePipeline(vk, device, DE_NULL , &pipelineCreateInfo);
-}
-
-static const std::string getMissPassthrough (void)
-{
-       const std::string missPassthrough =
-               "#version 460 core\n"
-               "#extension GL_EXT_ray_tracing : require\n"
-               "layout(location = 0) rayPayloadInEXT vec3 hitValue;\n"
-               "\n"
-               "void main()\n"
-               "{\n"
-               "}\n";
-
-       return missPassthrough;
-}
-
-static const std::string getHitPassthrough (void)
-{
-       const std::string hitPassthrough =
-               "#version 460 core\n"
-               "#extension GL_EXT_ray_tracing : require\n"
-               "hitAttributeEXT vec3 attribs;\n"
-               "layout(location = 0) rayPayloadInEXT vec3 hitValue;\n"
-               "\n"
-               "void main()\n"
-               "{\n"
-               "}\n";
-
-       return hitPassthrough;
-}
-
-static const std::string getGraphicsPassthrough (void)
-{
-       std::ostringstream src;
+                       const deUint32  TEST_WIDTH = 8;
+                       const deUint32  TEST_HEIGHT = 8;
+                       const deUint32  FIXED_POINT_DIVISOR = 1024 * 1024;
+                       const deUint32  FIXED_POINT_ALLOWED_ERROR = static_cast<deUint32>(float(1e-3f) * FIXED_POINT_DIVISOR);
 
-       src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
-               << "\n"
-               << "void main(void)\n"
-               << "{\n"
-               << "}\n";
+                       struct TestParams;
 
-       return src.str();
-}
+                       typedef void (*CheckSupportFunc)(Context& context, const TestParams& testParams);
+                       typedef void (*InitProgramsFunc)(SourceCollections& programCollection, const TestParams& testParams);
+                       typedef const std::string(*ShaderBodyTextFunc)(const TestParams& testParams);
 
-static const std::string getVertexPassthrough (void)
-{
-       std::ostringstream src;
+                       class PipelineConfiguration
+                       {
+                       public:
+                               PipelineConfiguration() {};
+                               virtual                 ~PipelineConfiguration() {};
+
+                               virtual void    initConfiguration(Context& context,
+                                       TestParams& testParams) = 0;
+                               virtual void    fillCommandBuffer(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 commandBuffer,
+                                       const VkAccelerationStructureKHR* rayQueryTopAccelerationStructurePtr,
+                                       const VkDescriptorImageInfo& resultImageInfo) = 0;
+                       };
+
+                       class TestConfiguration
+                       {
+                       public:
+                               TestConfiguration()
+                                       : m_bottomAccelerationStructures()
+                                       , m_topAccelerationStructure()
+                                       , m_expected()
+                               {
+                               }
+                               virtual                                                                                                                 ~TestConfiguration()
+                               {
+                               }
 
-       src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
-               << "\n"
-               << "layout(location = 0) in vec4 in_position;\n"
-               << "\n"
-               << "void main(void)\n"
-               << "{\n"
-               << "  gl_Position = in_position;\n"
-               << "}\n";
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) = 0;
+                               virtual bool                                                                                                    verify(BufferWithMemory* resultBuffer,
+                                       Context& context,
+                                       TestParams& testParams);
 
-       return src.str();
-}
+                       protected:
+                               std::vector<de::SharedPtr<BottomLevelAccelerationStructure>>    m_bottomAccelerationStructures;
+                               de::SharedPtr<TopLevelAccelerationStructure>                                    m_topAccelerationStructure;
+                               std::vector<deInt32>                                                                                    m_expected;
+                       };
 
-class GraphicsConfiguration : public PipelineConfiguration
-{
-public:
-       static void                                             checkSupport                    (Context&                                                       context,
-                                                                                                                        const TestParams&                                      testParams);
-       static void                                             initPrograms                    (SourceCollections&                                     programCollection,
-                                                                                                                        const TestParams&                                      testParams);
-
-                                                                       GraphicsConfiguration   ();
-       virtual                                                 ~GraphicsConfiguration  () {};
-
-       void                                                    initVertexBuffer                (Context&                                                       context,
-                                                                                                                        TestParams&                                            testParams);
-       Move<VkPipeline>                                makeGraphicsPipeline    (Context&                                                       context,
-                                                                                                                        TestParams&                                            testParams);
-       virtual void                                    initConfiguration               (Context&                                                       context,
-                                                                                                                        TestParams&                                            testParams) override;
-       virtual void                                    fillCommandBuffer               (Context&                                                       context,
-                                                                                                                        TestParams&                                            testParams,
-                                                                                                                        VkCommandBuffer                                        commandBuffer,
-                                                                                                                        const VkAccelerationStructureKHR*      rayQueryTopAccelerationStructurePtr,
-                                                                                                                        const VkDescriptorImageInfo&           resultImageInfo) override;
-
-private:
-       Move<VkDescriptorSetLayout>             m_descriptorSetLayout;
-       Move<VkDescriptorPool>                  m_descriptorPool;
-       Move<VkDescriptorSet>                   m_descriptorSet;
-
-       VkFormat                                                m_framebufferFormat;
-       Move<VkImage>                                   m_framebufferImage;
-       de::MovePtr<Allocation>                 m_framebufferImageAlloc;
-       Move<VkImageView>                               m_framebufferAttachment;
-
-       Move<VkShaderModule>                    m_vertShaderModule;
-       Move<VkShaderModule>                    m_geomShaderModule;
-       Move<VkShaderModule>                    m_tescShaderModule;
-       Move<VkShaderModule>                    m_teseShaderModule;
-       Move<VkShaderModule>                    m_fragShaderModule;
-
-       Move<VkRenderPass>                              m_renderPass;
-       Move<VkFramebuffer>                             m_framebuffer;
-       Move<VkPipelineLayout>                  m_pipelineLayout;
-       Move<VkPipeline>                                m_pipeline;
-
-       deUint32                                                m_vertexCount;
-       Move<VkBuffer>                                  m_vertexBuffer;
-       de::MovePtr<Allocation>                 m_vertexBufferAlloc;
-};
-
-GraphicsConfiguration::GraphicsConfiguration()
-       : PipelineConfiguration         ()
-       , m_descriptorSetLayout         ()
-       , m_descriptorPool                      ()
-       , m_descriptorSet                       ()
-       , m_framebufferFormat           (VK_FORMAT_R8G8B8A8_UNORM)
-       , m_framebufferImage            ()
-       , m_framebufferImageAlloc       ()
-       , m_framebufferAttachment       ()
-       , m_vertShaderModule            ()
-       , m_geomShaderModule            ()
-       , m_tescShaderModule            ()
-       , m_teseShaderModule            ()
-       , m_fragShaderModule            ()
-       , m_renderPass                          ()
-       , m_framebuffer                         ()
-       , m_pipelineLayout                      ()
-       , m_pipeline                            ()
-       , m_vertexCount                         (0)
-       , m_vertexBuffer                        ()
-       , m_vertexBufferAlloc           ()
-{
-}
+                       class TestConfigurationFloat : public TestConfiguration
+                       {
+                       public:
+                               TestConfigurationFloat()
+                                       : TestConfiguration()
+                               {
+                               }
+                               virtual                                                                                                                 ~TestConfigurationFloat()
+                               {
+                               }
+                               virtual bool                                                                                                    verify(BufferWithMemory* resultBuffer,
+                                       Context& context,
+                                       TestParams& testParams) override;
+                       };
 
-void GraphicsConfiguration::checkSupport (Context&                     context,
-                                                                                 const TestParams&     testParams)
-{
-       switch (testParams.stage)
-       {
-               case VK_SHADER_STAGE_VERTEX_BIT:
-                       break;
+                       class TestConfigurationVector : public TestConfiguration
+                       {
+                       public:
+                               TestConfigurationVector(bool useStrictComponentMatching = true)
+                                       : TestConfiguration(),
+                                       m_useStrictComponentMatching(useStrictComponentMatching)
+                               {
+                               }
+                               virtual                                                                                                                 ~TestConfigurationVector()
+                               {
+                               }
+                               virtual bool                                                                                                    verify(BufferWithMemory* resultBuffer,
+                                       Context& context,
+                                       TestParams& testParams) override;
 
-               case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
-               case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
-               {
-                       context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_TESSELLATION_SHADER);
+                       private:
+                               bool m_useStrictComponentMatching;
+                       };
 
-                       break;
-               }
+                       class TestConfigurationMatrix : public TestConfiguration
+                       {
+                       public:
+                               TestConfigurationMatrix()
+                                       : TestConfiguration()
+                               {
+                               }
+                               virtual                                                                                                                 ~TestConfigurationMatrix()
+                               {
+                               }
+                               virtual bool                                                                                                    verify(BufferWithMemory* resultBuffer,
+                                       Context& context,
+                                       TestParams& testParams) override;
+                       };
 
-               case VK_SHADER_STAGE_GEOMETRY_BIT:
-               {
-                       context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
+                       struct TestParams
+                       {
+                               deUint32                                width;
+                               deUint32                                height;
+                               deUint32                                depth;
+                               TestType                                testType;
+                               VkShaderStageFlagBits   stage;
+                               GeomType                                geomType;
+                               deUint32                                squaresGroupCount;
+                               deUint32                                geometriesGroupCount;
+                               deUint32                                instancesGroupCount;
+                               VkFormat                                format;
+                               CheckSupportFunc                pipelineCheckSupport;
+                               InitProgramsFunc                pipelineInitPrograms;
+                               ShaderBodyTextFunc              testConfigShaderBodyText;
+                               CheckSupportFunc                testConfigCheckSupport;
+                       };
+
+                       deUint32 getShaderGroupHandleSize(const InstanceInterface& vki,
+                               const VkPhysicalDevice  physicalDevice)
+                       {
+                               de::MovePtr<RayTracingProperties>       rayTracingPropertiesKHR;
 
-                       break;
-               }
+                               rayTracingPropertiesKHR = makeRayTracingProperties(vki, physicalDevice);
 
-               case VK_SHADER_STAGE_FRAGMENT_BIT:
-                       break;
+                               return rayTracingPropertiesKHR->getShaderGroupHandleSize();
+                       }
 
-               default:
-                       TCU_THROW(InternalError, "Unknown stage");
-       }
-}
+                       deUint32 getShaderGroupBaseAlignment(const InstanceInterface& vki,
+                               const VkPhysicalDevice  physicalDevice)
+                       {
+                               de::MovePtr<RayTracingProperties>       rayTracingPropertiesKHR;
 
-void GraphicsConfiguration::initPrograms (SourceCollections&   programCollection,
-                                                                                 const TestParams&             testParams)
-{
-       const vk::ShaderBuildOptions    buildOptions            (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
+                               rayTracingPropertiesKHR = makeRayTracingProperties(vki, physicalDevice);
 
-       const std::string                               testShaderBody          = testParams.testConfigShaderBodyText(testParams);
+                               return rayTracingPropertiesKHR->getShaderGroupBaseAlignment();
+                       }
 
-       switch (testParams.stage)
-       {
-               case VK_SHADER_STAGE_VERTEX_BIT:
-               {
+                       VkImageCreateInfo makeImageCreateInfo(VkFormat                          format,
+                               deUint32                                width,
+                               deUint32                                height,
+                               deUint32                                depth,
+                               VkImageType                     imageType = VK_IMAGE_TYPE_3D,
+                               VkImageUsageFlags       usageFlags = VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT)
                        {
-                               std::ostringstream src;
-                               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
-                                       << "#extension GL_EXT_ray_query : require\n"
-                                       << "#extension GL_EXT_ray_tracing : require\n"
-                                       << "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
-                                       << "layout(set = 0, binding = 1) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
-                                       << "\n"
-                                       << "void testFunc(ivec3 pos, ivec3 size)\n"
-                                       << "{\n"
-                                       << testShaderBody
-                                       << "}\n"
-                                       << "\n"
-                                       << "void main(void)\n"
-                                       << "{\n"
-                                       << "  const int   posId    = int(gl_VertexIndex / 3);\n"
-                                       << "  const int   vertId   = int(gl_VertexIndex % 3);\n"
-                                       << "  const ivec3 size     = ivec3(" << testParams.width << ", " << testParams.height << ", 1);\n"
-                                       << "  const ivec3 pos      = ivec3(posId % size.x, posId / size.x, 0);\n"
-                                       << "\n"
-                                       << "  if (vertId == 0)\n"
-                                       << "  {\n"
-                                       << "    testFunc(pos, size);\n"
-                                       << "  }\n"
-                                       << "}\n";
+                               const VkImageCreateInfo imageCreateInfo =
+                               {
+                                       VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,    // VkStructureType                      sType;
+                                       DE_NULL,                                                                // const void*                          pNext;
+                                       (VkImageCreateFlags)0u,                                 // VkImageCreateFlags           flags;
+                                       imageType,                                                              // VkImageType                          imageType;
+                                       format,                                                                 // VkFormat                                     format;
+                                       makeExtent3D(width, height, depth),             // VkExtent3D                           extent;
+                                       1u,                                                                             // deUint32                                     mipLevels;
+                                       1u,                                                                             // deUint32                                     arrayLayers;
+                                       VK_SAMPLE_COUNT_1_BIT,                                  // VkSampleCountFlagBits        samples;
+                                       VK_IMAGE_TILING_OPTIMAL,                                // VkImageTiling                        tiling;
+                                       usageFlags,                                                             // VkImageUsageFlags            usage;
+                                       VK_SHARING_MODE_EXCLUSIVE,                              // VkSharingMode                        sharingMode;
+                                       0u,                                                                             // deUint32                                     queueFamilyIndexCount;
+                                       DE_NULL,                                                                // const deUint32*                      pQueueFamilyIndices;
+                                       VK_IMAGE_LAYOUT_UNDEFINED                               // VkImageLayout                        initialLayout;
+                               };
 
-                               programCollection.glslSources.add("vert") << glu::VertexSource(src.str()) << buildOptions;
+                               return imageCreateInfo;
                        }
 
-                       programCollection.glslSources.add("frag") << glu::FragmentSource(getGraphicsPassthrough()) << buildOptions;
+                       Move<VkPipeline> makeComputePipeline(const DeviceInterface& vk,
+                               const VkDevice                          device,
+                               const VkPipelineLayout          pipelineLayout,
+                               const VkShaderModule                    shaderModule)
+                       {
+                               const VkPipelineShaderStageCreateInfo pipelineShaderStageParams =
+                               {
+                                       VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,    // VkStructureType                                              sType;
+                                       DE_NULL,                                                                                                // const void*                                                  pNext;
+                                       0u,                                                                                                             // VkPipelineShaderStageCreateFlags             flags;
+                                       VK_SHADER_STAGE_COMPUTE_BIT,                                                    // VkShaderStageFlagBits                                stage;
+                                       shaderModule,                                                                                   // VkShaderModule                                               module;
+                                       "main",                                                                                                 // const char*                                                  pName;
+                                       DE_NULL,                                                                                                // const VkSpecializationInfo*                  pSpecializationInfo;
+                               };
+                               const VkComputePipelineCreateInfo pipelineCreateInfo =
+                               {
+                                       VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,         // VkStructureType                                      sType;
+                                       DE_NULL,                                                                                        // const void*                                          pNext;
+                                       0u,                                                                                                     // VkPipelineCreateFlags                        flags;
+                                       pipelineShaderStageParams,                                                      // VkPipelineShaderStageCreateInfo      stage;
+                                       pipelineLayout,                                                                         // VkPipelineLayout                                     layout;
+                                       DE_NULL,                                                                                        // VkPipeline                                           basePipelineHandle;
+                                       0,                                                                                                      // deInt32                                                      basePipelineIndex;
+                               };
 
-                       break;
-               }
+                               return createComputePipeline(vk, device, DE_NULL, &pipelineCreateInfo);
+                       }
 
-               case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
-               {
+                       static const std::string getMissPassthrough(void)
                        {
-                               std::ostringstream src;
-                               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
-                                       << "\n"
-                                       << "layout(location = 0) in vec4 in_position;\n"
-                                       << "out gl_PerVertex\n"
-                                       << "{\n"
-                                       << "  vec4 gl_Position;\n"
-                                       << "};\n"
-                                       << "\n"
-                                       << "void main(void)\n"
-                                       << "{\n"
-                                       << "  gl_Position = in_position;\n"
-                                       << "}\n";
+                               const std::string missPassthrough =
+                                       "#version 460 core\n"
+                                       "#extension GL_EXT_ray_tracing : require\n"
+                                       "layout(location = 0) rayPayloadInEXT vec3 hitValue;\n"
+                                       "\n"
+                                       "void main()\n"
+                                       "{\n"
+                                       "}\n";
 
-                               programCollection.glslSources.add("vert") << glu::VertexSource(src.str()) << buildOptions;
+                               return missPassthrough;
                        }
 
+                       static const std::string getHitPassthrough(void)
                        {
-                               std::ostringstream src;
-                               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
-                                       << "#extension GL_EXT_tessellation_shader : require\n"
-                                       << "#extension GL_EXT_ray_query : require\n"
-                                       << "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
-                                       << "layout(set = 0, binding = 1) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
-                                       << "in gl_PerVertex\n"
-                                       << "{\n"
-                                       << "  vec4 gl_Position;\n"
-                                       << "} gl_in[];\n"
-                                       << "layout(vertices = 4) out;\n"
-                                       << "out gl_PerVertex\n"
-                                       << "{\n"
-                                       << "  vec4 gl_Position;\n"
-                                       << "} gl_out[];\n"
-                                       << "\n"
-                                       << "void testFunc(ivec3 pos, ivec3 size)\n"
-                                       << "{\n"
-                                       << testShaderBody
-                                       << "}\n"
-                                       << "\n"
-                                       << "void main(void)\n"
-                                       << "{\n"
-                                       << "\n"
-                                       << "  if (gl_InvocationID == 0)\n"
-                                       << "  {\n"
-                                       << "    const ivec3 size = ivec3(" << testParams.width << ", " << testParams.height << ", 1);\n"
-                                       << "    for (int y = 0; y < size.y; y++)\n"
-                                       << "    for (int x = 0; x < size.x; x++)\n"
-                                       << "    {\n"
-                                       << "      const ivec3 pos = ivec3(x, y, 0);\n"
-                                       << "      testFunc(pos, size);\n"
-                                       << "    }\n"
-                                       << "  }\n"
-                                       << "\n"
-                                       << "  gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
-                                       << "  gl_TessLevelInner[0] = 1;\n"
-                                       << "  gl_TessLevelInner[1] = 1;\n"
-                                       << "  gl_TessLevelOuter[gl_InvocationID] = 1;\n"
-                                       << "}\n";
+                               const std::string hitPassthrough =
+                                       "#version 460 core\n"
+                                       "#extension GL_EXT_ray_tracing : require\n"
+                                       "hitAttributeEXT vec3 attribs;\n"
+                                       "layout(location = 0) rayPayloadInEXT vec3 hitValue;\n"
+                                       "\n"
+                                       "void main()\n"
+                                       "{\n"
+                                       "}\n";
 
-                               programCollection.glslSources.add("tesc") << glu::TessellationControlSource(src.str()) << buildOptions;
+                               return hitPassthrough;
                        }
 
+                       static const std::string getGraphicsPassthrough(void)
                        {
                                std::ostringstream src;
+
                                src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
-                                       << "#extension GL_EXT_tessellation_shader : require\n"
-                                       << "layout(quads, equal_spacing, ccw) in;\n"
-                                       << "in gl_PerVertex\n"
-                                       << "{\n"
-                                       << "  vec4 gl_Position;\n"
-                                       << "} gl_in[];\n"
                                        << "\n"
                                        << "void main(void)\n"
                                        << "{\n"
-                                       << "  gl_Position = gl_in[0].gl_Position;\n"
                                        << "}\n";
 
-                               programCollection.glslSources.add("tese") << glu::TessellationEvaluationSource(src.str()) << buildOptions;
+                               return src.str();
                        }
 
-                       break;
-               }
-
-               case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
-               {
+                       static const std::string getVertexPassthrough(void)
                        {
                                std::ostringstream src;
+
                                src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
                                        << "\n"
                                        << "layout(location = 0) in vec4 in_position;\n"
-                                       << "out gl_PerVertex"
-                                       << "{\n"
-                                       << "  vec4 gl_Position;\n"
-                                       << "};\n"
                                        << "\n"
                                        << "void main(void)\n"
                                        << "{\n"
                                        << "  gl_Position = in_position;\n"
                                        << "}\n";
 
-                               programCollection.glslSources.add("vert") << glu::VertexSource(src.str()) << buildOptions;
+                               return src.str();
                        }
 
+                       class GraphicsConfiguration : public PipelineConfiguration
+                       {
+                       public:
+                               static void                                             checkSupport(Context& context,
+                                       const TestParams& testParams);
+                               static void                                             initPrograms(SourceCollections& programCollection,
+                                       const TestParams& testParams);
+
+                               GraphicsConfiguration();
+                               virtual                                                 ~GraphicsConfiguration() {};
+
+                               void                                                    initVertexBuffer(Context& context,
+                                       TestParams& testParams);
+                               Move<VkPipeline>                                makeGraphicsPipeline(Context& context,
+                                       TestParams& testParams);
+                               virtual void                                    initConfiguration(Context& context,
+                                       TestParams& testParams) override;
+                               virtual void                                    fillCommandBuffer(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 commandBuffer,
+                                       const VkAccelerationStructureKHR* rayQueryTopAccelerationStructurePtr,
+                                       const VkDescriptorImageInfo& resultImageInfo) override;
+
+                       private:
+                               Move<VkDescriptorSetLayout>             m_descriptorSetLayout;
+                               Move<VkDescriptorPool>                  m_descriptorPool;
+                               Move<VkDescriptorSet>                   m_descriptorSet;
+
+                               VkFormat                                                m_framebufferFormat;
+                               Move<VkImage>                                   m_framebufferImage;
+                               de::MovePtr<Allocation>                 m_framebufferImageAlloc;
+                               Move<VkImageView>                               m_framebufferAttachment;
+
+                               Move<VkShaderModule>                    m_vertShaderModule;
+                               Move<VkShaderModule>                    m_geomShaderModule;
+                               Move<VkShaderModule>                    m_tescShaderModule;
+                               Move<VkShaderModule>                    m_teseShaderModule;
+                               Move<VkShaderModule>                    m_fragShaderModule;
+
+                               Move<VkRenderPass>                              m_renderPass;
+                               Move<VkFramebuffer>                             m_framebuffer;
+                               Move<VkPipelineLayout>                  m_pipelineLayout;
+                               Move<VkPipeline>                                m_pipeline;
+
+                               deUint32                                                m_vertexCount;
+                               Move<VkBuffer>                                  m_vertexBuffer;
+                               de::MovePtr<Allocation>                 m_vertexBufferAlloc;
+                       };
+
+                       GraphicsConfiguration::GraphicsConfiguration()
+                               : PipelineConfiguration()
+                               , m_descriptorSetLayout()
+                               , m_descriptorPool()
+                               , m_descriptorSet()
+                               , m_framebufferFormat(VK_FORMAT_R8G8B8A8_UNORM)
+                               , m_framebufferImage()
+                               , m_framebufferImageAlloc()
+                               , m_framebufferAttachment()
+                               , m_vertShaderModule()
+                               , m_geomShaderModule()
+                               , m_tescShaderModule()
+                               , m_teseShaderModule()
+                               , m_fragShaderModule()
+                               , m_renderPass()
+                               , m_framebuffer()
+                               , m_pipelineLayout()
+                               , m_pipeline()
+                               , m_vertexCount(0)
+                               , m_vertexBuffer()
+                               , m_vertexBufferAlloc()
                        {
-                               std::ostringstream src;
-                               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
-                                       << "#extension GL_EXT_tessellation_shader : require\n"
-                                       << "in gl_PerVertex\n"
-                                       << "{\n"
-                                       << "  vec4 gl_Position;\n"
-                                       << "} gl_in[];\n"
-                                       << "layout(vertices = 4) out;\n"
-                                       << "out gl_PerVertex\n"
-                                       << "{\n"
-                                       << "  vec4 gl_Position;\n"
-                                       << "} gl_out[];\n"
-                                       << "\n"
-                                       << "void main(void)\n"
-                                       << "{\n"
-                                       << "  gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
-                                       << "  gl_TessLevelInner[0] = 1;\n"
-                                       << "  gl_TessLevelInner[1] = 1;\n"
-                                       << "  gl_TessLevelOuter[gl_InvocationID] = 1;\n"
-                                       << "}\n";
-
-                               programCollection.glslSources.add("tesc") << glu::TessellationControlSource(src.str()) << buildOptions;
                        }
 
+                       void GraphicsConfiguration::checkSupport(Context& context,
+                               const TestParams& testParams)
                        {
-                               std::ostringstream src;
-                               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
-                                       << "#extension GL_EXT_tessellation_shader : require\n"
-                                       << "#extension GL_EXT_ray_query : require\n"
-                                       << "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
-                                       << "layout(set = 0, binding = 1) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
-                                       << "layout(quads, equal_spacing, ccw) in;\n"
-                                       << "in gl_PerVertex\n"
-                                       << "{\n"
-                                       << "  vec4 gl_Position;\n"
-                                       << "} gl_in[];\n"
-                                       << "\n"
-                                       << "void testFunc(ivec3 pos, ivec3 size)\n"
-                                       << "{\n"
-                                       << testShaderBody
-                                       << "}\n"
-                                       << "\n"
-                                       << "void main(void)\n"
-                                       << "{\n"
-                                       << "  const ivec3 size = ivec3(" << testParams.width << ", " << testParams.height << ", 1);\n"
-                                       << "\n"
-                                       << "  if (gl_PrimitiveID == 0)\n"
-                                       << "  {\n"
-                                       << "    const ivec3 size = ivec3(" << testParams.width << ", " << testParams.height << ", 1);\n"
-                                       << "    for (int y = 0; y < size.y; y++)\n"
-                                       << "    for (int x = 0; x < size.x; x++)\n"
-                                       << "    {\n"
-                                       << "      const ivec3 pos = ivec3(x, y, 0);\n"
-                                       << "      testFunc(pos, size);\n"
-                                       << "    }\n"
-                                       << "  }\n"
-                                       << "\n"
-                                       << "  gl_Position = gl_in[0].gl_Position;\n"
-                                       << "}\n";
-
-                               programCollection.glslSources.add("tese") << glu::TessellationEvaluationSource(src.str()) << buildOptions;
-                       }
+                               switch (testParams.stage)
+                               {
+                               case VK_SHADER_STAGE_VERTEX_BIT:
+                                       break;
 
-                       break;
-               }
+                               case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
+                               case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
+                               {
+                                       context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_TESSELLATION_SHADER);
 
-               case VK_SHADER_STAGE_GEOMETRY_BIT:
-               {
-                       programCollection.glslSources.add("vert") << glu::VertexSource(getVertexPassthrough()) << buildOptions;
+                                       break;
+                               }
 
-                       {
-                               std::ostringstream src;
-                               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
-                                       << "#extension GL_EXT_ray_query : require\n"
-                                       << "layout(triangles) in;\n"
-                                       << "layout(points, max_vertices = 1) out;\n"
-                                       << "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
-                                       << "layout(set = 0, binding = 1) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
-                                       << "\n"
-                                       << "void testFunc(ivec3 pos, ivec3 size)\n"
-                                       << "{\n"
-                                       << testShaderBody
-                                       << "}\n"
-                                       << "\n"
-                                       << "void main(void)\n"
-                                       << "{\n"
-                                       << "  const int   posId    = int(gl_PrimitiveIDIn);\n"
-                                       << "  const ivec3 size     = ivec3(" << testParams.width << ", " << testParams.height << ", 1);\n"
-                                       << "  const ivec3 pos      = ivec3(posId % size.x, posId / size.x, 0);\n"
-                                       << "\n"
-                                       << "  testFunc(pos, size);\n"
-                                       << "}\n";
+                               case VK_SHADER_STAGE_GEOMETRY_BIT:
+                               {
+                                       context.requireDeviceCoreFeature(DEVICE_CORE_FEATURE_GEOMETRY_SHADER);
 
-                               programCollection.glslSources.add("geom") << glu::GeometrySource(src.str()) << buildOptions;
-                       }
+                                       break;
+                               }
 
-                       break;
-               }
+                               case VK_SHADER_STAGE_FRAGMENT_BIT:
+                                       break;
 
-               case VK_SHADER_STAGE_FRAGMENT_BIT:
-               {
-                       programCollection.glslSources.add("vert") << glu::VertexSource(getVertexPassthrough()) << buildOptions;
+                               default:
+                                       TCU_THROW(InternalError, "Unknown stage");
+                               }
+                       }
 
+                       void GraphicsConfiguration::initPrograms(SourceCollections& programCollection,
+                               const TestParams& testParams)
                        {
-                               std::ostringstream src;
-                               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
-                                       << "#extension GL_EXT_ray_query : require\n"
-                                       << "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
-                                       << "layout(set = 0, binding = 1) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
-                                       << "\n"
-                                       << "void testFunc(ivec3 pos, ivec3 size)\n"
-                                       << "{\n"
-                                       << testShaderBody
-                                       << "}\n"
-                                       << "\n"
-                                       << "void main(void)\n"
-                                       << "{\n"
-                                       << "  const ivec3 size     = ivec3(" << testParams.width << ", " << testParams.height << ", 1);\n"
-                                       << "  const ivec3 pos      = ivec3(int(gl_FragCoord.x - 0.5f), int(gl_FragCoord.y - 0.5f), 0);\n"
-                                       << "\n"
-                                       << "  testFunc(pos, size);\n"
-                                       << "}\n";
+                               const vk::ShaderBuildOptions    buildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
 
-                               programCollection.glslSources.add("frag") << glu::FragmentSource(src.str()) << buildOptions;
-                       }
+                               const std::string                               testShaderBody = testParams.testConfigShaderBodyText(testParams);
 
-                       break;
-               }
+                               switch (testParams.stage)
+                               {
+                               case VK_SHADER_STAGE_VERTEX_BIT:
+                               {
+                                       {
+                                               std::ostringstream src;
+                                               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
+                                                       << "#extension GL_EXT_ray_query : require\n"
+                                                       << "#extension GL_EXT_ray_tracing : require\n"
+                                                       << "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
+                                                       << "layout(set = 0, binding = 1) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
+                                                       << "\n"
+                                                       << "void testFunc(ivec3 pos, ivec3 size)\n"
+                                                       << "{\n"
+                                                       << testShaderBody
+                                                       << "}\n"
+                                                       << "\n"
+                                                       << "void main(void)\n"
+                                                       << "{\n"
+                                                       << "  const int   posId    = int(gl_VertexIndex / 3);\n"
+                                                       << "  const int   vertId   = int(gl_VertexIndex % 3);\n"
+                                                       << "  const ivec3 size     = ivec3(" << testParams.width << ", " << testParams.height << ", 1);\n"
+                                                       << "  const ivec3 pos      = ivec3(posId % size.x, posId / size.x, 0);\n"
+                                                       << "\n"
+                                                       << "  if (vertId == 0)\n"
+                                                       << "  {\n"
+                                                       << "    testFunc(pos, size);\n"
+                                                       << "  }\n"
+                                                       << "}\n";
+
+                                               programCollection.glslSources.add("vert") << glu::VertexSource(src.str()) << buildOptions;
+                                       }
 
-               default:
-                       TCU_THROW(InternalError, "Unknown stage");
-       }
-}
+                                       programCollection.glslSources.add("frag") << glu::FragmentSource(getGraphicsPassthrough()) << buildOptions;
 
-void GraphicsConfiguration::initVertexBuffer (Context&         context,
-                                                                                         TestParams&   testParams)
-{
-       const DeviceInterface&  vkd                     = context.getDeviceInterface();
-       const VkDevice                  device          = context.getDevice();
-       const deUint32                  width           = testParams.width;
-       const deUint32                  height          = testParams.height;
-       Allocator&                              allocator       = context.getDefaultAllocator();
-       std::vector<tcu::Vec4>  vertices;
-
-       switch (testParams.stage)
-       {
-               case VK_SHADER_STAGE_VERTEX_BIT:
-               {
-                       const float z = 0.0f;
-                       const float w = 1.0f;
+                                       break;
+                               }
 
-                       vertices.reserve(3 * height * width);
+                               case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
+                               {
+                                       {
+                                               std::ostringstream src;
+                                               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
+                                                       << "\n"
+                                                       << "layout(location = 0) in vec4 in_position;\n"
+                                                       << "out gl_PerVertex\n"
+                                                       << "{\n"
+                                                       << "  vec4 gl_Position;\n"
+                                                       << "};\n"
+                                                       << "\n"
+                                                       << "void main(void)\n"
+                                                       << "{\n"
+                                                       << "  gl_Position = in_position;\n"
+                                                       << "}\n";
+
+                                               programCollection.glslSources.add("vert") << glu::VertexSource(src.str()) << buildOptions;
+                                       }
 
-                       for (deUint32 y = 0; y < height; ++y)
-                       for (deUint32 x = 0; x < width; ++x)
-                       {
-                               const float     x0      = float(x + 0) / float(width);
-                               const float     y0      = float(y + 0) / float(height);
-                               const float     x1      = float(x + 1) / float(width);
-                               const float     y1      = float(y + 1) / float(height);
-                               const float     xm      = (x0 + x1) / 2.0f;
-                               const float     ym      = (y0 + y1) / 2.0f;
+                                       {
+                                               std::ostringstream src;
+                                               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
+                                                       << "#extension GL_EXT_tessellation_shader : require\n"
+                                                       << "#extension GL_EXT_ray_query : require\n"
+                                                       << "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
+                                                       << "layout(set = 0, binding = 1) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
+                                                       << "in gl_PerVertex\n"
+                                                       << "{\n"
+                                                       << "  vec4 gl_Position;\n"
+                                                       << "} gl_in[];\n"
+                                                       << "layout(vertices = 4) out;\n"
+                                                       << "out gl_PerVertex\n"
+                                                       << "{\n"
+                                                       << "  vec4 gl_Position;\n"
+                                                       << "} gl_out[];\n"
+                                                       << "\n"
+                                                       << "void testFunc(ivec3 pos, ivec3 size)\n"
+                                                       << "{\n"
+                                                       << testShaderBody
+                                                       << "}\n"
+                                                       << "\n"
+                                                       << "void main(void)\n"
+                                                       << "{\n"
+                                                       << "\n"
+                                                       << "  if (gl_InvocationID == 0)\n"
+                                                       << "  {\n"
+                                                       << "    const ivec3 size = ivec3(" << testParams.width << ", " << testParams.height << ", 1);\n"
+                                                       << "    for (int y = 0; y < size.y; y++)\n"
+                                                       << "    for (int x = 0; x < size.x; x++)\n"
+                                                       << "    {\n"
+                                                       << "      const ivec3 pos = ivec3(x, y, 0);\n"
+                                                       << "      testFunc(pos, size);\n"
+                                                       << "    }\n"
+                                                       << "  }\n"
+                                                       << "\n"
+                                                       << "  gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+                                                       << "  gl_TessLevelInner[0] = 1;\n"
+                                                       << "  gl_TessLevelInner[1] = 1;\n"
+                                                       << "  gl_TessLevelOuter[gl_InvocationID] = 1;\n"
+                                                       << "}\n";
+
+                                               programCollection.glslSources.add("tesc") << glu::TessellationControlSource(src.str()) << buildOptions;
+                                       }
 
-                               vertices.push_back(tcu::Vec4(x0, y0, z, w));
-                               vertices.push_back(tcu::Vec4(xm, y1, z, w));
-                               vertices.push_back(tcu::Vec4(x1, ym, z, w));
-                       }
+                                       {
+                                               std::ostringstream src;
+                                               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
+                                                       << "#extension GL_EXT_tessellation_shader : require\n"
+                                                       << "layout(quads, equal_spacing, ccw) in;\n"
+                                                       << "in gl_PerVertex\n"
+                                                       << "{\n"
+                                                       << "  vec4 gl_Position;\n"
+                                                       << "} gl_in[];\n"
+                                                       << "\n"
+                                                       << "void main(void)\n"
+                                                       << "{\n"
+                                                       << "  gl_Position = gl_in[0].gl_Position;\n"
+                                                       << "}\n";
+
+                                               programCollection.glslSources.add("tese") << glu::TessellationEvaluationSource(src.str()) << buildOptions;
+                                       }
 
-                       break;
-               }
+                                       break;
+                               }
 
-               case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
-               {
-                       const float             z = 0.0f;
-                       const float             w = 1.0f;
-                       const tcu::Vec4 a = tcu::Vec4(-1.0f, -1.0f, z, w);
-                       const tcu::Vec4 b = tcu::Vec4(+1.0f, -1.0f, z, w);
-                       const tcu::Vec4 c = tcu::Vec4(+1.0f, +1.0f, z, w);
-                       const tcu::Vec4 d = tcu::Vec4(-1.0f, +1.0f, z, w);
-
-                       vertices.push_back(a);
-                       vertices.push_back(b);
-                       vertices.push_back(c);
-                       vertices.push_back(d);
-
-                       break;
-               }
+                               case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
+                               {
+                                       {
+                                               std::ostringstream src;
+                                               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
+                                                       << "\n"
+                                                       << "layout(location = 0) in vec4 in_position;\n"
+                                                       << "out gl_PerVertex"
+                                                       << "{\n"
+                                                       << "  vec4 gl_Position;\n"
+                                                       << "};\n"
+                                                       << "\n"
+                                                       << "void main(void)\n"
+                                                       << "{\n"
+                                                       << "  gl_Position = in_position;\n"
+                                                       << "}\n";
+
+                                               programCollection.glslSources.add("vert") << glu::VertexSource(src.str()) << buildOptions;
+                                       }
 
-               case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
-               {
-                       const float             z = 0.0f;
-                       const float             w = 1.0f;
-                       const tcu::Vec4 a = tcu::Vec4(-1.0f, -1.0f, z, w);
-                       const tcu::Vec4 b = tcu::Vec4(+1.0f, -1.0f, z, w);
-                       const tcu::Vec4 c = tcu::Vec4(+1.0f, +1.0f, z, w);
-                       const tcu::Vec4 d = tcu::Vec4(-1.0f, +1.0f, z, w);
-
-                       vertices.push_back(a);
-                       vertices.push_back(b);
-                       vertices.push_back(c);
-                       vertices.push_back(d);
-
-                       break;
-               }
+                                       {
+                                               std::ostringstream src;
+                                               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
+                                                       << "#extension GL_EXT_tessellation_shader : require\n"
+                                                       << "in gl_PerVertex\n"
+                                                       << "{\n"
+                                                       << "  vec4 gl_Position;\n"
+                                                       << "} gl_in[];\n"
+                                                       << "layout(vertices = 4) out;\n"
+                                                       << "out gl_PerVertex\n"
+                                                       << "{\n"
+                                                       << "  vec4 gl_Position;\n"
+                                                       << "} gl_out[];\n"
+                                                       << "\n"
+                                                       << "void main(void)\n"
+                                                       << "{\n"
+                                                       << "  gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
+                                                       << "  gl_TessLevelInner[0] = 1;\n"
+                                                       << "  gl_TessLevelInner[1] = 1;\n"
+                                                       << "  gl_TessLevelOuter[gl_InvocationID] = 1;\n"
+                                                       << "}\n";
+
+                                               programCollection.glslSources.add("tesc") << glu::TessellationControlSource(src.str()) << buildOptions;
+                                       }
 
-               case VK_SHADER_STAGE_GEOMETRY_BIT:
-               {
-                       const float z = 0.0f;
-                       const float w = 1.0f;
+                                       {
+                                               std::ostringstream src;
+                                               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
+                                                       << "#extension GL_EXT_tessellation_shader : require\n"
+                                                       << "#extension GL_EXT_ray_query : require\n"
+                                                       << "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
+                                                       << "layout(set = 0, binding = 1) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
+                                                       << "layout(quads, equal_spacing, ccw) in;\n"
+                                                       << "in gl_PerVertex\n"
+                                                       << "{\n"
+                                                       << "  vec4 gl_Position;\n"
+                                                       << "} gl_in[];\n"
+                                                       << "\n"
+                                                       << "void testFunc(ivec3 pos, ivec3 size)\n"
+                                                       << "{\n"
+                                                       << testShaderBody
+                                                       << "}\n"
+                                                       << "\n"
+                                                       << "void main(void)\n"
+                                                       << "{\n"
+                                                       << "  const ivec3 size = ivec3(" << testParams.width << ", " << testParams.height << ", 1);\n"
+                                                       << "\n"
+                                                       << "  if (gl_PrimitiveID == 0)\n"
+                                                       << "  {\n"
+                                                       << "    const ivec3 size = ivec3(" << testParams.width << ", " << testParams.height << ", 1);\n"
+                                                       << "    for (int y = 0; y < size.y; y++)\n"
+                                                       << "    for (int x = 0; x < size.x; x++)\n"
+                                                       << "    {\n"
+                                                       << "      const ivec3 pos = ivec3(x, y, 0);\n"
+                                                       << "      testFunc(pos, size);\n"
+                                                       << "    }\n"
+                                                       << "  }\n"
+                                                       << "\n"
+                                                       << "  gl_Position = gl_in[0].gl_Position;\n"
+                                                       << "}\n";
+
+                                               programCollection.glslSources.add("tese") << glu::TessellationEvaluationSource(src.str()) << buildOptions;
+                                       }
 
-                       vertices.reserve(3 * height * width);
+                                       break;
+                               }
 
-                       for (deUint32 y = 0; y < height; ++y)
-                       for (deUint32 x = 0; x < width; ++x)
-                       {
-                               const float     x0      = float(x + 0) / float(width);
-                               const float     y0      = float(y + 0) / float(height);
-                               const float     x1      = float(x + 1) / float(width);
-                               const float     y1      = float(y + 1) / float(height);
-                               const float     xm      = (x0 + x1) / 2.0f;
-                               const float     ym      = (y0 + y1) / 2.0f;
+                               case VK_SHADER_STAGE_GEOMETRY_BIT:
+                               {
+                                       programCollection.glslSources.add("vert") << glu::VertexSource(getVertexPassthrough()) << buildOptions;
 
-                               vertices.push_back(tcu::Vec4(x0, y0, z, w));
-                               vertices.push_back(tcu::Vec4(xm, y1, z, w));
-                               vertices.push_back(tcu::Vec4(x1, ym, z, w));
-                       }
+                                       {
+                                               std::ostringstream src;
+                                               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
+                                                       << "#extension GL_EXT_ray_query : require\n"
+                                                       << "layout(triangles) in;\n"
+                                                       << "layout(points, max_vertices = 1) out;\n"
+                                                       << "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
+                                                       << "layout(set = 0, binding = 1) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
+                                                       << "\n"
+                                                       << "void testFunc(ivec3 pos, ivec3 size)\n"
+                                                       << "{\n"
+                                                       << testShaderBody
+                                                       << "}\n"
+                                                       << "\n"
+                                                       << "void main(void)\n"
+                                                       << "{\n"
+                                                       << "  const int   posId    = int(gl_PrimitiveIDIn);\n"
+                                                       << "  const ivec3 size     = ivec3(" << testParams.width << ", " << testParams.height << ", 1);\n"
+                                                       << "  const ivec3 pos      = ivec3(posId % size.x, posId / size.x, 0);\n"
+                                                       << "\n"
+                                                       << "  testFunc(pos, size);\n"
+                                                       << "}\n";
+
+                                               programCollection.glslSources.add("geom") << glu::GeometrySource(src.str()) << buildOptions;
+                                       }
 
-                       break;
-               }
+                                       break;
+                               }
 
-               case VK_SHADER_STAGE_FRAGMENT_BIT:
-               {
-                       const float             z = 1.0f;
-                       const float             w = 1.0f;
-                       const tcu::Vec4 a = tcu::Vec4(-1.0f, -1.0f, z, w);
-                       const tcu::Vec4 b = tcu::Vec4(+1.0f, -1.0f, z, w);
-                       const tcu::Vec4 c = tcu::Vec4(-1.0f, +1.0f, z, w);
-                       const tcu::Vec4 d = tcu::Vec4(+1.0f, +1.0f, z, w);
-
-                       vertices.push_back(a);
-                       vertices.push_back(b);
-                       vertices.push_back(c);
-
-                       vertices.push_back(b);
-                       vertices.push_back(c);
-                       vertices.push_back(d);
-
-                       break;
-               }
+                               case VK_SHADER_STAGE_FRAGMENT_BIT:
+                               {
+                                       programCollection.glslSources.add("vert") << glu::VertexSource(getVertexPassthrough()) << buildOptions;
 
-               default:
-                       TCU_THROW(InternalError, "Unknown stage");
+                                       {
+                                               std::ostringstream src;
+                                               src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_460) << "\n"
+                                                       << "#extension GL_EXT_ray_query : require\n"
+                                                       << "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
+                                                       << "layout(set = 0, binding = 1) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
+                                                       << "\n"
+                                                       << "void testFunc(ivec3 pos, ivec3 size)\n"
+                                                       << "{\n"
+                                                       << testShaderBody
+                                                       << "}\n"
+                                                       << "\n"
+                                                       << "void main(void)\n"
+                                                       << "{\n"
+                                                       << "  const ivec3 size     = ivec3(" << testParams.width << ", " << testParams.height << ", 1);\n"
+                                                       << "  const ivec3 pos      = ivec3(int(gl_FragCoord.x - 0.5f), int(gl_FragCoord.y - 0.5f), 0);\n"
+                                                       << "\n"
+                                                       << "  testFunc(pos, size);\n"
+                                                       << "}\n";
+
+                                               programCollection.glslSources.add("frag") << glu::FragmentSource(src.str()) << buildOptions;
+                                       }
 
-       }
+                                       break;
+                               }
 
-       // Initialize vertex buffer
-       {
-               const VkDeviceSize                      vertexBufferSize                = sizeof(vertices[0][0]) * vertices[0].SIZE * vertices.size();
-               const VkBufferCreateInfo        vertexBufferCreateInfo  = makeBufferCreateInfo(vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
+                               default:
+                                       TCU_THROW(InternalError, "Unknown stage");
+                               }
+                       }
 
-               m_vertexCount           = static_cast<deUint32>(vertices.size());
-               m_vertexBuffer          = createBuffer(vkd, device, &vertexBufferCreateInfo);
-               m_vertexBufferAlloc     = bindBuffer(vkd, device, allocator, *m_vertexBuffer, vk::MemoryRequirement::HostVisible);
+                       void GraphicsConfiguration::initVertexBuffer(Context& context,
+                               TestParams& testParams)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                  device = context.getDevice();
+                               const deUint32                  width = testParams.width;
+                               const deUint32                  height = testParams.height;
+                               Allocator& allocator = context.getDefaultAllocator();
+                               std::vector<tcu::Vec4>  vertices;
+
+                               switch (testParams.stage)
+                               {
+                               case VK_SHADER_STAGE_VERTEX_BIT:
+                               {
+                                       const float z = 0.0f;
+                                       const float w = 1.0f;
+
+                                       vertices.reserve(3 * height * width);
+
+                                       for (deUint32 y = 0; y < height; ++y)
+                                               for (deUint32 x = 0; x < width; ++x)
+                                               {
+                                                       const float     x0 = float(x + 0) / float(width);
+                                                       const float     y0 = float(y + 0) / float(height);
+                                                       const float     x1 = float(x + 1) / float(width);
+                                                       const float     y1 = float(y + 1) / float(height);
+                                                       const float     xm = (x0 + x1) / 2.0f;
+                                                       const float     ym = (y0 + y1) / 2.0f;
+
+                                                       vertices.push_back(tcu::Vec4(x0, y0, z, w));
+                                                       vertices.push_back(tcu::Vec4(xm, y1, z, w));
+                                                       vertices.push_back(tcu::Vec4(x1, ym, z, w));
+                                               }
+
+                                       break;
+                               }
 
-               deMemcpy(m_vertexBufferAlloc->getHostPtr(), vertices.data(), (size_t)vertexBufferSize);
-               flushAlloc(vkd, device, *m_vertexBufferAlloc);
-       }
-}
+                               case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
+                               {
+                                       const float             z = 0.0f;
+                                       const float             w = 1.0f;
+                                       const tcu::Vec4 a = tcu::Vec4(-1.0f, -1.0f, z, w);
+                                       const tcu::Vec4 b = tcu::Vec4(+1.0f, -1.0f, z, w);
+                                       const tcu::Vec4 c = tcu::Vec4(+1.0f, +1.0f, z, w);
+                                       const tcu::Vec4 d = tcu::Vec4(-1.0f, +1.0f, z, w);
+
+                                       vertices.push_back(a);
+                                       vertices.push_back(b);
+                                       vertices.push_back(c);
+                                       vertices.push_back(d);
+
+                                       break;
+                               }
 
-Move<VkPipeline> GraphicsConfiguration::makeGraphicsPipeline (Context&         context,
-                                                                                                                         TestParams&   testParams)
-{
-       const DeviceInterface&                  vkd                                     = context.getDeviceInterface();
-       const VkDevice                                  device                          = context.getDevice();
-       const bool                                              tessStageTest           = (testParams.stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT || testParams.stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
-       const VkPrimitiveTopology               topology                        = tessStageTest ? VK_PRIMITIVE_TOPOLOGY_PATCH_LIST : VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
-       const deUint32                                  patchControlPoints      = tessStageTest ? 4 : 0;
-       const std::vector<VkViewport>   viewports                       (1, makeViewport(testParams.width, testParams.height));
-       const std::vector<VkRect2D>             scissors                        (1, makeRect2D(testParams.width, testParams.height));
-
-       return vk::makeGraphicsPipeline (vkd,
-                                                                        device,
-                                                                        *m_pipelineLayout,
-                                                                        *m_vertShaderModule,
-                                                                        *m_tescShaderModule,
-                                                                        *m_teseShaderModule,
-                                                                        *m_geomShaderModule,
-                                                                        *m_fragShaderModule,
-                                                                        *m_renderPass,
-                                                                        viewports,
-                                                                        scissors,
-                                                                        topology,
-                                                                        0,
-                                                                        patchControlPoints);
-}
-
-void GraphicsConfiguration::initConfiguration (Context&                context,
-                                                                                          TestParams&  testParams)
-{
-       const DeviceInterface&  vkd                     = context.getDeviceInterface();
-       const VkDevice                  device          = context.getDevice();
-       Allocator&                              allocator       = context.getDefaultAllocator();
-       vk::BinaryCollection&   collection      = context.getBinaryCollection();
-       VkShaderStageFlags              shaders         = static_cast<VkShaderStageFlags>(0);
-       deUint32                                shaderCount     = 0;
-
-       if (collection.contains("vert")) shaders |= VK_SHADER_STAGE_VERTEX_BIT;
-       if (collection.contains("geom")) shaders |= VK_SHADER_STAGE_GEOMETRY_BIT;
-       if (collection.contains("tesc")) shaders |= VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
-       if (collection.contains("tese")) shaders |= VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
-       if (collection.contains("frag")) shaders |= VK_SHADER_STAGE_FRAGMENT_BIT;
-
-       for (BinaryCollection::Iterator it = collection.begin(); it != collection.end(); ++it)
-               shaderCount++;
-
-       if (shaderCount != (deUint32)dePop32(shaders))
-               TCU_THROW(InternalError, "Unused shaders detected in the collection");
-
-       if (0 != (shaders & VK_SHADER_STAGE_VERTEX_BIT))                                        m_vertShaderModule = createShaderModule(vkd, device, collection.get("vert"), 0);
-       if (0 != (shaders & VK_SHADER_STAGE_GEOMETRY_BIT))                                      m_geomShaderModule = createShaderModule(vkd, device, collection.get("geom"), 0);
-       if (0 != (shaders & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT))          m_tescShaderModule = createShaderModule(vkd, device, collection.get("tesc"), 0);
-       if (0 != (shaders & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT))       m_teseShaderModule = createShaderModule(vkd, device, collection.get("tese"), 0);
-       if (0 != (shaders & VK_SHADER_STAGE_FRAGMENT_BIT))                                      m_fragShaderModule = createShaderModule(vkd, device, collection.get("frag"), 0);
-
-       m_descriptorSetLayout   = DescriptorSetLayoutBuilder()
-                                                               .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_ALL_GRAPHICS)
-                                                               .addSingleBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, VK_SHADER_STAGE_ALL_GRAPHICS)
-                                                               .build(vkd, device);
-       m_descriptorPool                = DescriptorPoolBuilder()
-                                                               .addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)
-                                                               .addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR)
-                                                               .build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
-       m_descriptorSet                 = makeDescriptorSet             (vkd, device, *m_descriptorPool, *m_descriptorSetLayout);
-       m_framebufferImage              = makeImage                             (vkd, device, makeImageCreateInfo(m_framebufferFormat, testParams.width, testParams.height, 1u, VK_IMAGE_TYPE_2D, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT));
-       m_framebufferImageAlloc = bindImage                             (vkd, device, allocator, *m_framebufferImage, MemoryRequirement::Any);
-       m_framebufferAttachment = makeImageView                 (vkd, device, *m_framebufferImage, VK_IMAGE_VIEW_TYPE_2D, m_framebufferFormat, makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u));
-       m_renderPass                    = makeRenderPass                (vkd, device, m_framebufferFormat);
-       m_framebuffer                   = makeFramebuffer               (vkd, device, *m_renderPass, *m_framebufferAttachment, testParams.width, testParams.height);
-       m_pipelineLayout                = makePipelineLayout    (vkd, device, m_descriptorSetLayout.get());
-       m_pipeline                              = makeGraphicsPipeline  (context, testParams);
-
-       initVertexBuffer(context, testParams);
-}
-
-void GraphicsConfiguration::fillCommandBuffer (Context&                                                                context,
-                                                                                          TestParams&                                                  testParams,
-                                                                                          VkCommandBuffer                                              cmdBuffer,
-                                                                                          const VkAccelerationStructureKHR*    rayQueryTopAccelerationStructurePtr,
-                                                                                          const VkDescriptorImageInfo&                 resultImageInfo)
-{
-       const DeviceInterface&                                                          vkd                                                                                             = context.getDeviceInterface();
-       const VkDevice                                                                          device                                                                                  = context.getDevice();
-       const VkDeviceSize                                                                      vertexBufferOffset                                                              = 0;
-       const VkWriteDescriptorSetAccelerationStructureKHR      rayQueryAccelerationStructureWriteDescriptorSet =
-       {
-               VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,      //  VkStructureType                                             sType;
-               DE_NULL,                                                                                                                        //  const void*                                                 pNext;
-               1u,                                                                                                                                     //  deUint32                                                    accelerationStructureCount;
-               rayQueryTopAccelerationStructurePtr,                                                            //  const VkAccelerationStructureKHR*   pAccelerationStructures;
-       };
+                               case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
+                               {
+                                       const float             z = 0.0f;
+                                       const float             w = 1.0f;
+                                       const tcu::Vec4 a = tcu::Vec4(-1.0f, -1.0f, z, w);
+                                       const tcu::Vec4 b = tcu::Vec4(+1.0f, -1.0f, z, w);
+                                       const tcu::Vec4 c = tcu::Vec4(+1.0f, +1.0f, z, w);
+                                       const tcu::Vec4 d = tcu::Vec4(-1.0f, +1.0f, z, w);
+
+                                       vertices.push_back(a);
+                                       vertices.push_back(b);
+                                       vertices.push_back(c);
+                                       vertices.push_back(d);
+
+                                       break;
+                               }
 
-       DescriptorSetUpdateBuilder()
-               .writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &resultImageInfo)
-               .writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &rayQueryAccelerationStructureWriteDescriptorSet)
-               .update(vkd, device);
+                               case VK_SHADER_STAGE_GEOMETRY_BIT:
+                               {
+                                       const float z = 0.0f;
+                                       const float w = 1.0f;
+
+                                       vertices.reserve(3 * height * width);
+
+                                       for (deUint32 y = 0; y < height; ++y)
+                                               for (deUint32 x = 0; x < width; ++x)
+                                               {
+                                                       const float     x0 = float(x + 0) / float(width);
+                                                       const float     y0 = float(y + 0) / float(height);
+                                                       const float     x1 = float(x + 1) / float(width);
+                                                       const float     y1 = float(y + 1) / float(height);
+                                                       const float     xm = (x0 + x1) / 2.0f;
+                                                       const float     ym = (y0 + y1) / 2.0f;
+
+                                                       vertices.push_back(tcu::Vec4(x0, y0, z, w));
+                                                       vertices.push_back(tcu::Vec4(xm, y1, z, w));
+                                                       vertices.push_back(tcu::Vec4(x1, ym, z, w));
+                                               }
+
+                                       break;
+                               }
 
-       vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineLayout, 0, 1, &m_descriptorSet.get(), 0, DE_NULL);
-       vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
-       vkd.cmdBindVertexBuffers(cmdBuffer, 0u, 1u, &m_vertexBuffer.get(), &vertexBufferOffset);
+                               case VK_SHADER_STAGE_FRAGMENT_BIT:
+                               {
+                                       const float             z = 1.0f;
+                                       const float             w = 1.0f;
+                                       const tcu::Vec4 a = tcu::Vec4(-1.0f, -1.0f, z, w);
+                                       const tcu::Vec4 b = tcu::Vec4(+1.0f, -1.0f, z, w);
+                                       const tcu::Vec4 c = tcu::Vec4(-1.0f, +1.0f, z, w);
+                                       const tcu::Vec4 d = tcu::Vec4(+1.0f, +1.0f, z, w);
+
+                                       vertices.push_back(a);
+                                       vertices.push_back(b);
+                                       vertices.push_back(c);
+
+                                       vertices.push_back(b);
+                                       vertices.push_back(c);
+                                       vertices.push_back(d);
+
+                                       break;
+                               }
 
-       beginRenderPass(vkd, cmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, testParams.width, testParams.height), tcu::UVec4());
+                               default:
+                                       TCU_THROW(InternalError, "Unknown stage");
 
-       vkd.cmdDraw(cmdBuffer, m_vertexCount, 1u, 0u, 0u);
+                               }
 
-       endRenderPass(vkd, cmdBuffer);
-}
+                               // Initialize vertex buffer
+                               {
+                                       const VkDeviceSize                      vertexBufferSize = sizeof(vertices[0][0]) * vertices[0].SIZE * vertices.size();
+                                       const VkBufferCreateInfo        vertexBufferCreateInfo = makeBufferCreateInfo(vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
 
-class ComputeConfiguration : public PipelineConfiguration
-{
-public:
-                                                               ComputeConfiguration    ();
-       virtual                                         ~ComputeConfiguration   () {};
-
-       static void                                     checkSupport                    (Context&                                                       context,
-                                                                                                                const TestParams&                                      testParams);
-       static void                                     initPrograms                    (SourceCollections&                                     programCollection,
-                                                                                                                const TestParams&                                      testParams);
-
-       virtual void                            initConfiguration               (Context&                                                       context,
-                                                                                                                TestParams&                                            testParams) override;
-       virtual void                            fillCommandBuffer               (Context&                                                       context,
-                                                                                                                TestParams&                                            testParams,
-                                                                                                                VkCommandBuffer                                        commandBuffer,
-                                                                                                                const VkAccelerationStructureKHR*      rayQueryTopAccelerationStructurePtr,
-                                                                                                                const VkDescriptorImageInfo&           resultImageInfo) override;
-
-protected:
-       Move<VkDescriptorSetLayout>     m_descriptorSetLayout;
-       Move<VkDescriptorPool>          m_descriptorPool;
-       Move<VkDescriptorSet>           m_descriptorSet;
-       Move<VkPipelineLayout>          m_pipelineLayout;
-
-       Move<VkShaderModule>            m_shaderModule;
-
-       Move<VkPipeline>                        m_pipeline;
-};
-
-ComputeConfiguration::ComputeConfiguration ()
-       : PipelineConfiguration ()
-       , m_descriptorSetLayout ()
-       , m_descriptorPool              ()
-       , m_descriptorSet               ()
-       , m_pipelineLayout              ()
-
-       , m_shaderModule                ()
-
-       , m_pipeline                    ()
-{
-}
+                                       m_vertexCount = static_cast<deUint32>(vertices.size());
+                                       m_vertexBuffer = createBuffer(vkd, device, &vertexBufferCreateInfo);
+                                       m_vertexBufferAlloc = bindBuffer(vkd, device, allocator, *m_vertexBuffer, vk::MemoryRequirement::HostVisible);
 
-void ComputeConfiguration::checkSupport (Context&                      context,
-                                                                                const TestParams&      testParams)
-{
-       DE_UNREF(context);
-       DE_UNREF(testParams);
-}
+                                       deMemcpy(m_vertexBufferAlloc->getHostPtr(), vertices.data(), (size_t)vertexBufferSize);
+                                       flushAlloc(vkd, device, *m_vertexBufferAlloc);
+                               }
+                       }
 
-void ComputeConfiguration::initPrograms (SourceCollections&    programCollection,
-                                                                                const TestParams&      testParams)
-{
-       const vk::ShaderBuildOptions    buildOptions            (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
+                       Move<VkPipeline> GraphicsConfiguration::makeGraphicsPipeline(Context& context,
+                               TestParams& testParams)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                  device = context.getDevice();
+                               const bool                                              tessStageTest = (testParams.stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT || testParams.stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
+                               const VkPrimitiveTopology               topology = tessStageTest ? VK_PRIMITIVE_TOPOLOGY_PATCH_LIST : VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+                               const deUint32                                  patchControlPoints = tessStageTest ? 4 : 0;
+                               const std::vector<VkViewport>   viewports(1, makeViewport(testParams.width, testParams.height));
+                               const std::vector<VkRect2D>             scissors(1, makeRect2D(testParams.width, testParams.height));
+
+                               return vk::makeGraphicsPipeline(vkd,
+                                       device,
+                                       *m_pipelineLayout,
+                                       *m_vertShaderModule,
+                                       *m_tescShaderModule,
+                                       *m_teseShaderModule,
+                                       *m_geomShaderModule,
+                                       *m_fragShaderModule,
+                                       *m_renderPass,
+                                       viewports,
+                                       scissors,
+                                       topology,
+                                       0,
+                                       patchControlPoints);
+                       }
 
-       const std::string                               testShaderBody          = testParams.testConfigShaderBodyText(testParams);
-       const std::string                               testBody                        =
-               "  ivec3       pos      = ivec3(gl_WorkGroupID);\n"
-               "  ivec3       size     = ivec3(gl_NumWorkGroups);\n"
-               + testShaderBody;
+                       void GraphicsConfiguration::initConfiguration(Context& context,
+                               TestParams& testParams)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                  device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               vk::BinaryCollection& collection = context.getBinaryCollection();
+                               VkShaderStageFlags              shaders = static_cast<VkShaderStageFlags>(0);
+                               deUint32                                shaderCount = 0;
+
+                               if (collection.contains("vert")) shaders |= VK_SHADER_STAGE_VERTEX_BIT;
+                               if (collection.contains("geom")) shaders |= VK_SHADER_STAGE_GEOMETRY_BIT;
+                               if (collection.contains("tesc")) shaders |= VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
+                               if (collection.contains("tese")) shaders |= VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
+                               if (collection.contains("frag")) shaders |= VK_SHADER_STAGE_FRAGMENT_BIT;
+
+                               for (BinaryCollection::Iterator it = collection.begin(); it != collection.end(); ++it)
+                                       shaderCount++;
+
+                               if (shaderCount != (deUint32)dePop32(shaders))
+                                       TCU_THROW(InternalError, "Unused shaders detected in the collection");
+
+                               if (0 != (shaders & VK_SHADER_STAGE_VERTEX_BIT))                                        m_vertShaderModule = createShaderModule(vkd, device, collection.get("vert"), 0);
+                               if (0 != (shaders & VK_SHADER_STAGE_GEOMETRY_BIT))                                      m_geomShaderModule = createShaderModule(vkd, device, collection.get("geom"), 0);
+                               if (0 != (shaders & VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT))          m_tescShaderModule = createShaderModule(vkd, device, collection.get("tesc"), 0);
+                               if (0 != (shaders & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT))       m_teseShaderModule = createShaderModule(vkd, device, collection.get("tese"), 0);
+                               if (0 != (shaders & VK_SHADER_STAGE_FRAGMENT_BIT))                                      m_fragShaderModule = createShaderModule(vkd, device, collection.get("frag"), 0);
+
+                               m_descriptorSetLayout = DescriptorSetLayoutBuilder()
+                                       .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_ALL_GRAPHICS)
+                                       .addSingleBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, VK_SHADER_STAGE_ALL_GRAPHICS)
+                                       .build(vkd, device);
+                               m_descriptorPool = DescriptorPoolBuilder()
+                                       .addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)
+                                       .addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR)
+                                       .build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+                               m_descriptorSet = makeDescriptorSet(vkd, device, *m_descriptorPool, *m_descriptorSetLayout);
+                               m_framebufferImage = makeImage(vkd, device, makeImageCreateInfo(m_framebufferFormat, testParams.width, testParams.height, 1u, VK_IMAGE_TYPE_2D, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT));
+                               m_framebufferImageAlloc = bindImage(vkd, device, allocator, *m_framebufferImage, MemoryRequirement::Any);
+                               m_framebufferAttachment = makeImageView(vkd, device, *m_framebufferImage, VK_IMAGE_VIEW_TYPE_2D, m_framebufferFormat, makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u));
+                               m_renderPass = makeRenderPass(vkd, device, m_framebufferFormat);
+                               m_framebuffer = makeFramebuffer(vkd, device, *m_renderPass, *m_framebufferAttachment, testParams.width, testParams.height);
+                               m_pipelineLayout = makePipelineLayout(vkd, device, m_descriptorSetLayout.get());
+                               m_pipeline = makeGraphicsPipeline(context, testParams);
+
+                               initVertexBuffer(context, testParams);
+                       }
 
-       switch (testParams.stage)
-       {
-               case VK_SHADER_STAGE_COMPUTE_BIT:
-               {
-                       std::stringstream css;
-                       css <<
-                               "#version 460 core\n"
-                               "#extension GL_EXT_ray_query : require\n"
-                               "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
-                               "layout(set = 0, binding = 1) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
-                               "\n"
-                               "void main()\n"
-                               "{\n"
-                               << testBody <<
-                               "}\n";
-
-                       programCollection.glslSources.add("comp") << glu::ComputeSource(updateRayTracingGLSL(css.str())) << buildOptions;
-
-                       break;
-               }
+                       void GraphicsConfiguration::fillCommandBuffer(Context& context,
+                               TestParams& testParams,
+                               VkCommandBuffer                                         cmdBuffer,
+                               const VkAccelerationStructureKHR* rayQueryTopAccelerationStructurePtr,
+                               const VkDescriptorImageInfo& resultImageInfo)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                                          device = context.getDevice();
+                               const VkDeviceSize                                                                      vertexBufferOffset = 0;
+                               const VkWriteDescriptorSetAccelerationStructureKHR      rayQueryAccelerationStructureWriteDescriptorSet =
+                               {
+                                       VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,      //  VkStructureType                                             sType;
+                                       DE_NULL,                                                                                                                        //  const void*                                                 pNext;
+                                       1u,                                                                                                                                     //  deUint32                                                    accelerationStructureCount;
+                                       rayQueryTopAccelerationStructurePtr,                                                            //  const VkAccelerationStructureKHR*   pAccelerationStructures;
+                               };
 
-               default:
-                       TCU_THROW(InternalError, "Unknown stage");
-       }
-}
+                               DescriptorSetUpdateBuilder()
+                                       .writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &resultImageInfo)
+                                       .writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &rayQueryAccelerationStructureWriteDescriptorSet)
+                                       .update(vkd, device);
 
-void ComputeConfiguration::initConfiguration (Context&         context,
-                                                                                         TestParams&   testParams)
-{
-       DE_UNREF(testParams);
-
-       const DeviceInterface&  vkd                     = context.getDeviceInterface();
-       const VkDevice                  device          = context.getDevice();
-       vk::BinaryCollection&   collection      = context.getBinaryCollection();
-
-       m_descriptorSetLayout   = DescriptorSetLayoutBuilder()
-                                                               .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT)
-                                                               .addSingleBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, VK_SHADER_STAGE_COMPUTE_BIT)
-                                                               .build(vkd, device);
-       m_descriptorPool                = DescriptorPoolBuilder()
-                                                               .addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)
-                                                               .addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR)
-                                                               .build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
-       m_descriptorSet                 = makeDescriptorSet(vkd, device, *m_descriptorPool, *m_descriptorSetLayout);
-       m_pipelineLayout                = makePipelineLayout(vkd, device, m_descriptorSetLayout.get());
-       m_shaderModule                  = createShaderModule(vkd, device, collection.get("comp"), 0);
-       m_pipeline                              = makeComputePipeline(vkd, device, *m_pipelineLayout, *m_shaderModule);
-}
-
-void ComputeConfiguration::fillCommandBuffer (Context&                                                 context,
-                                                                                         TestParams&                                           testParams,
-                                                                                         VkCommandBuffer                                       cmdBuffer,
-                                                                                         const VkAccelerationStructureKHR*     rayQueryTopAccelerationStructurePtr,
-                                                                                         const VkDescriptorImageInfo&          resultImageInfo)
-{
-       const DeviceInterface&                                                          vkd                                                                                             = context.getDeviceInterface();
-       const VkDevice                                                                          device                                                                                  = context.getDevice();
-       const VkWriteDescriptorSetAccelerationStructureKHR      rayQueryAccelerationStructureWriteDescriptorSet =
-       {
-               VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,      //  VkStructureType                                             sType;
-               DE_NULL,                                                                                                                        //  const void*                                                 pNext;
-               1u,                                                                                                                                     //  deUint32                                                    accelerationStructureCount;
-               rayQueryTopAccelerationStructurePtr,                                                            //  const VkAccelerationStructureKHR*   pAccelerationStructures;
-       };
+                               vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineLayout, 0, 1, &m_descriptorSet.get(), 0, DE_NULL);
+                               vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
+                               vkd.cmdBindVertexBuffers(cmdBuffer, 0u, 1u, &m_vertexBuffer.get(), &vertexBufferOffset);
 
-       DescriptorSetUpdateBuilder()
-               .writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &resultImageInfo)
-               .writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &rayQueryAccelerationStructureWriteDescriptorSet)
-               .update(vkd, device);
+                               beginRenderPass(vkd, cmdBuffer, *m_renderPass, *m_framebuffer, makeRect2D(0, 0, testParams.width, testParams.height), tcu::UVec4());
 
-       vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_pipelineLayout, 0, 1, &m_descriptorSet.get(), 0, DE_NULL);
+                               vkd.cmdDraw(cmdBuffer, m_vertexCount, 1u, 0u, 0u);
 
-       vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, m_pipeline.get());
+                               endRenderPass(vkd, cmdBuffer);
+                       }
 
-       vkd.cmdDispatch(cmdBuffer, testParams.width, testParams.height, 1);
-}
+                       class ComputeConfiguration : public PipelineConfiguration
+                       {
+                       public:
+                               ComputeConfiguration();
+                               virtual                                         ~ComputeConfiguration() {};
+
+                               static void                                     checkSupport(Context& context,
+                                       const TestParams& testParams);
+                               static void                                     initPrograms(SourceCollections& programCollection,
+                                       const TestParams& testParams);
+
+                               virtual void                            initConfiguration(Context& context,
+                                       TestParams& testParams) override;
+                               virtual void                            fillCommandBuffer(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 commandBuffer,
+                                       const VkAccelerationStructureKHR* rayQueryTopAccelerationStructurePtr,
+                                       const VkDescriptorImageInfo& resultImageInfo) override;
+
+                       protected:
+                               Move<VkDescriptorSetLayout>     m_descriptorSetLayout;
+                               Move<VkDescriptorPool>          m_descriptorPool;
+                               Move<VkDescriptorSet>           m_descriptorSet;
+                               Move<VkPipelineLayout>          m_pipelineLayout;
+
+                               Move<VkShaderModule>            m_shaderModule;
+
+                               Move<VkPipeline>                        m_pipeline;
+                       };
+
+                       ComputeConfiguration::ComputeConfiguration()
+                               : PipelineConfiguration()
+                               , m_descriptorSetLayout()
+                               , m_descriptorPool()
+                               , m_descriptorSet()
+                               , m_pipelineLayout()
+
+                               , m_shaderModule()
+
+                               , m_pipeline()
+                       {
+                       }
 
-class RayTracingConfiguration : public PipelineConfiguration
-{
-public:
-                                                                                                       RayTracingConfiguration                         ();
-       virtual                                                                                 ~RayTracingConfiguration                        () {};
-
-       static void                                                                             checkSupport                                            (Context&                                                       context,
-                                                                                                                                                                                const TestParams&                                      testParams);
-       static void                                                                             initPrograms                                            (SourceCollections&                                     programCollection,
-                                                                                                                                                                                const TestParams&                                      testParams);
-
-       virtual void                                                                    initConfiguration                                       (Context&                                                       context,
-                                                                                                                                                                                TestParams&                                            testParams) override;
-       virtual void                                                                    fillCommandBuffer                                       (Context&                                                       context,
-                                                                                                                                                                                TestParams&                                            testParams,
-                                                                                                                                                                                VkCommandBuffer                                        commandBuffer,
-                                                                                                                                                                                const VkAccelerationStructureKHR*      rayQueryTopAccelerationStructurePtr,
-                                                                                                                                                                                const VkDescriptorImageInfo&           resultImageInfo) override;
-
-protected:
-       de::MovePtr<BufferWithMemory>                                   createShaderBindingTable                        (const InstanceInterface&                       vki,
-                                                                                                                                                                                const DeviceInterface&                         vkd,
-                                                                                                                                                                                const VkDevice                                         device,
-                                                                                                                                                                                const VkPhysicalDevice                         physicalDevice,
-                                                                                                                                                                                const VkPipeline                                       pipeline,
-                                                                                                                                                                                Allocator&                                                     allocator,
-                                                                                                                                                                                de::MovePtr<RayTracingPipeline>&       rayTracingPipeline,
-                                                                                                                                                                                const deUint32                                         group);
-
-protected:
-       deUint32                                                                                m_shaders;
-       deUint32                                                                                m_raygenShaderGroup;
-       deUint32                                                                                m_missShaderGroup;
-       deUint32                                                                                m_hitShaderGroup;
-       deUint32                                                                                m_callableShaderGroup;
-       deUint32                                                                                m_shaderGroupCount;
-
-       Move<VkDescriptorSetLayout>                                             m_descriptorSetLayout;
-       Move<VkDescriptorPool>                                                  m_descriptorPool;
-       Move<VkDescriptorSet>                                                   m_descriptorSet;
-       Move<VkPipelineLayout>                                                  m_pipelineLayout;
-
-       de::MovePtr<RayTracingPipeline>                                 m_rayTracingPipeline;
-       Move<VkPipeline>                                                                m_pipeline;
-
-       de::MovePtr<BufferWithMemory>                                   m_raygenShaderBindingTable;
-       de::MovePtr<BufferWithMemory>                                   m_hitShaderBindingTable;
-       de::MovePtr<BufferWithMemory>                                   m_missShaderBindingTable;
-       de::MovePtr<BufferWithMemory>                                   m_callableShaderBindingTable;
-
-       VkStridedDeviceAddressRegionKHR                                 m_raygenShaderBindingTableRegion;
-       VkStridedDeviceAddressRegionKHR                                 m_missShaderBindingTableRegion;
-       VkStridedDeviceAddressRegionKHR                                 m_hitShaderBindingTableRegion;
-       VkStridedDeviceAddressRegionKHR                                 m_callableShaderBindingTableRegion;
-
-       de::SharedPtr<BottomLevelAccelerationStructure> m_bottomLevelAccelerationStructure;
-       de::SharedPtr<TopLevelAccelerationStructure>    m_topLevelAccelerationStructure;
-};
-
-RayTracingConfiguration::RayTracingConfiguration()
-       : m_shaders                                                             (0)
-       , m_raygenShaderGroup                                   (~0u)
-       , m_missShaderGroup                                             (~0u)
-       , m_hitShaderGroup                                              (~0u)
-       , m_callableShaderGroup                                 (~0u)
-       , m_shaderGroupCount                                    (0)
-
-       , m_descriptorSetLayout                                 ()
-       , m_descriptorPool                                              ()
-       , m_descriptorSet                                               ()
-       , m_pipelineLayout                                              ()
-
-       , m_rayTracingPipeline                                  ()
-       , m_pipeline                                                    ()
-
-       , m_raygenShaderBindingTable                    ()
-       , m_hitShaderBindingTable                               ()
-       , m_missShaderBindingTable                              ()
-       , m_callableShaderBindingTable                  ()
-
-       , m_raygenShaderBindingTableRegion              ()
-       , m_missShaderBindingTableRegion                ()
-       , m_hitShaderBindingTableRegion                 ()
-       , m_callableShaderBindingTableRegion    ()
-
-       , m_bottomLevelAccelerationStructure    ()
-       , m_topLevelAccelerationStructure               ()
-{
-}
+                       void ComputeConfiguration::checkSupport(Context& context,
+                               const TestParams& testParams)
+                       {
+                               DE_UNREF(context);
+                               DE_UNREF(testParams);
+                       }
 
-void RayTracingConfiguration::checkSupport (Context&                   context,
-                                                                                       const TestParams&       testParams)
-{
-       DE_UNREF(testParams);
+                       void ComputeConfiguration::initPrograms(SourceCollections& programCollection,
+                               const TestParams& testParams)
+                       {
+                               const vk::ShaderBuildOptions    buildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
 
-       context.requireDeviceFunctionality("VK_KHR_ray_tracing_pipeline");
-       const VkPhysicalDeviceRayTracingPipelineFeaturesKHR&    rayTracingPipelineFeaturesKHR = context.getRayTracingPipelineFeatures();
-       if (rayTracingPipelineFeaturesKHR.rayTracingPipeline == DE_FALSE)
-               TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipeline");
-}
+                               const std::string                               testShaderBody = testParams.testConfigShaderBodyText(testParams);
+                               const std::string                               testBody =
+                                       "  ivec3       pos      = ivec3(gl_WorkGroupID);\n"
+                                       "  ivec3       size     = ivec3(gl_NumWorkGroups);\n"
+                                       + testShaderBody;
 
-void RayTracingConfiguration::initPrograms (SourceCollections& programCollection,
-                                                                                       const TestParams&       testParams)
-{
-       const vk::ShaderBuildOptions    buildOptions            (programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
+                               switch (testParams.stage)
+                               {
+                               case VK_SHADER_STAGE_COMPUTE_BIT:
+                               {
+                                       std::stringstream css;
+                                       css <<
+                                               "#version 460 core\n"
+                                               "#extension GL_EXT_ray_query : require\n"
+                                               "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
+                                               "layout(set = 0, binding = 1) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
+                                               "\n"
+                                               "void main()\n"
+                                               "{\n"
+                                               << testBody <<
+                                               "}\n";
+
+                                       programCollection.glslSources.add("comp") << glu::ComputeSource(updateRayTracingGLSL(css.str())) << buildOptions;
+
+                                       break;
+                               }
 
-       const std::string                               testShaderBody          = testParams.testConfigShaderBodyText(testParams);
-       const std::string                               testBody                        =
-               "  ivec3       pos      = ivec3(gl_LaunchIDEXT);\n"
-               "  ivec3       size     = ivec3(gl_LaunchSizeEXT);\n"
-               + testShaderBody;
+                               default:
+                                       TCU_THROW(InternalError, "Unknown stage");
+                               }
+                       }
 
-       switch (testParams.stage)
-       {
-               case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
-               {
-                       std::stringstream css;
-                       css <<
-                               "#version 460 core\n"
-                               "#extension GL_EXT_ray_tracing : require\n"
-                               "#extension GL_EXT_ray_query : require\n"
-                               "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
-                               "layout(set = 0, binding = 2) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
-                               "\n"
-                               "void main()\n"
-                               "{\n"
-                               << testBody <<
-                               "}\n";
-
-                       programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(css.str())) << buildOptions;
-
-                       break;
-               }
+                       void ComputeConfiguration::initConfiguration(Context& context,
+                               TestParams& testParams)
+                       {
+                               DE_UNREF(testParams);
+
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                  device = context.getDevice();
+                               vk::BinaryCollection& collection = context.getBinaryCollection();
+
+                               m_descriptorSetLayout = DescriptorSetLayoutBuilder()
+                                       .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT)
+                                       .addSingleBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, VK_SHADER_STAGE_COMPUTE_BIT)
+                                       .build(vkd, device);
+                               m_descriptorPool = DescriptorPoolBuilder()
+                                       .addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)
+                                       .addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR)
+                                       .build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+                               m_descriptorSet = makeDescriptorSet(vkd, device, *m_descriptorPool, *m_descriptorSetLayout);
+                               m_pipelineLayout = makePipelineLayout(vkd, device, m_descriptorSetLayout.get());
+                               m_shaderModule = createShaderModule(vkd, device, collection.get("comp"), 0);
+                               m_pipeline = makeComputePipeline(vkd, device, *m_pipelineLayout, *m_shaderModule);
+                       }
 
-               case VK_SHADER_STAGE_ANY_HIT_BIT_KHR:
-               {
-                       programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(getCommonRayGenerationShader())) << buildOptions;
+                       void ComputeConfiguration::fillCommandBuffer(Context& context,
+                               TestParams& testParams,
+                               VkCommandBuffer                                 cmdBuffer,
+                               const VkAccelerationStructureKHR* rayQueryTopAccelerationStructurePtr,
+                               const VkDescriptorImageInfo& resultImageInfo)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                                          device = context.getDevice();
+                               const VkWriteDescriptorSetAccelerationStructureKHR      rayQueryAccelerationStructureWriteDescriptorSet =
+                               {
+                                       VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,      //  VkStructureType                                             sType;
+                                       DE_NULL,                                                                                                                        //  const void*                                                 pNext;
+                                       1u,                                                                                                                                     //  deUint32                                                    accelerationStructureCount;
+                                       rayQueryTopAccelerationStructurePtr,                                                            //  const VkAccelerationStructureKHR*   pAccelerationStructures;
+                               };
+
+                               DescriptorSetUpdateBuilder()
+                                       .writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &resultImageInfo)
+                                       .writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &rayQueryAccelerationStructureWriteDescriptorSet)
+                                       .update(vkd, device);
+
+                               vkd.cmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_pipelineLayout, 0, 1, &m_descriptorSet.get(), 0, DE_NULL);
 
+                               vkd.cmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, m_pipeline.get());
+
+                               vkd.cmdDispatch(cmdBuffer, testParams.width, testParams.height, 1);
+                       }
+
+                       class RayTracingConfiguration : public PipelineConfiguration
                        {
-                               std::stringstream css;
-                               css <<
-                                       "#version 460 core\n"
-                                       "#extension GL_EXT_ray_tracing : require\n"
-                                       "#extension GL_EXT_ray_query : require\n"
-                                       "hitAttributeEXT vec3 attribs;\n"
-                                       "layout(location = 0) rayPayloadInEXT vec3 hitValue;\n"
-                                       "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
-                                       "layout(set = 0, binding = 2) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
-                                       "\n"
-                                       "void main()\n"
-                                       "{\n"
-                                       << testBody <<
-                                       "}\n";
+                       public:
+                               RayTracingConfiguration();
+                               virtual                                                                                 ~RayTracingConfiguration() {};
+
+                               static void                                                                             checkSupport(Context& context,
+                                       const TestParams& testParams);
+                               static void                                                                             initPrograms(SourceCollections& programCollection,
+                                       const TestParams& testParams);
+
+                               virtual void                                                                    initConfiguration(Context& context,
+                                       TestParams& testParams) override;
+                               virtual void                                                                    fillCommandBuffer(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 commandBuffer,
+                                       const VkAccelerationStructureKHR* rayQueryTopAccelerationStructurePtr,
+                                       const VkDescriptorImageInfo& resultImageInfo) override;
+
+                       protected:
+                               de::MovePtr<BufferWithMemory>                                   createShaderBindingTable(const InstanceInterface& vki,
+                                       const DeviceInterface& vkd,
+                                       const VkDevice                                          device,
+                                       const VkPhysicalDevice                          physicalDevice,
+                                       const VkPipeline                                        pipeline,
+                                       Allocator& allocator,
+                                       de::MovePtr<RayTracingPipeline>& rayTracingPipeline,
+                                       const deUint32                                          group);
+
+                       protected:
+                               deUint32                                                                                m_shaders;
+                               deUint32                                                                                m_raygenShaderGroup;
+                               deUint32                                                                                m_missShaderGroup;
+                               deUint32                                                                                m_hitShaderGroup;
+                               deUint32                                                                                m_callableShaderGroup;
+                               deUint32                                                                                m_shaderGroupCount;
+
+                               Move<VkDescriptorSetLayout>                                             m_descriptorSetLayout;
+                               Move<VkDescriptorPool>                                                  m_descriptorPool;
+                               Move<VkDescriptorSet>                                                   m_descriptorSet;
+                               Move<VkPipelineLayout>                                                  m_pipelineLayout;
+
+                               de::MovePtr<RayTracingPipeline>                                 m_rayTracingPipeline;
+                               Move<VkPipeline>                                                                m_pipeline;
+
+                               de::MovePtr<BufferWithMemory>                                   m_raygenShaderBindingTable;
+                               de::MovePtr<BufferWithMemory>                                   m_hitShaderBindingTable;
+                               de::MovePtr<BufferWithMemory>                                   m_missShaderBindingTable;
+                               de::MovePtr<BufferWithMemory>                                   m_callableShaderBindingTable;
+
+                               VkStridedDeviceAddressRegionKHR                                 m_raygenShaderBindingTableRegion;
+                               VkStridedDeviceAddressRegionKHR                                 m_missShaderBindingTableRegion;
+                               VkStridedDeviceAddressRegionKHR                                 m_hitShaderBindingTableRegion;
+                               VkStridedDeviceAddressRegionKHR                                 m_callableShaderBindingTableRegion;
+
+                               de::SharedPtr<BottomLevelAccelerationStructure> m_bottomLevelAccelerationStructure;
+                               de::SharedPtr<TopLevelAccelerationStructure>    m_topLevelAccelerationStructure;
+                       };
+
+                       RayTracingConfiguration::RayTracingConfiguration()
+                               : m_shaders(0)
+                               , m_raygenShaderGroup(~0u)
+                               , m_missShaderGroup(~0u)
+                               , m_hitShaderGroup(~0u)
+                               , m_callableShaderGroup(~0u)
+                               , m_shaderGroupCount(0)
+
+                               , m_descriptorSetLayout()
+                               , m_descriptorPool()
+                               , m_descriptorSet()
+                               , m_pipelineLayout()
+
+                               , m_rayTracingPipeline()
+                               , m_pipeline()
+
+                               , m_raygenShaderBindingTable()
+                               , m_hitShaderBindingTable()
+                               , m_missShaderBindingTable()
+                               , m_callableShaderBindingTable()
+
+                               , m_raygenShaderBindingTableRegion()
+                               , m_missShaderBindingTableRegion()
+                               , m_hitShaderBindingTableRegion()
+                               , m_callableShaderBindingTableRegion()
+
+                               , m_bottomLevelAccelerationStructure()
+                               , m_topLevelAccelerationStructure()
+                       {
+                       }
 
-                               programCollection.glslSources.add("ahit") << glu::AnyHitSource(updateRayTracingGLSL(css.str())) << buildOptions;
+                       void RayTracingConfiguration::checkSupport(Context& context,
+                               const TestParams& testParams)
+                       {
+                               DE_UNREF(testParams);
+
+                               context.requireDeviceFunctionality("VK_KHR_ray_tracing_pipeline");
+                               const VkPhysicalDeviceRayTracingPipelineFeaturesKHR& rayTracingPipelineFeaturesKHR = context.getRayTracingPipelineFeatures();
+                               if (rayTracingPipelineFeaturesKHR.rayTracingPipeline == DE_FALSE)
+                                       TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipeline");
                        }
 
-                       programCollection.glslSources.add("chit") << glu::ClosestHitSource(updateRayTracingGLSL(getHitPassthrough())) << buildOptions;
-                       programCollection.glslSources.add("miss") << glu::MissSource(updateRayTracingGLSL(getMissPassthrough())) << buildOptions;
+                       void RayTracingConfiguration::initPrograms(SourceCollections& programCollection,
+                               const TestParams& testParams)
+                       {
+                               const vk::ShaderBuildOptions    buildOptions(programCollection.usedVulkanVersion, vk::SPIRV_VERSION_1_4, 0u, true);
 
-                       break;
-               }
+                               const std::string                               testShaderBody = testParams.testConfigShaderBodyText(testParams);
+                               const std::string                               testBody =
+                                       "  ivec3       pos      = ivec3(gl_LaunchIDEXT);\n"
+                                       "  ivec3       size     = ivec3(gl_LaunchSizeEXT);\n"
+                                       + testShaderBody;
 
-               case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
-               {
-                       programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(getCommonRayGenerationShader())) << buildOptions;
+                               switch (testParams.stage)
+                               {
+                               case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
+                               {
+                                       std::stringstream css;
+                                       css <<
+                                               "#version 460 core\n"
+                                               "#extension GL_EXT_ray_tracing : require\n"
+                                               "#extension GL_EXT_ray_query : require\n"
+                                               "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
+                                               "layout(set = 0, binding = 2) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
+                                               "\n"
+                                               "void main()\n"
+                                               "{\n"
+                                               << testBody <<
+                                               "}\n";
+
+                                       programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(css.str())) << buildOptions;
+
+                                       break;
+                               }
 
+                               case VK_SHADER_STAGE_ANY_HIT_BIT_KHR:
+                               {
+                                       programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(getCommonRayGenerationShader())) << buildOptions;
+
+                                       {
+                                               std::stringstream css;
+                                               css <<
+                                                       "#version 460 core\n"
+                                                       "#extension GL_EXT_ray_tracing : require\n"
+                                                       "#extension GL_EXT_ray_query : require\n"
+                                                       "hitAttributeEXT vec3 attribs;\n"
+                                                       "layout(location = 0) rayPayloadInEXT vec3 hitValue;\n"
+                                                       "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
+                                                       "layout(set = 0, binding = 2) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
+                                                       "\n"
+                                                       "void main()\n"
+                                                       "{\n"
+                                                       << testBody <<
+                                                       "}\n";
+
+                                               programCollection.glslSources.add("ahit") << glu::AnyHitSource(updateRayTracingGLSL(css.str())) << buildOptions;
+                                       }
+
+                                       programCollection.glslSources.add("chit") << glu::ClosestHitSource(updateRayTracingGLSL(getHitPassthrough())) << buildOptions;
+                                       programCollection.glslSources.add("miss") << glu::MissSource(updateRayTracingGLSL(getMissPassthrough())) << buildOptions;
+
+                                       break;
+                               }
+
+                               case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
+                               {
+                                       programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(getCommonRayGenerationShader())) << buildOptions;
+
+                                       {
+                                               std::stringstream css;
+                                               css <<
+                                                       "#version 460 core\n"
+                                                       "#extension GL_EXT_ray_tracing : require\n"
+                                                       "#extension GL_EXT_ray_query : require\n"
+                                                       "layout(location = 0) rayPayloadInEXT vec3 hitValue;\n"
+                                                       "hitAttributeEXT vec3 attribs;\n"
+                                                       "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
+                                                       "layout(set = 0, binding = 2) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
+                                                       "\n"
+                                                       "void main()\n"
+                                                       "{\n"
+                                                       << testBody <<
+                                                       "}\n";
+
+                                               programCollection.glslSources.add("chit") << glu::ClosestHitSource(updateRayTracingGLSL(css.str())) << buildOptions;
+                                       }
+
+                                       programCollection.glslSources.add("ahit") << glu::AnyHitSource(updateRayTracingGLSL(getHitPassthrough())) << buildOptions;
+                                       programCollection.glslSources.add("miss") << glu::MissSource(updateRayTracingGLSL(getMissPassthrough())) << buildOptions;
+
+                                       break;
+                               }
+
+                               case VK_SHADER_STAGE_INTERSECTION_BIT_KHR:
+                               {
+                                       programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(getCommonRayGenerationShader())) << buildOptions;
+
+                                       {
+                                               std::stringstream css;
+                                               css <<
+                                                       "#version 460 core\n"
+                                                       "#extension GL_EXT_ray_tracing : require\n"
+                                                       "#extension GL_EXT_ray_query : require\n"
+                                                       "hitAttributeEXT vec3 hitAttribute;\n"
+                                                       "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
+                                                       "layout(set = 0, binding = 2) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
+                                                       "\n"
+                                                       "void main()\n"
+                                                       "{\n"
+                                                       << testBody <<
+                                                       "  hitAttribute = vec3(0.0f, 0.0f, 0.0f);\n"
+                                                       "  reportIntersectionEXT(1.0f, 0);\n"
+                                                       "}\n";
+
+                                               programCollection.glslSources.add("sect") << glu::IntersectionSource(updateRayTracingGLSL(css.str())) << buildOptions;
+                                       }
+
+                                       programCollection.glslSources.add("ahit") << glu::AnyHitSource(updateRayTracingGLSL(getHitPassthrough())) << buildOptions;
+                                       programCollection.glslSources.add("chit") << glu::ClosestHitSource(updateRayTracingGLSL(getHitPassthrough())) << buildOptions;
+                                       programCollection.glslSources.add("miss") << glu::MissSource(updateRayTracingGLSL(getMissPassthrough())) << buildOptions;
+
+                                       break;
+                               }
+
+                               case VK_SHADER_STAGE_MISS_BIT_KHR:
+                               {
+                                       programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(getCommonRayGenerationShader())) << buildOptions;
+
+                                       {
+                                               std::stringstream css;
+                                               css <<
+                                                       "#version 460 core\n"
+                                                       "#extension GL_EXT_ray_tracing : require\n"
+                                                       "#extension GL_EXT_ray_query : require\n"
+                                                       "layout(location = 0) rayPayloadInEXT vec3 hitValue;\n"
+                                                       "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
+                                                       "layout(set = 0, binding = 2) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
+                                                       "\n"
+                                                       "void main()\n"
+                                                       "{\n"
+                                                       << testBody <<
+                                                       "}\n";
+
+                                               programCollection.glslSources.add("miss") << glu::MissSource(updateRayTracingGLSL(css.str())) << buildOptions;
+                                       }
+
+                                       programCollection.glslSources.add("ahit") << glu::AnyHitSource(updateRayTracingGLSL(getHitPassthrough())) << buildOptions;
+                                       programCollection.glslSources.add("chit") << glu::ClosestHitSource(updateRayTracingGLSL(getHitPassthrough())) << buildOptions;
+
+                                       break;
+                               }
+
+                               case VK_SHADER_STAGE_CALLABLE_BIT_KHR:
+                               {
+                                       {
+                                               std::stringstream css;
+                                               css <<
+                                                       "#version 460 core\n"
+                                                       "#extension GL_EXT_ray_tracing : require\n"
+                                                       "#extension GL_EXT_ray_query : require\n"
+                                                       "layout(location = 0) callableDataEXT float dummy;"
+                                                       "layout(set = 0, binding = 1) uniform accelerationStructureEXT topLevelAS;\n"
+                                                       "\n"
+                                                       "void main()\n"
+                                                       "{\n"
+                                                       "  executeCallableEXT(0, 0);\n"
+                                                       "}\n";
+
+                                               programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(css.str())) << buildOptions;
+                                       }
+
+                                       {
+                                               std::stringstream css;
+                                               css <<
+                                                       "#version 460 core\n"
+                                                       "#extension GL_EXT_ray_tracing : require\n"
+                                                       "#extension GL_EXT_ray_query : require\n"
+                                                       "layout(location = 0) callableDataInEXT float dummy;"
+                                                       "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
+                                                       "layout(set = 0, binding = 2) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
+                                                       "\n"
+                                                       "void main()\n"
+                                                       "{\n"
+                                                       << testBody <<
+                                                       "}\n";
+
+                                               programCollection.glslSources.add("call") << glu::CallableSource(updateRayTracingGLSL(css.str())) << buildOptions;
+                                       }
+
+                                       programCollection.glslSources.add("ahit") << glu::AnyHitSource(updateRayTracingGLSL(getHitPassthrough())) << buildOptions;
+                                       programCollection.glslSources.add("chit") << glu::ClosestHitSource(updateRayTracingGLSL(getHitPassthrough())) << buildOptions;
+                                       programCollection.glslSources.add("miss") << glu::MissSource(updateRayTracingGLSL(getMissPassthrough())) << buildOptions;
+
+                                       break;
+                               }
+
+                               default:
+                                       TCU_THROW(InternalError, "Unknown stage");
+                               }
+                       }
+
+                       de::MovePtr<BufferWithMemory> RayTracingConfiguration::createShaderBindingTable(const InstanceInterface& vki,
+                               const DeviceInterface& vkd,
+                               const VkDevice                                          device,
+                               const VkPhysicalDevice                          physicalDevice,
+                               const VkPipeline                                        pipeline,
+                               Allocator& allocator,
+                               de::MovePtr<RayTracingPipeline>& rayTracingPipeline,
+                               const deUint32                                          group)
                        {
-                               std::stringstream css;
-                               css <<
-                                       "#version 460 core\n"
-                                       "#extension GL_EXT_ray_tracing : require\n"
-                                       "#extension GL_EXT_ray_query : require\n"
-                                       "layout(location = 0) rayPayloadInEXT vec3 hitValue;\n"
-                                       "hitAttributeEXT vec3 attribs;\n"
-                                       "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
-                                       "layout(set = 0, binding = 2) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
-                                       "\n"
-                                       "void main()\n"
-                                       "{\n"
-                                       << testBody <<
-                                       "}\n";
+                               de::MovePtr<BufferWithMemory>   shaderBindingTable;
+
+                               if (group < m_shaderGroupCount)
+                               {
+                                       const deUint32  shaderGroupHandleSize = getShaderGroupHandleSize(vki, physicalDevice);
+                                       const deUint32  shaderGroupBaseAlignment = getShaderGroupBaseAlignment(vki, physicalDevice);
+
+                                       shaderBindingTable = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline, allocator, shaderGroupHandleSize, shaderGroupBaseAlignment, group, 1u);
+                               }
 
-                               programCollection.glslSources.add("chit") << glu::ClosestHitSource(updateRayTracingGLSL(css.str())) << buildOptions;
+                               return shaderBindingTable;
                        }
 
-                       programCollection.glslSources.add("ahit") << glu::AnyHitSource(updateRayTracingGLSL(getHitPassthrough())) << buildOptions;
-                       programCollection.glslSources.add("miss") << glu::MissSource(updateRayTracingGLSL(getMissPassthrough())) << buildOptions;
+                       void RayTracingConfiguration::initConfiguration(Context& context,
+                               TestParams& testParams)
+                       {
+                               DE_UNREF(testParams);
+
+                               const InstanceInterface& vki = context.getInstanceInterface();
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                          device = context.getDevice();
+                               const VkPhysicalDevice          physicalDevice = context.getPhysicalDevice();
+                               vk::BinaryCollection& collection = context.getBinaryCollection();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                          shaderGroupHandleSize = getShaderGroupHandleSize(vki, physicalDevice);
+                               const VkShaderStageFlags        hitStages = VK_SHADER_STAGE_ANY_HIT_BIT_KHR | VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR | VK_SHADER_STAGE_INTERSECTION_BIT_KHR;
+                               deUint32                                        shaderCount = 0;
+
+                               m_shaderGroupCount = 0;
+
+                               if (collection.contains("rgen")) m_shaders |= VK_SHADER_STAGE_RAYGEN_BIT_KHR;
+                               if (collection.contains("ahit")) m_shaders |= VK_SHADER_STAGE_ANY_HIT_BIT_KHR;
+                               if (collection.contains("chit")) m_shaders |= VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR;
+                               if (collection.contains("miss")) m_shaders |= VK_SHADER_STAGE_MISS_BIT_KHR;
+                               if (collection.contains("sect")) m_shaders |= VK_SHADER_STAGE_INTERSECTION_BIT_KHR;
+                               if (collection.contains("call")) m_shaders |= VK_SHADER_STAGE_CALLABLE_BIT_KHR;
+
+                               for (BinaryCollection::Iterator it = collection.begin(); it != collection.end(); ++it)
+                                       shaderCount++;
+
+                               if (shaderCount != (deUint32)dePop32(m_shaders))
+                                       TCU_THROW(InternalError, "Unused shaders detected in the collection");
+
+                               if (0 != (m_shaders & VK_SHADER_STAGE_RAYGEN_BIT_KHR))
+                                       m_raygenShaderGroup = m_shaderGroupCount++;
+
+                               if (0 != (m_shaders & VK_SHADER_STAGE_MISS_BIT_KHR))
+                                       m_missShaderGroup = m_shaderGroupCount++;
+
+                               if (0 != (m_shaders & hitStages))
+                                       m_hitShaderGroup = m_shaderGroupCount++;
+
+                               if (0 != (m_shaders & VK_SHADER_STAGE_CALLABLE_BIT_KHR))
+                                       m_callableShaderGroup = m_shaderGroupCount++;
+
+                               m_rayTracingPipeline = de::newMovePtr<RayTracingPipeline>();
+
+                               m_descriptorSetLayout = DescriptorSetLayoutBuilder()
+                                       .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, ALL_RAY_TRACING_STAGES)
+                                       .addSingleBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, ALL_RAY_TRACING_STAGES)
+                                       .addSingleBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, ALL_RAY_TRACING_STAGES)
+                                       .build(vkd, device);
+                               m_descriptorPool = DescriptorPoolBuilder()
+                                       .addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)
+                                       .addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR)
+                                       .addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR)
+                                       .build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
+                               m_descriptorSet = makeDescriptorSet(vkd, device, *m_descriptorPool, *m_descriptorSetLayout);
+
+                               if (0 != (m_shaders & VK_SHADER_STAGE_RAYGEN_BIT_KHR))                  m_rayTracingPipeline->addShader(VK_SHADER_STAGE_RAYGEN_BIT_KHR, createShaderModule(vkd, device, collection.get("rgen"), 0), m_raygenShaderGroup);
+                               if (0 != (m_shaders & VK_SHADER_STAGE_ANY_HIT_BIT_KHR))                 m_rayTracingPipeline->addShader(VK_SHADER_STAGE_ANY_HIT_BIT_KHR, createShaderModule(vkd, device, collection.get("ahit"), 0), m_hitShaderGroup);
+                               if (0 != (m_shaders & VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR))             m_rayTracingPipeline->addShader(VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, createShaderModule(vkd, device, collection.get("chit"), 0), m_hitShaderGroup);
+                               if (0 != (m_shaders & VK_SHADER_STAGE_MISS_BIT_KHR))                    m_rayTracingPipeline->addShader(VK_SHADER_STAGE_MISS_BIT_KHR, createShaderModule(vkd, device, collection.get("miss"), 0), m_missShaderGroup);
+                               if (0 != (m_shaders & VK_SHADER_STAGE_INTERSECTION_BIT_KHR))    m_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))                m_rayTracingPipeline->addShader(VK_SHADER_STAGE_CALLABLE_BIT_KHR, createShaderModule(vkd, device, collection.get("call"), 0), m_callableShaderGroup);
+
+                               m_pipelineLayout = makePipelineLayout(vkd, device, m_descriptorSetLayout.get());
+                               m_pipeline = m_rayTracingPipeline->createPipeline(vkd, device, *m_pipelineLayout);
+
+                               m_raygenShaderBindingTable = createShaderBindingTable(vki, vkd, device, physicalDevice, *m_pipeline, allocator, m_rayTracingPipeline, m_raygenShaderGroup);
+                               m_missShaderBindingTable = createShaderBindingTable(vki, vkd, device, physicalDevice, *m_pipeline, allocator, m_rayTracingPipeline, m_missShaderGroup);
+                               m_hitShaderBindingTable = createShaderBindingTable(vki, vkd, device, physicalDevice, *m_pipeline, allocator, m_rayTracingPipeline, m_hitShaderGroup);
+                               m_callableShaderBindingTable = createShaderBindingTable(vki, vkd, device, physicalDevice, *m_pipeline, allocator, m_rayTracingPipeline, m_callableShaderGroup);
+
+                               m_raygenShaderBindingTableRegion = m_raygenShaderBindingTable.get() != NULL ? makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, m_raygenShaderBindingTable->get(), 0), 0, shaderGroupHandleSize) : makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+                               m_missShaderBindingTableRegion = m_missShaderBindingTable.get() != NULL ? makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, m_missShaderBindingTable->get(), 0), 0, shaderGroupHandleSize) : makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+                               m_hitShaderBindingTableRegion = m_hitShaderBindingTable.get() != NULL ? makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, m_hitShaderBindingTable->get(), 0), 0, shaderGroupHandleSize) : makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+                               m_callableShaderBindingTableRegion = m_callableShaderBindingTable.get() != NULL ? makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, m_callableShaderBindingTable->get(), 0), 0, shaderGroupHandleSize) : makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
+                       }
 
-                       break;
-               }
+                       void RayTracingConfiguration::fillCommandBuffer(Context& context,
+                               TestParams& testParams,
+                               VkCommandBuffer                                 commandBuffer,
+                               const VkAccelerationStructureKHR* rayQueryTopAccelerationStructurePtr,
+                               const VkDescriptorImageInfo& resultImageInfo)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                                  device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               de::MovePtr<BottomLevelAccelerationStructure>   bottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
+                               de::MovePtr<TopLevelAccelerationStructure>              topLevelAccelerationStructure = makeTopLevelAccelerationStructure();
+
+                               m_bottomLevelAccelerationStructure = de::SharedPtr<BottomLevelAccelerationStructure>(bottomLevelAccelerationStructure.release());
+                               m_bottomLevelAccelerationStructure->setDefaultGeometryData(testParams.stage);
+                               m_bottomLevelAccelerationStructure->createAndBuild(vkd, device, commandBuffer, allocator);
+
+                               m_topLevelAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(topLevelAccelerationStructure.release());
+                               m_topLevelAccelerationStructure->setInstanceCount(1);
+                               m_topLevelAccelerationStructure->addInstance(m_bottomLevelAccelerationStructure);
+                               m_topLevelAccelerationStructure->createAndBuild(vkd, device, commandBuffer, allocator);
+
+                               const TopLevelAccelerationStructure* topLevelAccelerationStructurePtr = m_topLevelAccelerationStructure.get();
+                               const VkWriteDescriptorSetAccelerationStructureKHR      accelerationStructureWriteDescriptorSet =
+                               {
+                                       VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,      //  VkStructureType                                             sType;
+                                       DE_NULL,                                                                                                                        //  const void*                                                 pNext;
+                                       1u,                                                                                                                                     //  deUint32                                                    accelerationStructureCount;
+                                       topLevelAccelerationStructurePtr->getPtr(),                                                     //  const VkAccelerationStructureKHR*   pAccelerationStructures;
+                               };
+                               const VkWriteDescriptorSetAccelerationStructureKHR      rayQueryAccelerationStructureWriteDescriptorSet =
+                               {
+                                       VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,      //  VkStructureType                                             sType;
+                                       DE_NULL,                                                                                                                        //  const void*                                                 pNext;
+                                       1u,                                                                                                                                     //  deUint32                                                    accelerationStructureCount;
+                                       rayQueryTopAccelerationStructurePtr,                                                            //  const VkAccelerationStructureKHR*   pAccelerationStructures;
+                               };
 
-               case VK_SHADER_STAGE_INTERSECTION_BIT_KHR:
-               {
-                       programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(getCommonRayGenerationShader())) << buildOptions;
+                               DescriptorSetUpdateBuilder()
+                                       .writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &resultImageInfo)
+                                       .writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &accelerationStructureWriteDescriptorSet)
+                                       .writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(2u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &rayQueryAccelerationStructureWriteDescriptorSet)
+                                       .update(vkd, device);
 
+                               vkd.cmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, *m_pipelineLayout, 0, 1, &m_descriptorSet.get(), 0, DE_NULL);
+
+                               vkd.cmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, m_pipeline.get());
+
+                               cmdTraceRays(vkd,
+                                       commandBuffer,
+                                       &m_raygenShaderBindingTableRegion,
+                                       &m_missShaderBindingTableRegion,
+                                       &m_hitShaderBindingTableRegion,
+                                       &m_callableShaderBindingTableRegion,
+                                       testParams.width, testParams.height, 1);
+                       }
+
+                       bool TestConfiguration::verify(BufferWithMemory* resultBuffer, Context& context, TestParams& testParams)
                        {
-                               std::stringstream css;
-                               css <<
-                                       "#version 460 core\n"
-                                       "#extension GL_EXT_ray_tracing : require\n"
-                                       "#extension GL_EXT_ray_query : require\n"
-                                       "hitAttributeEXT vec3 hitAttribute;\n"
-                                       "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
-                                       "layout(set = 0, binding = 2) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
-                                       "\n"
-                                       "void main()\n"
-                                       "{\n"
-                                       << testBody <<
-                                       "  hitAttribute = vec3(0.0f, 0.0f, 0.0f);\n"
-                                       "  reportIntersectionEXT(1.0f, 0);\n"
-                                       "}\n";
+                               tcu::TestLog& log = context.getTestContext().getLog();
+                               const deUint32  width = testParams.width;
+                               const deUint32  height = testParams.height;
+                               const deInt32* resultPtr = (deInt32*)resultBuffer->getAllocation().getHostPtr();
+                               const deInt32* expectedPtr = m_expected.data();
+                               deUint32                failures = 0;
+                               deUint32                pos = 0;
+
+                               for (deUint32 y = 0; y < height; ++y)
+                                       for (deUint32 x = 0; x < width; ++x)
+                                       {
+                                               if (resultPtr[pos] != expectedPtr[pos])
+                                                       failures++;
+
+                                               pos++;
+                                       }
+
+                               if (failures != 0)
+                               {
+                                       const char* names[] = { "Retrieved:", "Expected:" };
+
+                                       for (deUint32 n = 0; n < 2; ++n)
+                                       {
+                                               std::stringstream       css;
+
+                                               pos = 0;
 
-                               programCollection.glslSources.add("sect") << glu::IntersectionSource(updateRayTracingGLSL(css.str())) << buildOptions;
+                                               for (deUint32 y = 0; y < height; ++y)
+                                               {
+                                                       for (deUint32 x = 0; x < width; ++x)
+                                                       {
+                                                               if (resultPtr[pos] != expectedPtr[pos])
+                                                                       css << std::setw(12) << (n == 0 ? resultPtr[pos] : expectedPtr[pos]) << ",";
+                                                               else
+                                                                       css << "____________,";
+
+                                                               pos++;
+                                                       }
+
+                                                       css << std::endl;
+                                               }
+
+                                               log << tcu::TestLog::Message << names[n] << tcu::TestLog::EndMessage;
+                                               log << tcu::TestLog::Message << css.str() << tcu::TestLog::EndMessage;
+                                       }
+                               }
+
+                               return (failures == 0);
                        }
 
-                       programCollection.glslSources.add("ahit") << glu::AnyHitSource(updateRayTracingGLSL(getHitPassthrough())) << buildOptions;
-                       programCollection.glslSources.add("chit") << glu::ClosestHitSource(updateRayTracingGLSL(getHitPassthrough())) << buildOptions;
-                       programCollection.glslSources.add("miss") << glu::MissSource(updateRayTracingGLSL(getMissPassthrough())) << buildOptions;
+                       bool TestConfigurationFloat::verify(BufferWithMemory* resultBuffer, Context& context, TestParams& testParams)
+                       {
+                               tcu::TestLog& log = context.getTestContext().getLog();
+                               const float             eps = float(FIXED_POINT_ALLOWED_ERROR) / float(FIXED_POINT_DIVISOR);
+                               const deUint32  width = testParams.width;
+                               const deUint32  height = testParams.height;
+                               const deInt32* resultPtr = (deInt32*)resultBuffer->getAllocation().getHostPtr();
+                               const deInt32* expectedPtr = m_expected.data();
+                               deUint32                failures = 0;
+                               deUint32                pos = 0;
+
+                               for (deUint32 y = 0; y < height; ++y)
+                                       for (deUint32 x = 0; x < width; ++x)
+                                       {
+                                               const float             retrievedValue = float(resultPtr[pos]) / float(FIXED_POINT_DIVISOR);
+                                               const float             expectedValue = float(expectedPtr[pos]) / float(FIXED_POINT_DIVISOR);
 
-                       break;
-               }
+                                               if (deFloatAbs(retrievedValue - expectedValue) > eps)
+                                                       failures++;
 
-               case VK_SHADER_STAGE_MISS_BIT_KHR:
-               {
-                       programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(getCommonRayGenerationShader())) << buildOptions;
+                                               pos++;
+                                       }
+
+                               if (failures != 0)
+                               {
+                                       const char* names[] = { "Retrieved:", "Expected:" };
+
+                                       for (deUint32 n = 0; n < 2; ++n)
+                                       {
+                                               std::stringstream       css;
+
+                                               pos = 0;
+
+                                               for (deUint32 y = 0; y < height; ++y)
+                                               {
+                                                       for (deUint32 x = 0; x < width; ++x)
+                                                       {
+                                                               const float     retrievedValue = float(resultPtr[pos]) / float(FIXED_POINT_DIVISOR);
+                                                               const float     expectedValue = float(expectedPtr[pos]) / float(FIXED_POINT_DIVISOR);
+
+                                                               if (deFloatAbs(retrievedValue - expectedValue) > eps)
+                                                                       css << std::setprecision(8) << std::setw(12) << (n == 0 ? retrievedValue : expectedValue) << ",";
+                                                               else
+                                                                       css << "____________,";
 
+                                                               pos++;
+                                                       }
+
+                                                       css << std::endl;
+                                               }
+
+                                               log << tcu::TestLog::Message << names[n] << tcu::TestLog::EndMessage;
+                                               log << tcu::TestLog::Message << css.str() << tcu::TestLog::EndMessage;
+                                       }
+                               }
+
+                               return (failures == 0);
+                       }
+
+                       bool TestConfigurationVector::verify(BufferWithMemory* resultBuffer, Context& context, TestParams& testParams)
                        {
-                               std::stringstream css;
-                               css <<
-                                       "#version 460 core\n"
-                                       "#extension GL_EXT_ray_tracing : require\n"
-                                       "#extension GL_EXT_ray_query : require\n"
-                                       "layout(location = 0) rayPayloadInEXT vec3 hitValue;\n"
-                                       "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
-                                       "layout(set = 0, binding = 2) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
-                                       "\n"
-                                       "void main()\n"
-                                       "{\n"
-                                       << testBody <<
-                                       "}\n";
+                               tcu::TestLog& log = context.getTestContext().getLog();
+                               const float             eps = float(FIXED_POINT_ALLOWED_ERROR) / float(FIXED_POINT_DIVISOR);
+                               const deUint32  width = testParams.width;
+                               const deUint32  height = testParams.height;
+                               const deUint32  depth = 3u; // vec3
+                               const deInt32* resultPtr = (deInt32*)resultBuffer->getAllocation().getHostPtr();
+                               const deInt32* expectedPtr = m_expected.data();
+                               deUint32                failures = 0;
+                               deUint32                pos = 0;
+
+                               if (m_useStrictComponentMatching)
+                               {
+                                       for (deUint32 z = 0; z < depth; ++z)
+                                       {
+                                               for (deUint32 y = 0; y < height; ++y)
+                                               {
+                                                       for (deUint32 x = 0; x < width; ++x)
+                                                       {
+                                                               const float     retrievedValue = float(resultPtr[pos]) / float(FIXED_POINT_DIVISOR);
+                                                               const float     expectedValue = float(expectedPtr[pos]) / float(FIXED_POINT_DIVISOR);
+
+                                                               if (deFloatAbs(retrievedValue - expectedValue) > eps)
+                                                                       failures++;
+
+                                                               ++pos;
+                                                       }
+                                               }
+                                       }
+                               }
+                               else
+                               {
+                                       // This path is taken for barycentric coords, which can be returned in any order.
+                                       //
+                                       // We need to ensure that:
+                                       // 1. Each component value found in the retrieved value has a match in the expected value vec.
+                                       // 2. Only one mapping exists per each component in the expected value vec.
+                                       const auto      nSquares = width * height;
+
+                                       for (deUint32 y = 0; y < height; ++y)
+                                       {
+                                               for (deUint32 x = 0; x < width; ++x)
+                                               {
+                                                       bool            expectedVectorComponentUsed[3] = { false };
+                                                       const auto      squareNdx = y * width + x;
+
+                                                       for (deUint32 retrievedComponentNdx = 0; retrievedComponentNdx < 3 /* vec3 */; ++retrievedComponentNdx)
+                                                       {
+                                                               const float     retrievedValue = float(resultPtr[nSquares * retrievedComponentNdx + squareNdx]) / float(FIXED_POINT_DIVISOR);
+
+                                                               for (deUint32 expectedComponentNdx = 0; expectedComponentNdx < 3 /* vec3 */; ++expectedComponentNdx)
+                                                               {
+                                                                       const float     expectedValue = float(expectedPtr[nSquares * expectedComponentNdx + squareNdx]) / float(FIXED_POINT_DIVISOR);
+
+                                                                       if (deFloatAbs(retrievedValue - expectedValue) <= eps &&
+                                                                               expectedVectorComponentUsed[expectedComponentNdx] == false)
+                                                                       {
+                                                                               expectedVectorComponentUsed[expectedComponentNdx] = true;
+
+                                                                               break;
+                                                                       }
+
+                                                                       ++pos;
+                                                               }
+                                                       }
+
+                                                       if (expectedVectorComponentUsed[0] == false ||
+                                                               expectedVectorComponentUsed[1] == false ||
+                                                               expectedVectorComponentUsed[2] == false)
+                                                       {
+                                                               ++failures;
+                                                       }
+                                               }
+                                       }
+                               }
 
-                               programCollection.glslSources.add("miss") << glu::MissSource(updateRayTracingGLSL(css.str())) << buildOptions;
+                               if (failures != 0)
+                               {
+                                       const char* names[] = {
+                                               "Retrieved",
+                                               (m_useStrictComponentMatching) ? "Expected"
+                                                                                                               : "Expected (component order is irrelevant)"
+                                       };
+
+                                       std::stringstream css;
+
+                                       for (deUint32 y = 0; y < height; ++y)
+                                       {
+                                               for (deUint32 x = 0; x < width; ++x)
+                                               {
+                                                       for (deUint32 n = 0; n < 2; ++n)
+                                                       {
+                                                               css << names[n] << " at (" << x << "," << y << ") {";
+
+                                                               for (deUint32 z = 0; z < depth; ++z)
+                                                               {
+                                                                       pos = x + width * (y + height * z);
+
+                                                                       const float     retrievedValue = float(resultPtr[pos]) / float(FIXED_POINT_DIVISOR);
+                                                                       const float     expectedValue = float(expectedPtr[pos]) / float(FIXED_POINT_DIVISOR);
+
+                                                                       if (deFloatAbs(retrievedValue - expectedValue) > eps ||
+                                                                               m_useStrictComponentMatching == false)
+                                                                       {
+                                                                               css << std::setprecision(8) << std::setw(12) << (n == 0 ? retrievedValue : expectedValue) << ",";
+                                                                       }
+                                                                       else
+                                                                               css << "____________,";
+                                                               }
+
+                                                               css << "}" << std::endl;
+                                                       }
+                                               }
+                                       }
+
+                                       log << tcu::TestLog::Message << css.str() << tcu::TestLog::EndMessage;
+                               }
+
+                               return failures == 0;
                        }
 
-                       programCollection.glslSources.add("ahit") << glu::AnyHitSource(updateRayTracingGLSL(getHitPassthrough())) << buildOptions;
-                       programCollection.glslSources.add("chit") << glu::ClosestHitSource(updateRayTracingGLSL(getHitPassthrough())) << buildOptions;
+                       bool TestConfigurationMatrix::verify(BufferWithMemory* resultBuffer, Context& context, TestParams& testParams)
+                       {
+                               tcu::TestLog& log = context.getTestContext().getLog();
+                               const float             eps = float(FIXED_POINT_ALLOWED_ERROR) / float(FIXED_POINT_DIVISOR);
+                               const deUint32  width = testParams.width;
+                               const deUint32  height = testParams.height;
+                               const deUint32  depth = 12u; // mat3x4 or mat4x3
+                               const deInt32* resultPtr = (deInt32*)resultBuffer->getAllocation().getHostPtr();
+                               const deInt32* expectedPtr = m_expected.data();
+                               deUint32                failures = 0;
+                               deUint32                pos = 0;
+
+                               for (deUint32 z = 0; z < depth; ++z)
+                                       for (deUint32 y = 0; y < height; ++y)
+                                               for (deUint32 x = 0; x < width; ++x)
+                                               {
+                                                       const float     retrievedValue = float(resultPtr[pos]) / float(FIXED_POINT_DIVISOR);
+                                                       const float     expectedValue = float(expectedPtr[pos]) / float(FIXED_POINT_DIVISOR);
+
+                                                       if (deFloatAbs(retrievedValue - expectedValue) > eps)
+                                                               failures++;
+
+                                                       ++pos;
+                                               }
+
+                               if (failures != 0)
+                               {
+                                       const char* names[] = { "Retrieved", "Expected" };
+                                       std::stringstream       css;
 
-                       break;
-               }
+                                       for (deUint32 y = 0; y < height; ++y)
+                                       {
+                                               for (deUint32 x = 0; x < width; ++x)
+                                               {
+                                                       css << "At (" << x << "," << y << ")" << std::endl;
+                                                       for (deUint32 n = 0; n < 2; ++n)
+                                                       {
+                                                               css << names[n] << std::endl << "{" << std::endl;
+
+                                                               for (deUint32 z = 0; z < depth; ++z)
+                                                               {
+                                                                       pos = x + width * (y + height * z);
+
+                                                                       const float     retrievedValue = float(resultPtr[pos]) / float(FIXED_POINT_DIVISOR);
+                                                                       const float     expectedValue = float(expectedPtr[pos]) / float(FIXED_POINT_DIVISOR);
+
+                                                                       if (z % 4 == 0)
+                                                                               css << "    {";
+
+                                                                       if (deFloatAbs(retrievedValue - expectedValue) > eps)
+                                                                               css << std::setprecision(5) << std::setw(9) << (n == 0 ? retrievedValue : expectedValue) << ",";
+                                                                       else
+                                                                               css << "_________,";
+
+                                                                       if (z % 4 == 3)
+                                                                               css << "}" << std::endl;
+                                                               }
+
+                                                               css << "}" << std::endl;
+                                                       }
+                                               }
+                                       }
 
-               case VK_SHADER_STAGE_CALLABLE_BIT_KHR:
-               {
+                                       log << tcu::TestLog::Message << css.str() << tcu::TestLog::EndMessage;
+                               }
+
+                               return failures == 0;
+                       }
+
+                       class TestConfigurationFlow : public TestConfiguration
                        {
-                               std::stringstream css;
-                               css <<
-                                       "#version 460 core\n"
-                                       "#extension GL_EXT_ray_tracing : require\n"
-                                       "#extension GL_EXT_ray_query : require\n"
-                                       "layout(location = 0) callableDataEXT float dummy;"
-                                       "layout(set = 0, binding = 1) uniform accelerationStructureEXT topLevelAS;\n"
-                                       "\n"
-                                       "void main()\n"
-                                       "{\n"
-                                       "  executeCallableEXT(0, 0);\n"
-                                       "}\n";
+                       public:
+                               static const std::string                                        getShaderBodyText(const TestParams& testParams);
+
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
+
+                       const VkAccelerationStructureKHR* TestConfigurationFlow::initAccelerationStructures(Context& context,
+                               TestParams& testParams,
+                               VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               const bool                                                                      triangles = (testParams.geomType == GEOM_TYPE_TRIANGLES);
+                               const float                                                                     z = -1.0f;
+                               tcu::UVec2                                                                      startPos = tcu::UVec2(0, 0);
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
+
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
+
+                               m_expected = std::vector<deInt32>(width * height, 1);
+
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
+
+                               for (size_t instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
+                               {
+                                       de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
+
+                                       for (size_t geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
+                                       {
+                                               std::vector<tcu::Vec3>  geometryData;
+
+                                               geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+
+                                               for (size_t squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                                               {
+                                                       const deUint32  n = width * startPos.y() + startPos.x();
+                                                       const deUint32  m = n + 1;
+                                                       const float             x0 = float(startPos.x() + 0) / float(width);
+                                                       const float             y0 = float(startPos.y() + 0) / float(height);
+                                                       const float             x1 = float(startPos.x() + 1) / float(width);
+                                                       const float             y1 = float(startPos.y() + 1) / float(height);
+
+                                                       if (triangles)
+                                                       {
+                                                               const float     xm = (x0 + x1) / 2.0f;
+                                                               const float     ym = (y0 + y1) / 2.0f;
+
+                                                               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 / width;
+                                                       startPos.x() = m % width;
+                                               }
+
+                                               rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
+                                       }
+
+                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back());
+                               }
+
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
 
-                               programCollection.glslSources.add("rgen") << glu::RaygenSource(updateRayTracingGLSL(css.str())) << buildOptions;
+                               return m_topAccelerationStructure.get()->getPtr();
                        }
 
+                       const std::string TestConfigurationFlow::getShaderBodyText(const TestParams& testParams)
                        {
-                               std::stringstream css;
-                               css <<
-                                       "#version 460 core\n"
-                                       "#extension GL_EXT_ray_tracing : require\n"
-                                       "#extension GL_EXT_ray_query : require\n"
-                                       "layout(location = 0) callableDataInEXT float dummy;"
-                                       "layout(set = 0, binding = 0, r32i) uniform iimage3D result;\n"
-                                       "layout(set = 0, binding = 2) uniform accelerationStructureEXT rayQueryTopLevelAccelerationStructure;\n"
-                                       "\n"
-                                       "void main()\n"
-                                       "{\n"
-                                       << testBody <<
-                                       "}\n";
+                               if (testParams.geomType == GEOM_TYPE_AABBS)
+                               {
+                                       const std::string result =
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  uint        value    = 4;\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value--;\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
+                                               "    {\n"
+                                               "      value--;\n"
+                                               "      rayQueryGenerateIntersectionEXT(rayQuery, 0.5f);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
+                                               "        value--;\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
+                               {
+                                       const std::string result =
+                                               "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  uint        value    = 4;\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value--;\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
+                                               "    {\n"
+                                               "      value--;\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
+                                               "        value--;\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else
+                               {
+                                       TCU_THROW(InternalError, "Unknown geometry type");
+                               }
+                       }
+
+                       class TestConfigurationPrimitiveId : public TestConfiguration
+                       {
+                       public:
+                               static const std::string                                        getShaderBodyText(const TestParams& testParams);
+
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
 
-                               programCollection.glslSources.add("call") << glu::CallableSource(updateRayTracingGLSL(css.str())) << buildOptions;
+                       const VkAccelerationStructureKHR* TestConfigurationPrimitiveId::initAccelerationStructures(Context& context,
+                               TestParams& testParams,
+                               VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               const bool                                                                      triangles = (testParams.geomType == GEOM_TYPE_TRIANGLES);
+                               const float                                                                     z = -1.0f;
+                               tcu::UVec2                                                                      startPos = tcu::UVec2(0, 0);
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
+
+                               DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
+
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
+
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
+
+                               m_expected.resize(width * height);
+
+                               for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
+                               {
+                                       de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
+
+                                       for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
+                                       {
+                                               std::vector<tcu::Vec3>  geometryData;
+
+                                               geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+
+                                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                                               {
+                                                       const deUint32  n = width * startPos.y() + startPos.x();
+                                                       const deUint32  m = (n + 11) % (width * height);
+                                                       const float             x0 = float(startPos.x() + 0) / float(width);
+                                                       const float             y0 = float(startPos.y() + 0) / float(height);
+                                                       const float             x1 = float(startPos.x() + 1) / float(width);
+                                                       const float             y1 = float(startPos.y() + 1) / float(height);
+
+                                                       if (triangles)
+                                                       {
+                                                               const float     xm = (x0 + x1) / 2.0f;
+                                                               const float     ym = (y0 + y1) / 2.0f;
+
+                                                               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));
+                                                       }
+
+                                                       m_expected[n] = squareNdx;
+
+                                                       startPos.y() = m / width;
+                                                       startPos.x() = m % width;
+                                               }
+
+                                               rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
+                                       }
+
+                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4, instanceNdx + 1);
+                               }
+
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+
+                               return m_topAccelerationStructure.get()->getPtr();
                        }
 
-                       programCollection.glslSources.add("ahit") << glu::AnyHitSource(updateRayTracingGLSL(getHitPassthrough())) << buildOptions;
-                       programCollection.glslSources.add("chit") << glu::ClosestHitSource(updateRayTracingGLSL(getHitPassthrough())) << buildOptions;
-                       programCollection.glslSources.add("miss") << glu::MissSource(updateRayTracingGLSL(getMissPassthrough())) << buildOptions;
+                       const std::string TestConfigurationPrimitiveId::getShaderBodyText(const TestParams& testParams)
+                       {
+                               if (testParams.geomType == GEOM_TYPE_AABBS)
+                               {
+                                       const std::string result =
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  uint        value    = -1;\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value--;\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
+                                               "    {\n"
+                                               "      value--;\n"
+                                               "      rayQueryGenerateIntersectionEXT(rayQuery, 0.5f);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
+                                               "        value = rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true);\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
+                               {
+                                       const std::string result =
+                                               "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  uint        value    = -1;\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value--;\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
+                                               "    {\n"
+                                               "      value--;\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
+                                               "        value = rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true);\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else
+                               {
+                                       TCU_THROW(InternalError, "Unknown geometry type");
+                               }
+                       }
+
+                       class TestConfigurationGetRayTMin : public TestConfiguration
+                       {
+                       public:
+                               static const std::string                                        getShaderBodyText(const TestParams& testParams);
+
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
+
+                       const VkAccelerationStructureKHR* TestConfigurationGetRayTMin::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               const bool                                                                      usesTriangles = (testParams.geomType == GEOM_TYPE_TRIANGLES);
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
+
+                               DE_ASSERT(instancesGroupCount == 1);
+                               DE_ASSERT(geometriesGroupCount == 1);
+                               DE_ASSERT(squaresGroupCount == width * height);
+
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
+
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
+
+                               m_expected.resize(width * height);
+
+                               for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
+                               {
+                                       de::MovePtr<BottomLevelAccelerationStructure> rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
+
+                                       for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
+                                       {
+                                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                                               {
+                                                       std::vector<tcu::Vec3> geometryData;
+
+                                                       const auto squareX = (squareNdx % width);
+                                                       const auto squareY = (squareNdx / width);
+
+                                                       const float x0 = float(squareX + 0) / float(width);
+                                                       const float y0 = float(squareY + 0) / float(height);
+                                                       const float x1 = float(squareX + 1) / float(width);
+                                                       const float y1 = float(squareY + 1) / float(height);
+
+                                                       if (usesTriangles)
+                                                       {
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                       }
+                                                       else
+                                                       {
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+                                                       }
+
+                                                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, usesTriangles);
+                                               }
+                                       }
+
+                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4, instanceNdx + 1);
+                               }
+
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+
+                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                               {
+                                       const float expected_value = 1.0f + static_cast<float>(squareNdx) / static_cast<float>(squaresGroupCount);
+                                       const auto  expected_value_i32 = static_cast<deInt32>(expected_value * FIXED_POINT_DIVISOR);
+
+                                       m_expected.at(squareNdx) = expected_value_i32;
+                               }
+
+                               return m_topAccelerationStructure.get()->getPtr();
+                       }
+
+                       const std::string TestConfigurationGetRayTMin::getShaderBodyText(const TestParams& testParams)
+                       {
+                               if (testParams.geomType == GEOM_TYPE_AABBS ||
+                                       testParams.geomType == GEOM_TYPE_TRIANGLES)
+                               {
+                                       const std::string result =
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 1.0 + float(pos.y * size.x + pos.x) / float(size.x * size.y);\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0,  1.0);\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  while (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
+                                               "      {\n"
+                                               "          rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "      }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  float result_fp32 = rayQueryGetRayTMinEXT(rayQuery);\n"
+                                               "  imageStore(result, pos, ivec4(int(result_fp32 * " + de::toString(FIXED_POINT_DIVISOR) + "), 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else
+                               {
+                                       TCU_THROW(InternalError, "Unknown geometry type");
+                               }
+                       }
+
+                       class TestConfigurationGetWorldRayOrigin : public TestConfigurationVector
+                       {
+                       public:
+                               static const std::string                                        getShaderBodyText(const TestParams& testParams);
 
-                       break;
-               }
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
 
-               default:
-                       TCU_THROW(InternalError, "Unknown stage");
-       }
-}
-
-de::MovePtr<BufferWithMemory> RayTracingConfiguration::createShaderBindingTable (const InstanceInterface&                      vki,
-                                                                                                                                                                const DeviceInterface&                         vkd,
-                                                                                                                                                                const VkDevice                                         device,
-                                                                                                                                                                const VkPhysicalDevice                         physicalDevice,
-                                                                                                                                                                const VkPipeline                                       pipeline,
-                                                                                                                                                                Allocator&                                                     allocator,
-                                                                                                                                                                de::MovePtr<RayTracingPipeline>&       rayTracingPipeline,
-                                                                                                                                                                const deUint32                                         group)
-{
-       de::MovePtr<BufferWithMemory>   shaderBindingTable;
+                       const VkAccelerationStructureKHR* TestConfigurationGetWorldRayOrigin::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               const bool                                                                      usesTriangles = (testParams.geomType == GEOM_TYPE_TRIANGLES);
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
 
-       if (group < m_shaderGroupCount)
-       {
-               const deUint32  shaderGroupHandleSize           = getShaderGroupHandleSize(vki, physicalDevice);
-               const deUint32  shaderGroupBaseAlignment        = getShaderGroupBaseAlignment(vki, physicalDevice);
+                               DE_ASSERT(instancesGroupCount == 1);
+                               DE_ASSERT(geometriesGroupCount == 1);
+                               DE_ASSERT(squaresGroupCount == width * height);
 
-               shaderBindingTable = rayTracingPipeline->createShaderBindingTable(vkd, device, pipeline, allocator, shaderGroupHandleSize, shaderGroupBaseAlignment, group, 1u);
-       }
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
 
-       return shaderBindingTable;
-}
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
 
-void RayTracingConfiguration::initConfiguration (Context&              context,
-                                                                                                TestParams&    testParams)
-{
-       DE_UNREF(testParams);
-
-       const InstanceInterface&        vki                                             = context.getInstanceInterface();
-       const DeviceInterface&          vkd                                             = context.getDeviceInterface();
-       const VkDevice                          device                                  = context.getDevice();
-       const VkPhysicalDevice          physicalDevice                  = context.getPhysicalDevice();
-       vk::BinaryCollection&           collection                              = context.getBinaryCollection();
-       Allocator&                                      allocator                               = context.getDefaultAllocator();
-       const deUint32                          shaderGroupHandleSize   = getShaderGroupHandleSize(vki, physicalDevice);
-       const VkShaderStageFlags        hitStages                               = VK_SHADER_STAGE_ANY_HIT_BIT_KHR | VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR | VK_SHADER_STAGE_INTERSECTION_BIT_KHR;
-       deUint32                                        shaderCount                             = 0;
-
-       m_shaderGroupCount = 0;
-
-       if (collection.contains("rgen")) m_shaders |= VK_SHADER_STAGE_RAYGEN_BIT_KHR;
-       if (collection.contains("ahit")) m_shaders |= VK_SHADER_STAGE_ANY_HIT_BIT_KHR;
-       if (collection.contains("chit")) m_shaders |= VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR;
-       if (collection.contains("miss")) m_shaders |= VK_SHADER_STAGE_MISS_BIT_KHR;
-       if (collection.contains("sect")) m_shaders |= VK_SHADER_STAGE_INTERSECTION_BIT_KHR;
-       if (collection.contains("call")) m_shaders |= VK_SHADER_STAGE_CALLABLE_BIT_KHR;
-
-       for (BinaryCollection::Iterator it = collection.begin(); it != collection.end(); ++it)
-               shaderCount++;
-
-       if (shaderCount != (deUint32)dePop32(m_shaders))
-               TCU_THROW(InternalError, "Unused shaders detected in the collection");
-
-       if (0 != (m_shaders & VK_SHADER_STAGE_RAYGEN_BIT_KHR))
-               m_raygenShaderGroup             = m_shaderGroupCount++;
-
-       if (0 != (m_shaders & VK_SHADER_STAGE_MISS_BIT_KHR))
-               m_missShaderGroup               = m_shaderGroupCount++;
-
-       if (0 != (m_shaders & hitStages))
-               m_hitShaderGroup                = m_shaderGroupCount++;
-
-       if (0 != (m_shaders & VK_SHADER_STAGE_CALLABLE_BIT_KHR))
-               m_callableShaderGroup   = m_shaderGroupCount++;
-
-       m_rayTracingPipeline                            = de::newMovePtr<RayTracingPipeline>();
-
-       m_descriptorSetLayout                           = DescriptorSetLayoutBuilder()
-                                                                                       .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, ALL_RAY_TRACING_STAGES)
-                                                                                       .addSingleBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, ALL_RAY_TRACING_STAGES)
-                                                                                       .addSingleBinding(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, ALL_RAY_TRACING_STAGES)
-                                                                                       .build(vkd, device);
-       m_descriptorPool                                        = DescriptorPoolBuilder()
-                                                                                       .addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE)
-                                                                                       .addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR)
-                                                                                       .addType(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR)
-                                                                                       .build(vkd, device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u);
-       m_descriptorSet                                         = makeDescriptorSet(vkd, device, *m_descriptorPool, *m_descriptorSetLayout);
-
-       if (0 != (m_shaders & VK_SHADER_STAGE_RAYGEN_BIT_KHR))                  m_rayTracingPipeline->addShader(VK_SHADER_STAGE_RAYGEN_BIT_KHR                  , createShaderModule(vkd, device, collection.get("rgen"), 0), m_raygenShaderGroup);
-       if (0 != (m_shaders & VK_SHADER_STAGE_ANY_HIT_BIT_KHR))                 m_rayTracingPipeline->addShader(VK_SHADER_STAGE_ANY_HIT_BIT_KHR                 , createShaderModule(vkd, device, collection.get("ahit"), 0), m_hitShaderGroup);
-       if (0 != (m_shaders & VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR))             m_rayTracingPipeline->addShader(VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR             , createShaderModule(vkd, device, collection.get("chit"), 0), m_hitShaderGroup);
-       if (0 != (m_shaders & VK_SHADER_STAGE_MISS_BIT_KHR))                    m_rayTracingPipeline->addShader(VK_SHADER_STAGE_MISS_BIT_KHR                    , createShaderModule(vkd, device, collection.get("miss"), 0), m_missShaderGroup);
-       if (0 != (m_shaders & VK_SHADER_STAGE_INTERSECTION_BIT_KHR))    m_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))                m_rayTracingPipeline->addShader(VK_SHADER_STAGE_CALLABLE_BIT_KHR                , createShaderModule(vkd, device, collection.get("call"), 0), m_callableShaderGroup);
-
-       m_pipelineLayout                                        = makePipelineLayout(vkd, device, m_descriptorSetLayout.get());
-       m_pipeline                                                      = m_rayTracingPipeline->createPipeline(vkd, device, *m_pipelineLayout);
-
-       m_raygenShaderBindingTable                      = createShaderBindingTable(vki, vkd, device, physicalDevice, *m_pipeline, allocator, m_rayTracingPipeline, m_raygenShaderGroup);
-       m_missShaderBindingTable                        = createShaderBindingTable(vki, vkd, device, physicalDevice, *m_pipeline, allocator, m_rayTracingPipeline, m_missShaderGroup);
-       m_hitShaderBindingTable                         = createShaderBindingTable(vki, vkd, device, physicalDevice, *m_pipeline, allocator, m_rayTracingPipeline, m_hitShaderGroup);
-       m_callableShaderBindingTable            = createShaderBindingTable(vki, vkd, device, physicalDevice, *m_pipeline, allocator, m_rayTracingPipeline, m_callableShaderGroup);
-
-       m_raygenShaderBindingTableRegion        = m_raygenShaderBindingTable.get() != NULL ? makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, m_raygenShaderBindingTable->get(), 0), 0, shaderGroupHandleSize) : makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
-       m_missShaderBindingTableRegion          = m_missShaderBindingTable.get() != NULL ? makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, m_missShaderBindingTable->get(), 0), 0, shaderGroupHandleSize) : makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
-       m_hitShaderBindingTableRegion           = m_hitShaderBindingTable.get() != NULL ? makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, m_hitShaderBindingTable->get(), 0), 0, shaderGroupHandleSize) : makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
-       m_callableShaderBindingTableRegion      = m_callableShaderBindingTable.get() != NULL ? makeStridedDeviceAddressRegionKHR(getBufferDeviceAddress(vkd, device, m_callableShaderBindingTable->get(), 0), 0, shaderGroupHandleSize) : makeStridedDeviceAddressRegionKHR(DE_NULL, 0, 0);
-}
-
-void RayTracingConfiguration::fillCommandBuffer (Context&                                                      context,
-                                                                                                TestParams&                                            testParams,
-                                                                                                VkCommandBuffer                                        commandBuffer,
-                                                                                                const VkAccelerationStructureKHR*      rayQueryTopAccelerationStructurePtr,
-                                                                                                const VkDescriptorImageInfo&           resultImageInfo)
-{
-       const DeviceInterface&                                                  vkd                                                                     = context.getDeviceInterface();
-       const VkDevice                                                                  device                                                          = context.getDevice();
-       Allocator&                                                                              allocator                                                       = context.getDefaultAllocator();
-       de::MovePtr<BottomLevelAccelerationStructure>   bottomLevelAccelerationStructure        = makeBottomLevelAccelerationStructure();
-       de::MovePtr<TopLevelAccelerationStructure>              topLevelAccelerationStructure           = makeTopLevelAccelerationStructure();
-
-       m_bottomLevelAccelerationStructure = de::SharedPtr<BottomLevelAccelerationStructure>(bottomLevelAccelerationStructure.release());
-       m_bottomLevelAccelerationStructure->setDefaultGeometryData(testParams.stage);
-       m_bottomLevelAccelerationStructure->createAndBuild(vkd, device, commandBuffer, allocator);
-
-       m_topLevelAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(topLevelAccelerationStructure.release());
-       m_topLevelAccelerationStructure->setInstanceCount(1);
-       m_topLevelAccelerationStructure->addInstance(m_bottomLevelAccelerationStructure);
-       m_topLevelAccelerationStructure->createAndBuild(vkd, device, commandBuffer, allocator);
-
-       const TopLevelAccelerationStructure*                            topLevelAccelerationStructurePtr                                = m_topLevelAccelerationStructure.get();
-       const VkWriteDescriptorSetAccelerationStructureKHR      accelerationStructureWriteDescriptorSet                 =
-       {
-               VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,      //  VkStructureType                                             sType;
-               DE_NULL,                                                                                                                        //  const void*                                                 pNext;
-               1u,                                                                                                                                     //  deUint32                                                    accelerationStructureCount;
-               topLevelAccelerationStructurePtr->getPtr(),                                                     //  const VkAccelerationStructureKHR*   pAccelerationStructures;
-       };
-       const VkWriteDescriptorSetAccelerationStructureKHR      rayQueryAccelerationStructureWriteDescriptorSet =
-       {
-               VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,      //  VkStructureType                                             sType;
-               DE_NULL,                                                                                                                        //  const void*                                                 pNext;
-               1u,                                                                                                                                     //  deUint32                                                    accelerationStructureCount;
-               rayQueryTopAccelerationStructurePtr,                                                            //  const VkAccelerationStructureKHR*   pAccelerationStructures;
-       };
-
-       DescriptorSetUpdateBuilder()
-               .writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &resultImageInfo)
-               .writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &accelerationStructureWriteDescriptorSet)
-               .writeSingle(*m_descriptorSet, DescriptorSetUpdateBuilder::Location::binding(2u), VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, &rayQueryAccelerationStructureWriteDescriptorSet)
-               .update(vkd, device);
-
-       vkd.cmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, *m_pipelineLayout, 0, 1, &m_descriptorSet.get(), 0, DE_NULL);
-
-       vkd.cmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, m_pipeline.get());
-
-       cmdTraceRays(vkd,
-               commandBuffer,
-               &m_raygenShaderBindingTableRegion,
-               &m_missShaderBindingTableRegion,
-               &m_hitShaderBindingTableRegion,
-               &m_callableShaderBindingTableRegion,
-               testParams.width, testParams.height, 1);
-}
-
-bool TestConfiguration::verify (BufferWithMemory* resultBuffer, Context& context, TestParams& testParams)
-{
-       tcu::TestLog&   log                     = context.getTestContext().getLog();
-       const deUint32  width           = testParams.width;
-       const deUint32  height          = testParams.height;
-       const deInt32*  resultPtr       = (deInt32*)resultBuffer->getAllocation().getHostPtr();
-       const deInt32*  expectedPtr     = m_expected.data();
-       deUint32                failures        = 0;
-       deUint32                pos                     = 0;
-
-       for (deUint32 y = 0; y < height; ++y)
-       for (deUint32 x = 0; x < width; ++x)
-       {
-               if (resultPtr[pos] != expectedPtr[pos])
-                       failures++;
+                               m_expected.resize(width * height * 4 /* components */);
 
-               pos++;
-       }
+                               for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
+                               {
+                                       de::MovePtr<BottomLevelAccelerationStructure> rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
 
-       if (failures != 0)
-       {
-               const char * names[] = { "Retrieved:", "Expected:" };
+                                       for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
+                                       {
+                                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                                               {
+                                                       std::vector<tcu::Vec3> geometryData;
+
+                                                       const auto squareX = (squareNdx % width);
+                                                       const auto squareY = (squareNdx / width);
+
+                                                       const float x0 = float(squareX + 0) / float(width);
+                                                       const float y0 = float(squareY + 0) / float(height);
+                                                       const float x1 = float(squareX + 1) / float(width);
+                                                       const float y1 = float(squareY + 1) / float(height);
+
+                                                       if (usesTriangles)
+                                                       {
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, -0.2f));
+                                                               geometryData.push_back(tcu::Vec3(x0, y1, -0.2f));
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, -0.2f));
+
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, -0.2f));
+                                                               geometryData.push_back(tcu::Vec3(x1, y0, -0.2f));
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, -0.2f));
+                                                       }
+                                                       else
+                                                       {
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, -0.2f));
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, -0.2f));
+                                                       }
+
+                                                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, usesTriangles);
+                                               }
+                                       }
 
-               for (deUint32 n = 0; n < 2; ++n)
-               {
-                       std::stringstream       css;
+                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4, instanceNdx + 1);
+                               }
 
-                       pos = 0;
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
 
-                       for (deUint32 y = 0; y < height; ++y)
-                       {
-                               for (deUint32 x = 0; x < width; ++x)
+                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
                                {
-                                       if (resultPtr[pos] != expectedPtr[pos])
-                                               css << std::setw(12) << (n == 0 ? resultPtr[pos] : expectedPtr[pos]) << ",";
-                                       else
-                                               css << "____________,";
+                                       const auto squareX = squareNdx % width;
+                                       const auto squareY = squareNdx / width;
+
+                                       const float expected_values[3] =
+                                       {
+                                               (float(squareX) + 0.5f)         / float(width),
+                                               (float(squareY) + 0.5f)         / float(height),
+                                               float(squareX + squareY)        / float(width + height),
+                                       };
 
-                                       pos++;
+                                       const deInt32 expected_value_i32vec3[3] =
+                                       {
+                                               static_cast<deInt32>(expected_values[0] * FIXED_POINT_DIVISOR),
+                                               static_cast<deInt32>(expected_values[1] * FIXED_POINT_DIVISOR),
+                                               static_cast<deInt32>(expected_values[2] * FIXED_POINT_DIVISOR),
+                                       };
+
+                                       /* m_expected data layout is:
+                                        *
+                                        * XXXXXXXX ..
+                                        * YYYYYYYY ..
+                                        * ZZZZZZZZ ..
+                                        * WWWWWWWW
+                                        */
+                                       m_expected.at(0 * squaresGroupCount + squareNdx) = expected_value_i32vec3[0];
+                                       m_expected.at(1 * squaresGroupCount + squareNdx) = expected_value_i32vec3[1];
+                                       m_expected.at(2 * squaresGroupCount + squareNdx) = expected_value_i32vec3[2];
+                                       m_expected.at(3 * squaresGroupCount + squareNdx) = 0;
                                }
 
-                               css << std::endl;
+                               return m_topAccelerationStructure.get()->getPtr();
                        }
 
-                       log << tcu::TestLog::Message << names[n] << tcu::TestLog::EndMessage;
-                       log << tcu::TestLog::Message << css.str() << tcu::TestLog::EndMessage;
-               }
-       }
+                       const std::string TestConfigurationGetWorldRayOrigin::getShaderBodyText(const TestParams& testParams)
+                       {
+                               if (testParams.geomType == GEOM_TYPE_AABBS ||
+                                       testParams.geomType == GEOM_TYPE_TRIANGLES)
+                               {
+                                       const std::string result =
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.00001;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5)/ float(size.x), float(float(pos.y) + 0.5) / float(size.y), float(pos.x + pos.y) / float(size.x + size.y));\n"
+                                               "  vec3        direct   = vec3(0, 0, -1);\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  bool intersection_found = false;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  while (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "      intersection_found = true;\n"
+                                               "\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  vec3 result_fp32 = (intersection_found) ? rayQueryGetWorldRayOriginEXT(rayQuery)\n"
+                                               "                                          : vec3(1234.0, 5678, 9.0);\n"
+                                               "\n"
+                                               "  imageStore(result, ivec3(pos.xy, 0), ivec4(result_fp32.x * " + de::toString(FIXED_POINT_DIVISOR) + ", 0, 0, 0) );\n"
+                                               "  imageStore(result, ivec3(pos.xy, 1), ivec4(result_fp32.y * " + de::toString(FIXED_POINT_DIVISOR) + ", 0, 0, 0) );\n"
+                                               "  imageStore(result, ivec3(pos.xy, 2), ivec4(result_fp32.z * " + de::toString(FIXED_POINT_DIVISOR) + ", 0, 0, 0) );\n";
+
+                                       return result;
+                               }
+                               else
+                               {
+                                       TCU_THROW(InternalError, "Unknown geometry type");
+                               }
+                       }
 
-       return (failures == 0);
-}
+                       class TestConfigurationGetWorldRayDirection : public TestConfigurationVector
+                       {
+                       public:
+                               static const std::string                                        getShaderBodyText(const TestParams& testParams);
 
-bool TestConfigurationFloat::verify (BufferWithMemory* resultBuffer, Context& context, TestParams& testParams)
-{
-       tcu::TestLog&   log                     = context.getTestContext().getLog();
-       const float             eps                     = float(FIXED_POINT_ALLOWED_ERROR) / float(FIXED_POINT_DIVISOR);
-       const deUint32  width           = testParams.width;
-       const deUint32  height          = testParams.height;
-       const deInt32*  resultPtr       = (deInt32*)resultBuffer->getAllocation().getHostPtr();
-       const deInt32*  expectedPtr     = m_expected.data();
-       deUint32                failures        = 0;
-       deUint32                pos                     = 0;
-
-       for (deUint32 y = 0; y < height; ++y)
-       for (deUint32 x = 0; x < width; ++x)
-       {
-               const float             retrievedValue          = float(resultPtr[pos]) / float(FIXED_POINT_DIVISOR);
-               const float             expectedValue   = float(expectedPtr[pos]) / float(FIXED_POINT_DIVISOR);
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
 
-               if (deFloatAbs(retrievedValue - expectedValue) > eps)
-                       failures++;
+                       const VkAccelerationStructureKHR* TestConfigurationGetWorldRayDirection::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               const bool                                                                      usesTriangles = (testParams.geomType == GEOM_TYPE_TRIANGLES);
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
 
-               pos++;
-       }
+                               DE_ASSERT(instancesGroupCount == 1);
+                               DE_ASSERT(geometriesGroupCount == 1);
+                               DE_ASSERT(squaresGroupCount == width * height);
 
-       if (failures != 0)
-       {
-               const char * names[] = { "Retrieved:", "Expected:" };
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
 
-               for (deUint32 n = 0; n < 2; ++n)
-               {
-                       std::stringstream       css;
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
 
-                       pos = 0;
+                               m_expected.resize(width * height * 3 /* components in vec3 */);
 
-                       for (deUint32 y = 0; y < height; ++y)
-                       {
-                               for (deUint32 x = 0; x < width; ++x)
+                               for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
                                {
-                                       const float     retrievedValue  = float(resultPtr[pos]) / float(FIXED_POINT_DIVISOR);
-                                       const float     expectedValue   = float(expectedPtr[pos]) / float(FIXED_POINT_DIVISOR);
+                                       de::MovePtr<BottomLevelAccelerationStructure> rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
 
-                                       if (deFloatAbs(retrievedValue - expectedValue) > eps)
-                                               css << std::setprecision(8) << std::setw(12) << (n == 0 ? retrievedValue : expectedValue) << ",";
-                                       else
-                                               css << "____________,";
+                                       for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
+                                       {
+                                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                                               {
+                                                       std::vector<tcu::Vec3> geometryData;
+
+                                                       const auto squareX = (squareNdx % width);
+                                                       const auto squareY = (squareNdx / width);
+
+                                                       const float x0 = float(squareX + 0) / float(width);
+                                                       const float y0 = float(squareY + 0) / float(height);
+                                                       const float x1 = float(squareX + 1) / float(width);
+                                                       const float y1 = float(squareY + 1) / float(height);
+
+                                                       if (usesTriangles)
+                                                       {
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                       }
+                                                       else
+                                                       {
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+                                                       }
+
+                                                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, usesTriangles);
+                                               }
+                                       }
 
-                                       pos++;
+                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4, instanceNdx + 1);
                                }
 
-                               css << std::endl;
-                       }
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
 
-                       log << tcu::TestLog::Message << names[n] << tcu::TestLog::EndMessage;
-                       log << tcu::TestLog::Message << css.str() << tcu::TestLog::EndMessage;
-               }
-       }
+                               const auto normalize = [](const tcu::Vec3& in_vec3)
+                               {
+                                       const auto distance = deFloatSqrt(in_vec3[0] * in_vec3[0] + in_vec3[1] * in_vec3[1] + in_vec3[2] * in_vec3[2]);
 
-       return (failures == 0);
-}
+                                       return tcu::Vec3(in_vec3[0] / distance, in_vec3[1] / distance, in_vec3[2] / distance);
+                               };
 
-bool TestConfigurationVector::verify (BufferWithMemory* resultBuffer, Context& context, TestParams& testParams)
-{
-       tcu::TestLog&   log                     = context.getTestContext().getLog();
-       const float             eps                     = float(FIXED_POINT_ALLOWED_ERROR) / float(FIXED_POINT_DIVISOR);
-       const deUint32  width           = testParams.width;
-       const deUint32  height          = testParams.height;
-       const deUint32  depth           = 3u; // vec3
-       const deInt32*  resultPtr       = (deInt32*)resultBuffer->getAllocation().getHostPtr();
-       const deInt32*  expectedPtr     = m_expected.data();
-       deUint32                failures        = 0;
-       deUint32                pos                     = 0;
-
-       for (deUint32 z = 0; z < depth; ++z)
-       for (deUint32 y = 0; y < height; ++y)
-       for (deUint32 x = 0; x < width; ++x)
-       {
-               const float     retrievedValue  = float(resultPtr[pos]) / float(FIXED_POINT_DIVISOR);
-               const float     expectedValue   = float(expectedPtr[pos]) / float(FIXED_POINT_DIVISOR);
+                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                               {
+                                       const auto squareX = squareNdx % width;
+                                       const auto squareY = squareNdx / width;
 
-               if (deFloatAbs(retrievedValue - expectedValue) > eps)
-                       failures++;
+                                       const auto origin = tcu::Vec3(0.5f, 0.5f, -1.0f);
+                                       const auto target = tcu::Vec3((float(squareX) + 0.5f) / float(width), (float(squareY) + 0.5f) / float(height), 0.0);
+                                       const auto dir_vector = target - origin;
+                                       const auto dir_vector_normalized = normalize(dir_vector);
 
-               ++pos;
-       }
+                                       const deInt32 expected_value_i32vec3[3] =
+                                       {
+                                               static_cast<deInt32>(dir_vector_normalized[0] * FIXED_POINT_DIVISOR),
+                                               static_cast<deInt32>(dir_vector_normalized[1] * FIXED_POINT_DIVISOR),
+                                               static_cast<deInt32>(dir_vector_normalized[2] * FIXED_POINT_DIVISOR),
+                                       };
+
+                                       /* Data layout for m_expected is:
+                                        *
+                                        * XXXX...XX
+                                        * YYYY...YY
+                                        * ZZZZ...ZZ
+                                        * WWWW...WW
+                                        */
+                                       m_expected.at(0 * squaresGroupCount + squareNdx) = expected_value_i32vec3[0];
+                                       m_expected.at(1 * squaresGroupCount + squareNdx) = expected_value_i32vec3[1];
+                                       m_expected.at(2 * squaresGroupCount + squareNdx) = expected_value_i32vec3[2];
+                               }
 
-       if (failures != 0)
-       {
-               const char*                     names[] = { "Retrieved", "Expected " };
-               std::stringstream       css;
+                               return m_topAccelerationStructure.get()->getPtr();
+                       }
 
-               for (deUint32 y = 0; y < height; ++y)
-               {
-                       for (deUint32 x = 0; x < width; ++x)
+                       const std::string TestConfigurationGetWorldRayDirection::getShaderBodyText(const TestParams& testParams)
                        {
-                               for (deUint32 n = 0; n < 2; ++n)
+                               if (testParams.geomType == GEOM_TYPE_AABBS ||
+                                       testParams.geomType == GEOM_TYPE_TRIANGLES)
                                {
-                                       css << names[n] << " at (" << x << "," << y << ") {";
-
-                                       for (deUint32 z = 0; z < depth; ++z)
-                                       {
-                                               pos = x + width * (y + height * z);
-
-                                               const float     retrievedValue  = float(resultPtr[pos]) / float(FIXED_POINT_DIVISOR);
-                                               const float     expectedValue   = float(expectedPtr[pos]) / float(FIXED_POINT_DIVISOR);
-
-                                               if (deFloatAbs(retrievedValue - expectedValue) > eps)
-                                                       css << std::setprecision(8) << std::setw(12) << (n == 0 ? retrievedValue : expectedValue) << ",";
-                                               else
-                                                       css << "____________,";
-                                       }
-
-                                       css << "}" << std::endl;
+                                       const std::string result =
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.00001;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3(0.5, 0.5, -1.0);\n"
+                                               "  vec3        target   = vec3(float(float(pos.x) + 0.5) / float(size.x), float(float(pos.y) + 0.5) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = normalize(target - origin);\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  bool intersection_found = false;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  while (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "\n"
+                                               "      intersection_found = true;\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  vec3 result_fp32 = (intersection_found) ? rayQueryGetWorldRayDirectionEXT(rayQuery)\n"
+                                               "                                          : vec3(1234.0, 5678.0, 9.0);\n"
+                                               "\n"
+                                               "  imageStore(result, ivec3(pos.xy, 0), ivec4(result_fp32.x * " + de::toString(FIXED_POINT_DIVISOR) + ", 0, 0, 0) );\n"
+                                               "  imageStore(result, ivec3(pos.xy, 1), ivec4(result_fp32.y * " + de::toString(FIXED_POINT_DIVISOR) + ", 0, 0, 0) );\n"
+                                               "  imageStore(result, ivec3(pos.xy, 2), ivec4(result_fp32.z * " + de::toString(FIXED_POINT_DIVISOR) + ", 0, 0, 0) );\n";
+
+                                       return result;
+                               }
+                               else
+                               {
+                                       TCU_THROW(InternalError, "Unknown geometry type");
                                }
                        }
-               }
 
-               log << tcu::TestLog::Message << css.str() << tcu::TestLog::EndMessage;
-       }
+                       class TestConfigurationInstanceId : public TestConfiguration
+                       {
+                       public:
+                               static const std::string                                        getShaderBodyText(const TestParams& testParams);
 
-       return failures == 0;
-}
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
 
-bool TestConfigurationMatrix::verify (BufferWithMemory* resultBuffer, Context& context, TestParams& testParams)
-{
-       tcu::TestLog&   log                     = context.getTestContext().getLog();
-       const float             eps                     = float(FIXED_POINT_ALLOWED_ERROR) / float(FIXED_POINT_DIVISOR);
-       const deUint32  width           = testParams.width;
-       const deUint32  height          = testParams.height;
-       const deUint32  depth           = 12u; // mat3x4 or mat4x3
-       const deInt32*  resultPtr       = (deInt32*)resultBuffer->getAllocation().getHostPtr();
-       const deInt32*  expectedPtr     = m_expected.data();
-       deUint32                failures        = 0;
-       deUint32                pos                     = 0;
-
-       for (deUint32 z = 0; z < depth; ++z)
-       for (deUint32 y = 0; y < height; ++y)
-       for (deUint32 x = 0; x < width; ++x)
-       {
-               const float     retrievedValue  = float(resultPtr[pos]) / float(FIXED_POINT_DIVISOR);
-               const float     expectedValue   = float(expectedPtr[pos]) / float(FIXED_POINT_DIVISOR);
+                       const VkAccelerationStructureKHR* TestConfigurationInstanceId::initAccelerationStructures(Context& context,
+                               TestParams& testParams,
+                               VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               const bool                                                                      triangles = (testParams.geomType == GEOM_TYPE_TRIANGLES);
+                               const float                                                                     z = -1.0f;
+                               tcu::UVec2                                                                      startPos = tcu::UVec2(0, 0);
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
 
-               if (deFloatAbs(retrievedValue - expectedValue) > eps)
-                       failures++;
+                               DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
 
-               ++pos;
-       }
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
 
-       if (failures != 0)
-       {
-               const char*                     names[] = { "Retrieved", "Expected" };
-               std::stringstream       css;
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
 
-               for (deUint32 y = 0; y < height; ++y)
-               {
-                       for (deUint32 x = 0; x < width; ++x)
-                       {
-                               css << "At (" << x << "," << y << ")" << std::endl;
-                               for (deUint32 n = 0; n < 2; ++n)
+                               m_expected.resize(width * height);
+
+                               for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
                                {
-                                       css << names[n] << std::endl << "{" << std::endl;
+                                       de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
 
-                                       for (deUint32 z = 0; z < depth; ++z)
+                                       for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
                                        {
-                                               pos = x + width * (y + height * z);
-
-                                               const float     retrievedValue  = float(resultPtr[pos]) / float(FIXED_POINT_DIVISOR);
-                                               const float     expectedValue   = float(expectedPtr[pos]) / float(FIXED_POINT_DIVISOR);
+                                               std::vector<tcu::Vec3>  geometryData;
+
+                                               geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+
+                                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                                               {
+                                                       const deUint32  n = width * startPos.y() + startPos.x();
+                                                       const deUint32  m = (n + 11) % (width * height);
+                                                       const float             x0 = float(startPos.x() + 0) / float(width);
+                                                       const float             y0 = float(startPos.y() + 0) / float(height);
+                                                       const float             x1 = float(startPos.x() + 1) / float(width);
+                                                       const float             y1 = float(startPos.y() + 1) / float(height);
+
+                                                       m_expected[n] = instanceNdx;
+
+                                                       if (triangles)
+                                                       {
+                                                               const float     xm = (x0 + x1) / 2.0f;
+                                                               const float     ym = (y0 + y1) / 2.0f;
+
+                                                               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 / width;
+                                                       startPos.x() = m % width;
+                                               }
+
+                                               rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
+                                       }
 
-                                               if (z % 4 == 0)
-                                                       css << "    {";
+                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4, instanceNdx + 1);
+                               }
 
-                                               if (deFloatAbs(retrievedValue - expectedValue) > eps)
-                                                       css << std::setprecision(5) << std::setw(9) << (n == 0 ? retrievedValue : expectedValue) << ",";
-                                               else
-                                                       css << "_________,";
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
 
-                                               if (z % 4 == 3)
-                                                       css << "}" << std::endl;
-                                       }
+                               return m_topAccelerationStructure.get()->getPtr();
+                       }
 
-                                       css << "}" << std::endl;
+                       const std::string TestConfigurationInstanceId::getShaderBodyText(const TestParams& testParams)
+                       {
+                               if (testParams.geomType == GEOM_TYPE_AABBS)
+                               {
+                                       const std::string result =
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  uint        value    = -1;\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value--;\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
+                                               "    {\n"
+                                               "      value--;\n"
+                                               "      rayQueryGenerateIntersectionEXT(rayQuery, 0.5f);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
+                                               "        value = rayQueryGetIntersectionInstanceIdEXT(rayQuery, true);\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
+                               {
+                                       const std::string result =
+                                               "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  uint        value    = -1;\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value--;\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
+                                               "    {\n"
+                                               "      value--;\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
+                                               "        value = rayQueryGetIntersectionInstanceIdEXT(rayQuery, true);\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else
+                               {
+                                       TCU_THROW(InternalError, "Unknown geometry type");
                                }
                        }
-               }
 
-               log << tcu::TestLog::Message << css.str() << tcu::TestLog::EndMessage;
-       }
-
-       return failures == 0;
-}
+                       class TestConfigurationInstanceCustomIndex : public TestConfiguration
+                       {
+                       public:
+                               static const std::string                                        getShaderBodyText(const TestParams& testParams);
 
-class TestConfigurationFlow : public TestConfiguration
-{
-public:
-       static const std::string                                        getShaderBodyText                       (const TestParams&                                      testParams);
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
 
-       virtual const VkAccelerationStructureKHR*       initAccelerationStructures      (Context&                                                       context,
-                                                                                                                                                        TestParams&                                            testParams,
-                                                                                                                                                        VkCommandBuffer                                        cmdBuffer) override;
-};
+                       const VkAccelerationStructureKHR* TestConfigurationInstanceCustomIndex::initAccelerationStructures(Context& context,
+                               TestParams& testParams,
+                               VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               const bool                                                                      triangles = (testParams.geomType == GEOM_TYPE_TRIANGLES);
+                               const float                                                                     z = -1.0f;
+                               tcu::UVec2                                                                      startPos = tcu::UVec2(0, 0);
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
 
-const VkAccelerationStructureKHR* TestConfigurationFlow::initAccelerationStructures (Context&                  context,
-                                                                                                                                                                        TestParams&            testParams,
-                                                                                                                                                                        VkCommandBuffer        cmdBuffer)
-{
-       const DeviceInterface&                                          vkd                                                                             = context.getDeviceInterface();
-       const VkDevice                                                          device                                                                  = context.getDevice();
-       Allocator&                                                                      allocator                                                               = context.getDefaultAllocator();
-       const deUint32                                                          width                                                                   = testParams.width;
-       const deUint32                                                          height                                                                  = testParams.height;
-       const deUint32                                                          instancesGroupCount                                             = testParams.instancesGroupCount;
-       const deUint32                                                          geometriesGroupCount                                    = testParams.geometriesGroupCount;
-       const deUint32                                                          squaresGroupCount                                               = testParams.squaresGroupCount;
-       const bool                                                                      triangles                                                               = (testParams.geomType == GEOM_TYPE_TRIANGLES);
-       const float                                                                     z                                                                               = -1.0f;
-       tcu::UVec2                                                                      startPos                                                                = tcu::UVec2(0, 0);
-       de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure   = makeTopLevelAccelerationStructure();
-
-       m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
-
-       m_expected = std::vector<deInt32>(width * height, 1);
-
-       m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
-
-       for (size_t instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
-       {
-               de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure        = makeBottomLevelAccelerationStructure();
+                               DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
 
-               for (size_t geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
-               {
-                       std::vector<tcu::Vec3>  geometryData;
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
 
-                       geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
 
-                       for (size_t squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
-                       {
-                               const deUint32  n       = width * startPos.y() + startPos.x();
-                               const deUint32  m       = n + 1;
-                               const float             x0      = float(startPos.x() + 0) / float(width);
-                               const float             y0      = float(startPos.y() + 0) / float(height);
-                               const float             x1      = float(startPos.x() + 1) / float(width);
-                               const float             y1      = float(startPos.y() + 1) / float(height);
+                               m_expected.resize(width * height);
 
-                               if (triangles)
+                               for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
                                {
-                                       const float     xm      = (x0 + x1) / 2.0f;
-                                       const float     ym      = (y0 + y1) / 2.0f;
+                                       de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
+
+                                       for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
+                                       {
+                                               std::vector<tcu::Vec3>  geometryData;
+
+                                               geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+
+                                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                                               {
+                                                       const deUint32  n = width * startPos.y() + startPos.x();
+                                                       const deUint32  m = (n + 11) % (width * height);
+                                                       const float             x0 = float(startPos.x() + 0) / float(width);
+                                                       const float             y0 = float(startPos.y() + 0) / float(height);
+                                                       const float             x1 = float(startPos.x() + 1) / float(width);
+                                                       const float             y1 = float(startPos.y() + 1) / float(height);
+
+                                                       m_expected[n] = instanceNdx + 1;
+
+                                                       if (triangles)
+                                                       {
+                                                               const float     xm = (x0 + x1) / 2.0f;
+                                                               const float     ym = (y0 + y1) / 2.0f;
+
+                                                               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 / width;
+                                                       startPos.x() = m % width;
+                                               }
+
+                                               rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
+                                       }
+
+                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4, instanceNdx + 1);
+                               }
+
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+
+                               return m_topAccelerationStructure.get()->getPtr();
+                       }
 
-                                       geometryData.push_back(tcu::Vec3(x0, y0, z));
-                                       geometryData.push_back(tcu::Vec3(xm, y1, z));
-                                       geometryData.push_back(tcu::Vec3(x1, ym, z));
+                       const std::string TestConfigurationInstanceCustomIndex::getShaderBodyText(const TestParams& testParams)
+                       {
+                               if (testParams.geomType == GEOM_TYPE_AABBS)
+                               {
+                                       const std::string result =
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  uint        value    = -1;\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value--;\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
+                                               "    {\n"
+                                               "      value--;\n"
+                                               "      rayQueryGenerateIntersectionEXT(rayQuery, 0.5f);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
+                                               "        value = rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true);\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
+                               {
+                                       const std::string result =
+                                               "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  uint        value    = -1;\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value--;\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
+                                               "    {\n"
+                                               "      value--;\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
+                                               "        value = rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true);\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
+
+                                       return result;
                                }
                                else
                                {
-                                       geometryData.push_back(tcu::Vec3(x0, y0, z));
-                                       geometryData.push_back(tcu::Vec3(x1, y1, z * 0.9f));
+                                       TCU_THROW(InternalError, "Unknown geometry type");
                                }
-
-                               startPos.y() = m / width;
-                               startPos.x() = m % width;
                        }
 
-                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
-               }
-
-               rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
-               m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
-               m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back());
-       }
-
-       m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
-
-       return m_topAccelerationStructure.get()->getPtr();
-}
+                       class TestConfigurationIntersectionT : public TestConfigurationFloat
+                       {
+                       public:
+                               static const std::string                                        getShaderBodyText(const TestParams& testParams);
 
-const std::string TestConfigurationFlow::getShaderBodyText (const TestParams& testParams)
-{
-       if (testParams.geomType == GEOM_TYPE_AABBS)
-       {
-               const std::string result =
-                       "  uint        rayFlags = 0;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  uint        value    = 4;\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value--;\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
-                       "    {\n"
-                       "      value--;\n"
-                       "      rayQueryGenerateIntersectionEXT(rayQuery, 0.5f);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
-                       "        value--;\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
-
-               return result;
-       }
-       else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
-       {
-               const std::string result =
-                       "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  uint        value    = 4;\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value--;\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
-                       "    {\n"
-                       "      value--;\n"
-                       "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
-                       "        value--;\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
-
-               return result;
-       }
-       else
-       {
-               TCU_THROW(InternalError, "Unknown geometry type");
-       }
-}
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
 
-class TestConfigurationPrimitiveId : public TestConfiguration
-{
-public:
-       static const std::string                                        getShaderBodyText                       (const TestParams&                                      testParams);
+                       const VkAccelerationStructureKHR* TestConfigurationIntersectionT::initAccelerationStructures(Context& context,
+                               TestParams& testParams,
+                               VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const bool                                                                      triangles = (testParams.geomType == GEOM_TYPE_TRIANGLES);
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               tcu::UVec2                                                                      startPos = tcu::UVec2(0, 0);
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
 
-       virtual const VkAccelerationStructureKHR*       initAccelerationStructures      (Context&                                                       context,
-                                                                                                                                                        TestParams&                                            testParams,
-                                                                                                                                                        VkCommandBuffer                                        cmdBuffer) override;
-};
+                               DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
 
-const VkAccelerationStructureKHR* TestConfigurationPrimitiveId::initAccelerationStructures (Context&           context,
-                                                                                                                                                                                       TestParams&             testParams,
-                                                                                                                                                                                       VkCommandBuffer cmdBuffer)
-{
-       const DeviceInterface&                                          vkd                                                                             = context.getDeviceInterface();
-       const VkDevice                                                          device                                                                  = context.getDevice();
-       Allocator&                                                                      allocator                                                               = context.getDefaultAllocator();
-       const deUint32                                                          width                                                                   = testParams.width;
-       const deUint32                                                          height                                                                  = testParams.height;
-       const deUint32                                                          instancesGroupCount                                             = testParams.instancesGroupCount;
-       const deUint32                                                          geometriesGroupCount                                    = testParams.geometriesGroupCount;
-       const deUint32                                                          squaresGroupCount                                               = testParams.squaresGroupCount;
-       const bool                                                                      triangles                                                               = (testParams.geomType == GEOM_TYPE_TRIANGLES);
-       const float                                                                     z                                                                               = -1.0f;
-       tcu::UVec2                                                                      startPos                                                                = tcu::UVec2(0, 0);
-       de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure   = makeTopLevelAccelerationStructure();
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
 
-       DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
 
-       m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
+                               m_expected.resize(width * height);
 
-       m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
+                               for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
+                               {
+                                       de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
 
-       m_expected.resize(width * height);
+                                       for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
+                                       {
+                                               std::vector<tcu::Vec3>  geometryData;
+
+                                               geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+
+                                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                                               {
+                                                       const deUint32  n = width * startPos.y() + startPos.x();
+                                                       const deUint32  m = (n + 11) % (width * height);
+                                                       const float             x0 = float(startPos.x() + 0) / float(width);
+                                                       const float             y0 = float(startPos.y() + 0) / float(height);
+                                                       const float             x1 = float(startPos.x() + 1) / float(width);
+                                                       const float             y1 = float(startPos.y() + 1) / float(height);
+                                                       const float             eps = 1.0f / float(FIXED_POINT_DIVISOR);
+                                                       const float             z = -deFloatAbs(eps + float(startPos.x()) * float(startPos.y()) / float(width * height));
+
+                                                       m_expected[n] = -int(z * FIXED_POINT_DIVISOR);
+
+                                                       if (triangles)
+                                                       {
+                                                               const float     xm = (x0 + x1) / 2.0f;
+                                                               const float     ym = (y0 + y1) / 2.0f;
+
+                                                               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 / width;
+                                                       startPos.x() = m % width;
+                                               }
+
+                                               rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
+                                       }
 
-       for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
-       {
-               de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure        = makeBottomLevelAccelerationStructure();
+                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4);
+                               }
 
-               for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
-               {
-                       std::vector<tcu::Vec3>  geometryData;
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
 
-                       geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+                               return m_topAccelerationStructure.get()->getPtr();
+                       }
 
-                       for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                       const std::string TestConfigurationIntersectionT::getShaderBodyText(const TestParams& testParams)
                        {
-                               const deUint32  n       = width * startPos.y() + startPos.x();
-                               const deUint32  m       = (n + 11) % (width * height);
-                               const float             x0      = float(startPos.x() + 0) / float(width);
-                               const float             y0      = float(startPos.y() + 0) / float(height);
-                               const float             x1      = float(startPos.x() + 1) / float(width);
-                               const float             y1      = float(startPos.y() + 1) / float(height);
-
-                               if (triangles)
+                               if (testParams.geomType == GEOM_TYPE_AABBS)
                                {
-                                       const float     xm      = (x0 + x1) / 2.0f;
-                                       const float     ym      = (y0 + y1) / 2.0f;
-
-                                       geometryData.push_back(tcu::Vec3(x0, y0, z));
-                                       geometryData.push_back(tcu::Vec3(xm, y1, z));
-                                       geometryData.push_back(tcu::Vec3(x1, ym, z));
+                                       const std::string result =
+                                               "  const int   k        = " + de::toString(FIXED_POINT_DIVISOR) + ";\n"
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  int         value    = -k;\n"
+                                               "  const float t        = abs(float(pos.x * pos.y) / float (size.x * size.y));\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value -= k;\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
+                                               "    {\n"
+                                               "      value -= k;\n"
+                                               "      rayQueryGenerateIntersectionEXT(rayQuery, t);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
+                                               "        value = int(k * rayQueryGetIntersectionTEXT(rayQuery, true));\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
+                               {
+                                       const std::string result =
+                                               "  const int   k        = " + de::toString(FIXED_POINT_DIVISOR) + ";\n"
+                                               "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  int         value    = -k;\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value -= k;\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
+                                               "    {\n"
+                                               "      value -= k;\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
+                                               "        value = int(k * rayQueryGetIntersectionTEXT(rayQuery, true));\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
+
+                                       return result;
                                }
                                else
                                {
-                                       geometryData.push_back(tcu::Vec3(x0, y0, z));
-                                       geometryData.push_back(tcu::Vec3(x1, y1, z * 0.9f));
+                                       TCU_THROW(InternalError, "Unknown geometry type");
                                }
+                       }
 
-                               m_expected[n] = squareNdx;
+                       class TestConfigurationObjectRayOrigin : public TestConfigurationVector
+                       {
+                       public:
+                               static const std::string                                        getShaderBodyText(const TestParams& testParams);
 
-                               startPos.y() = m / width;
-                               startPos.x() = m % width;
-                       }
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
 
-                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
-               }
+                       const VkAccelerationStructureKHR* TestConfigurationObjectRayOrigin::initAccelerationStructures(Context& context,
+                               TestParams& testParams,
+                               VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const deUint32                                                          depth = testParams.depth;
+                               const bool                                                                      triangles = (testParams.geomType == GEOM_TYPE_TRIANGLES);
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               const float                                                                     z = -1.0f;
+                               tcu::UVec2                                                                      startPos = tcu::UVec2(0, 0);
+                               deUint32                                                                        pos = 0;
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
+
+                               DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
+
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
+
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
+
+                               for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
+                               {
+                                       de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
 
-               rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
-               m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
-               m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4, instanceNdx + 1);
-       }
+                                       for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
+                                       {
+                                               std::vector<tcu::Vec3>  geometryData;
+
+                                               geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+
+                                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                                               {
+                                                       const deUint32  n = width * startPos.y() + startPos.x();
+                                                       const deUint32  m = (n + 11) % (width * height);
+                                                       const float             x0 = float(startPos.x() + 0) / float(width);
+                                                       const float             y0 = float(startPos.y() + 0) / float(height);
+                                                       const float             x1 = float(startPos.x() + 1) / float(width);
+                                                       const float             y1 = float(startPos.y() + 1) / float(height);
+
+                                                       if (triangles)
+                                                       {
+                                                               const float     xm = (x0 + x1) / 2.0f;
+                                                               const float     ym = (y0 + y1) / 2.0f;
+
+                                                               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 / width;
+                                                       startPos.x() = m % width;
+                                               }
+
+                                               rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
+                                       }
 
-       m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4);
+                               }
 
-       return m_topAccelerationStructure.get()->getPtr();
-}
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
 
-const std::string TestConfigurationPrimitiveId::getShaderBodyText (const TestParams& testParams)
-{
-       if (testParams.geomType == GEOM_TYPE_AABBS)
-       {
-               const std::string result =
-                       "  uint        rayFlags = 0;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  uint        value    = -1;\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value--;\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
-                       "    {\n"
-                       "      value--;\n"
-                       "      rayQueryGenerateIntersectionEXT(rayQuery, 0.5f);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
-                       "        value = rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true);\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
-
-               return result;
-       }
-       else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
-       {
-               const std::string result =
-                       "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  uint        value    = -1;\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value--;\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
-                       "    {\n"
-                       "      value--;\n"
-                       "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
-                       "        value = rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true);\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
-
-               return result;
-       }
-       else
-       {
-               TCU_THROW(InternalError, "Unknown geometry type");
-       }
-}
+                               m_expected.resize(width * height * depth);
+                               for (deUint32 y = 0; y < height; ++y)
+                                       for (deUint32 x = 0; x < width; ++x)
+                                               m_expected[pos++] = int(float(FIXED_POINT_DIVISOR) * (0.5f + float(x)) / float(width));
 
-class TestConfigurationInstanceId : public TestConfiguration
-{
-public:
-       static const std::string                                        getShaderBodyText                       (const TestParams&                                      testParams);
+                               for (deUint32 y = 0; y < height; ++y)
+                                       for (deUint32 x = 0; x < width; ++x)
+                                               m_expected[pos++] = int(float(FIXED_POINT_DIVISOR) * (0.5f + float(y)) / float(height));
 
-       virtual const VkAccelerationStructureKHR*       initAccelerationStructures      (Context&                                                       context,
-                                                                                                                                                        TestParams&                                            testParams,
-                                                                                                                                                        VkCommandBuffer                                        cmdBuffer) override;
-};
+                               for (deUint32 y = 0; y < height; ++y)
+                                       for (deUint32 x = 0; x < width; ++x)
+                                               m_expected[pos++] = 0;
 
-const VkAccelerationStructureKHR* TestConfigurationInstanceId::initAccelerationStructures (Context&                    context,
-                                                                                                                                                                                  TestParams&          testParams,
-                                                                                                                                                                                  VkCommandBuffer      cmdBuffer)
-{
-       const DeviceInterface&                                          vkd                                                                             = context.getDeviceInterface();
-       const VkDevice                                                          device                                                                  = context.getDevice();
-       Allocator&                                                                      allocator                                                               = context.getDefaultAllocator();
-       const deUint32                                                          width                                                                   = testParams.width;
-       const deUint32                                                          height                                                                  = testParams.height;
-       const deUint32                                                          instancesGroupCount                                             = testParams.instancesGroupCount;
-       const deUint32                                                          geometriesGroupCount                                    = testParams.geometriesGroupCount;
-       const deUint32                                                          squaresGroupCount                                               = testParams.squaresGroupCount;
-       const bool                                                                      triangles                                                               = (testParams.geomType == GEOM_TYPE_TRIANGLES);
-       const float                                                                     z                                                                               = -1.0f;
-       tcu::UVec2                                                                      startPos                                                                = tcu::UVec2(0, 0);
-       de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure   = makeTopLevelAccelerationStructure();
+                               return m_topAccelerationStructure.get()->getPtr();
+                       }
 
-       DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
+                       const std::string TestConfigurationObjectRayOrigin::getShaderBodyText(const TestParams& testParams)
+                       {
+                               if (testParams.geomType == GEOM_TYPE_AABBS)
+                               {
+                                       const std::string result =
+                                               "  const int   k        = " + de::toString(FIXED_POINT_DIVISOR) + ";\n"
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  ivec3       value    = ivec3(-k);\n"
+                                               "  const float t        = abs(float(pos.x * pos.y) / float (size.x * size.y));\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value -= ivec3(k);\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
+                                               "    {\n"
+                                               "      value -= ivec3(k);\n"
+                                               "      rayQueryGenerateIntersectionEXT(rayQuery, t);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
+                                               "        value = ivec3(k * rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true));\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, ivec3(pos.x, pos.y, 0), ivec4(value.x, 0, 0, 0));\n"
+                                               "  imageStore(result, ivec3(pos.x, pos.y, 1), ivec4(value.y, 0, 0, 0));\n"
+                                               "  imageStore(result, ivec3(pos.x, pos.y, 2), ivec4(value.z, 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
+                               {
+                                       const std::string result =
+                                               "  const int   k        = " + de::toString(FIXED_POINT_DIVISOR) + ";\n"
+                                               "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  ivec3       value    = ivec3(-k);\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value -= ivec3(k);\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
+                                               "    {\n"
+                                               "      value -= ivec3(k);\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
+                                               "        value = ivec3(k * rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true));\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, ivec3(pos.x, pos.y, 0), ivec4(value.x, 0, 0, 0));\n"
+                                               "  imageStore(result, ivec3(pos.x, pos.y, 1), ivec4(value.y, 0, 0, 0));\n"
+                                               "  imageStore(result, ivec3(pos.x, pos.y, 2), ivec4(value.z, 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else
+                               {
+                                       TCU_THROW(InternalError, "Unknown geometry type");
+                               }
+                       }
 
-       m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
+                       class TestConfigurationObjectRayDirection : public TestConfigurationVector
+                       {
+                       public:
+                               static const std::string                                        getShaderBodyText(const TestParams& testParams);
 
-       m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
 
-       m_expected.resize(width * height);
+                       const VkAccelerationStructureKHR* TestConfigurationObjectRayDirection::initAccelerationStructures(Context& context,
+                               TestParams& testParams,
+                               VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const deUint32                                                          depth = testParams.depth;
+                               const bool                                                                      triangles = (testParams.geomType == GEOM_TYPE_TRIANGLES);
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               const float                                                                     z = -1.0f;
+                               tcu::UVec2                                                                      startPos = tcu::UVec2(0, 0);
+                               deUint32                                                                        pos = 0;
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
+
+                               DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
+
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
+
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
+
+                               for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
+                               {
+                                       de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
 
-       for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
-       {
-               de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure        = makeBottomLevelAccelerationStructure();
+                                       for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
+                                       {
+                                               std::vector<tcu::Vec3>  geometryData;
+
+                                               geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+
+                                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                                               {
+                                                       const deUint32  n = width * startPos.y() + startPos.x();
+                                                       const deUint32  m = (n + 11) % (width * height);
+                                                       const float             x0 = float(startPos.x() + 0) / float(width);
+                                                       const float             y0 = float(startPos.y() + 0) / float(height);
+                                                       const float             x1 = float(startPos.x() + 1) / float(width);
+                                                       const float             y1 = float(startPos.y() + 1) / float(height);
+
+                                                       if (triangles)
+                                                       {
+                                                               const float     xm = (x0 + x1) / 2.0f;
+                                                               const float     ym = (y0 + y1) / 2.0f;
+
+                                                               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 / width;
+                                                       startPos.x() = m % width;
+                                               }
+
+                                               rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
+                                       }
 
-               for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
-               {
-                       std::vector<tcu::Vec3>  geometryData;
+                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4);
+                               }
 
-                       geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
 
-                       for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
-                       {
-                               const deUint32  n       = width * startPos.y() + startPos.x();
-                               const deUint32  m       = (n + 11) % (width * height);
-                               const float             x0      = float(startPos.x() + 0) / float(width);
-                               const float             y0      = float(startPos.y() + 0) / float(height);
-                               const float             x1      = float(startPos.x() + 1) / float(width);
-                               const float             y1      = float(startPos.y() + 1) / float(height);
+                               m_expected.resize(width * height * depth);
+                               for (deUint32 y = 0; y < height; ++y)
+                                       for (deUint32 x = 0; x < width; ++x)
+                                               m_expected[pos++] = 0;
 
-                               m_expected[n] = instanceNdx;
+                               for (deUint32 y = 0; y < height; ++y)
+                                       for (deUint32 x = 0; x < width; ++x)
+                                               m_expected[pos++] = 0;
 
-                               if (triangles)
-                               {
-                                       const float     xm      = (x0 + x1) / 2.0f;
-                                       const float     ym      = (y0 + y1) / 2.0f;
+                               for (deUint32 y = 0; y < height; ++y)
+                                       for (deUint32 x = 0; x < width; ++x)
+                                               m_expected[pos++] = -static_cast<deInt32>(FIXED_POINT_DIVISOR);
+
+                               return m_topAccelerationStructure.get()->getPtr();
+                       }
 
-                                       geometryData.push_back(tcu::Vec3(x0, y0, z));
-                                       geometryData.push_back(tcu::Vec3(xm, y1, z));
-                                       geometryData.push_back(tcu::Vec3(x1, ym, z));
+                       const std::string TestConfigurationObjectRayDirection::getShaderBodyText(const TestParams& testParams)
+                       {
+                               if (testParams.geomType == GEOM_TYPE_AABBS)
+                               {
+                                       const std::string result =
+                                               "  const int   k        = " + de::toString(FIXED_POINT_DIVISOR) + ";\n"
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  ivec3       value    = ivec3(-k);\n"
+                                               "  const float t        = abs(float(pos.x * pos.y) / float (size.x * size.y));\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value -= ivec3(k);\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
+                                               "    {\n"
+                                               "      value -= ivec3(k);\n"
+                                               "      rayQueryGenerateIntersectionEXT(rayQuery, t);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
+                                               "        value = ivec3(k * rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true));\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, ivec3(pos.x, pos.y, 0), ivec4(value.x, 0, 0, 0));\n"
+                                               "  imageStore(result, ivec3(pos.x, pos.y, 1), ivec4(value.y, 0, 0, 0));\n"
+                                               "  imageStore(result, ivec3(pos.x, pos.y, 2), ivec4(value.z, 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
+                               {
+                                       const std::string result =
+                                               "  const int   k        = " + de::toString(FIXED_POINT_DIVISOR) + ";\n"
+                                               "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  ivec3       value    = ivec3(-k);\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value -= ivec3(k);\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
+                                               "    {\n"
+                                               "      value -= ivec3(k);\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
+                                               "        value = ivec3(k * rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true));\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, ivec3(pos.x, pos.y, 0), ivec4(value.x, 0, 0, 0));\n"
+                                               "  imageStore(result, ivec3(pos.x, pos.y, 1), ivec4(value.y, 0, 0, 0));\n"
+                                               "  imageStore(result, ivec3(pos.x, pos.y, 2), ivec4(value.z, 0, 0, 0));\n";
+
+                                       return result;
                                }
                                else
                                {
-                                       geometryData.push_back(tcu::Vec3(x0, y0, z));
-                                       geometryData.push_back(tcu::Vec3(x1, y1, z * 0.9f));
+                                       TCU_THROW(InternalError, "Unknown geometry type");
                                }
-
-                               startPos.y() = m / width;
-                               startPos.x() = m % width;
                        }
 
-                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
-               }
+                       class TestConfigurationObjectToWorld : public TestConfigurationMatrix
+                       {
+                       public:
+                               static const std::string                                        getShaderBodyText(const TestParams& testParams);
 
-               rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
-               m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
-               m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4, instanceNdx + 1);
-       }
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
 
-       m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                       const VkAccelerationStructureKHR* TestConfigurationObjectToWorld::initAccelerationStructures(Context& context,
+                               TestParams& testParams,
+                               VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const bool                                                                      triangles = (testParams.geomType == GEOM_TYPE_TRIANGLES);
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               const float                                                                     z = -1.0f;
+                               tcu::UVec2                                                                      startPos = tcu::UVec2(0, 0);
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
+
+                               DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
+
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
+
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
+
+                               for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
+                               {
+                                       de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
+                                       VkTransformMatrixKHR                                                    transform = identityMatrix3x4;
 
-       return m_topAccelerationStructure.get()->getPtr();
-}
+                                       transform.matrix[0][3] = (1.0f / 8.0f) / float(width);
+                                       transform.matrix[1][3] = (1.0f / 16.0f) / float(height);
 
-const std::string TestConfigurationInstanceId::getShaderBodyText (const TestParams& testParams)
-{
-       if (testParams.geomType == GEOM_TYPE_AABBS)
-       {
-               const std::string result =
-                       "  uint        rayFlags = 0;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  uint        value    = -1;\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value--;\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
-                       "    {\n"
-                       "      value--;\n"
-                       "      rayQueryGenerateIntersectionEXT(rayQuery, 0.5f);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
-                       "        value = rayQueryGetIntersectionInstanceIdEXT(rayQuery, true);\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
-
-               return result;
-       }
-       else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
-       {
-               const std::string result =
-                       "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  uint        value    = -1;\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value--;\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
-                       "    {\n"
-                       "      value--;\n"
-                       "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
-                       "        value = rayQueryGetIntersectionInstanceIdEXT(rayQuery, true);\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
-
-               return result;
-       }
-       else
-       {
-               TCU_THROW(InternalError, "Unknown geometry type");
-       }
-}
+                                       for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
+                                       {
+                                               std::vector<tcu::Vec3>  geometryData;
+
+                                               geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+
+                                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                                               {
+                                                       const deUint32  n = width * startPos.y() + startPos.x();
+                                                       const deUint32  m = (n + 11) % (width * height);
+                                                       const float             x0 = float(startPos.x() + 0) / float(width);
+                                                       const float             y0 = float(startPos.y() + 0) / float(height);
+                                                       const float             x1 = float(startPos.x() + 1) / float(width);
+                                                       const float             y1 = float(startPos.y() + 1) / float(height);
+
+                                                       if (triangles)
+                                                       {
+                                                               const float     xm = (x0 + x1) / 2.0f;
+                                                               const float     ym = (y0 + y1) / 2.0f;
+
+                                                               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 / width;
+                                                       startPos.x() = m % width;
+                                               }
+
+                                               rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
+                                       }
 
-class TestConfigurationInstanceCustomIndex : public TestConfiguration
-{
-public:
-       static const std::string                                        getShaderBodyText                       (const TestParams&                                      testParams);
+                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), transform);
+                               }
 
-       virtual const VkAccelerationStructureKHR*       initAccelerationStructures      (Context&                                                       context,
-                                                                                                                                                        TestParams&                                            testParams,
-                                                                                                                                                        VkCommandBuffer                                        cmdBuffer) override;
-};
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
 
-const VkAccelerationStructureKHR* TestConfigurationInstanceCustomIndex::initAccelerationStructures (Context&           context,
-                                                                                                                                                                                                       TestParams&             testParams,
-                                                                                                                                                                                                       VkCommandBuffer cmdBuffer)
-{
-       const DeviceInterface&                                          vkd                                                                             = context.getDeviceInterface();
-       const VkDevice                                                          device                                                                  = context.getDevice();
-       Allocator&                                                                      allocator                                                               = context.getDefaultAllocator();
-       const deUint32                                                          width                                                                   = testParams.width;
-       const deUint32                                                          height                                                                  = testParams.height;
-       const deUint32                                                          instancesGroupCount                                             = testParams.instancesGroupCount;
-       const deUint32                                                          geometriesGroupCount                                    = testParams.geometriesGroupCount;
-       const deUint32                                                          squaresGroupCount                                               = testParams.squaresGroupCount;
-       const bool                                                                      triangles                                                               = (testParams.geomType == GEOM_TYPE_TRIANGLES);
-       const float                                                                     z                                                                               = -1.0f;
-       tcu::UVec2                                                                      startPos                                                                = tcu::UVec2(0, 0);
-       de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure   = makeTopLevelAccelerationStructure();
+                               {
+                                       const deUint32                                                  imageDepth = 4 * 4;
+                                       const int                                                               translateColumnNumber = 3;
+                                       const deUint32                                                  colCount = 4;
+                                       const deUint32                                                  rowCount = 3;
+                                       const deUint32                                                  zStride = height * width;
+                                       const deUint32                                                  expectedFloats = imageDepth * zStride;
+                                       const float                                                             translateX = (+1.0f / 8.0f) / float(width);
+                                       const float                                                             translateY = (+1.0f / 16.0f) / float(height);
+                                       tcu::Matrix<float, rowCount, colCount>  m;
+
+                                       m[translateColumnNumber][0] = translateX;
+                                       m[translateColumnNumber][1] = translateY;
+
+                                       m_expected.resize(expectedFloats);
+
+                                       for (deUint32 y = 0; y < height; ++y)
+                                       {
+                                               for (deUint32 x = 0; x < width; ++x)
+                                               {
+                                                       const deUint32  elem0Pos = x + width * y;
+
+                                                       for (deUint32 rowNdx = 0; rowNdx < rowCount; ++rowNdx)
+                                                               for (deUint32 colNdx = 0; colNdx < colCount; ++colNdx)
+                                                               {
+                                                                       const deUint32  zNdx = rowNdx * colCount + colNdx;
+                                                                       const deUint32  posNdx = elem0Pos + zStride * zNdx;
+
+                                                                       m_expected[posNdx] = static_cast<deInt32>(FIXED_POINT_DIVISOR * m[colNdx][rowNdx]);
+                                                               }
+                                               }
+                                       }
+                               }
 
-       DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
+                               return m_topAccelerationStructure.get()->getPtr();
+                       }
 
-       m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
+                       const std::string TestConfigurationObjectToWorld::getShaderBodyText(const TestParams& testParams)
+                       {
+                               if (testParams.geomType == GEOM_TYPE_AABBS)
+                               {
+                                       const std::string result =
+                                               "  const int   k        = " + de::toString(FIXED_POINT_DIVISOR) + ";\n"
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  mat4x3      value    = mat4x3(-k);\n"
+                                               "  const float t        = abs(float(pos.x * pos.y) / float (size.x * size.y));\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value -= mat4x3(k);\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
+                                               "    {\n"
+                                               "      value -= mat4x3(k);\n"
+                                               "      rayQueryGenerateIntersectionEXT(rayQuery, t);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
+                                               "        value = mat4x3(k * rayQueryGetIntersectionObjectToWorldEXT(rayQuery, true));\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  int ndx = -1;\n"
+                                               "  for (int row = 0; row < 3; row++)\n"
+                                               "  for (int col = 0; col < 4; col++)\n"
+                                               "  {\n"
+                                               "    ndx++;\n"
+                                               "    ivec3 p = ivec3(pos.xy, ndx);\n"
+                                               "    float r = value[col][row];\n"
+                                               "    ivec4 c = ivec4(int(r),0,0,1);\n"
+                                               "    imageStore(result, p, c);\n"
+                                               "  }\n";
+
+                                       return result;
+                               }
+                               else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
+                               {
+                                       const std::string result =
+                                               "  const int   k        = " + de::toString(FIXED_POINT_DIVISOR) + ";\n"
+                                               "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  mat4x3      value    = mat4x3(-k);\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value -= mat4x3(k);\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
+                                               "    {\n"
+                                               "      value -= mat4x3(k);\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
+                                               "        value = mat4x3(k * rayQueryGetIntersectionObjectToWorldEXT(rayQuery, true));\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  int ndx = -1;\n"
+                                               "  for (int row = 0; row < 3; row++)\n"
+                                               "  for (int col = 0; col < 4; col++)\n"
+                                               "  {\n"
+                                               "    ndx++;\n"
+                                               "    ivec3 p = ivec3(pos.xy, ndx);\n"
+                                               "    float r = value[col][row];\n"
+                                               "    ivec4 c = ivec4(int(r),0,0,1);\n"
+                                               "    imageStore(result, p, c);\n"
+                                               "  }\n";
+
+                                       return result;
+                               }
+                               else
+                               {
+                                       TCU_THROW(InternalError, "Unknown geometry type");
+                               }
+                       }
 
-       m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
+                       class TestConfigurationWorldToObject : public TestConfigurationMatrix
+                       {
+                       public:
+                               static const std::string                                        getShaderBodyText(const TestParams& testParams);
 
-       m_expected.resize(width * height);
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
 
-       for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
-       {
-               de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure        = makeBottomLevelAccelerationStructure();
+                       const VkAccelerationStructureKHR* TestConfigurationWorldToObject::initAccelerationStructures(Context& context,
+                               TestParams& testParams,
+                               VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const bool                                                                      triangles = (testParams.geomType == GEOM_TYPE_TRIANGLES);
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               const float                                                                     z = -1.0f;
+                               tcu::UVec2                                                                      startPos = tcu::UVec2(0, 0);
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
+
+                               DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
+
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
+
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
+
+                               for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
+                               {
+                                       de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
+                                       VkTransformMatrixKHR                                                    transform = identityMatrix3x4;
 
-               for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
-               {
-                       std::vector<tcu::Vec3>  geometryData;
+                                       transform.matrix[0][3] = (1.0f / 8.0f) / float(width);
+                                       transform.matrix[1][3] = (1.0f / 16.0f) / float(height);
 
-                       geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+                                       for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
+                                       {
+                                               std::vector<tcu::Vec3>  geometryData;
+
+                                               geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+
+                                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                                               {
+                                                       const deUint32  n = width * startPos.y() + startPos.x();
+                                                       const deUint32  m = (n + 11) % (width * height);
+                                                       const float             x0 = float(startPos.x() + 0) / float(width);
+                                                       const float             y0 = float(startPos.y() + 0) / float(height);
+                                                       const float             x1 = float(startPos.x() + 1) / float(width);
+                                                       const float             y1 = float(startPos.y() + 1) / float(height);
+
+                                                       if (triangles)
+                                                       {
+                                                               const float     xm = (x0 + x1) / 2.0f;
+                                                               const float     ym = (y0 + y1) / 2.0f;
+
+                                                               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 / width;
+                                                       startPos.x() = m % width;
+                                               }
+
+                                               rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
+                                       }
 
-                       for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
-                       {
-                               const deUint32  n       = width * startPos.y() + startPos.x();
-                               const deUint32  m       = (n + 11) % (width * height);
-                               const float             x0      = float(startPos.x() + 0) / float(width);
-                               const float             y0      = float(startPos.y() + 0) / float(height);
-                               const float             x1      = float(startPos.x() + 1) / float(width);
-                               const float             y1      = float(startPos.y() + 1) / float(height);
+                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), transform);
+                               }
 
-                               m_expected[n] = instanceNdx + 1;
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
 
-                               if (triangles)
                                {
-                                       const float     xm      = (x0 + x1) / 2.0f;
-                                       const float     ym      = (y0 + y1) / 2.0f;
+                                       const deUint32                                                  imageDepth = 4 * 4;
+                                       const int                                                               translateColumnNumber = 3;
+                                       const deUint32                                                  colCount = 4;
+                                       const deUint32                                                  rowCount = 3;
+                                       const deUint32                                                  zStride = height * width;
+                                       const deUint32                                                  expectedFloats = imageDepth * zStride;
+                                       const float                                                             translateX = (-1.0f / 8.0f) / float(width);
+                                       const float                                                             translateY = (-1.0f / 16.0f) / float(height);
+                                       tcu::Matrix<float, rowCount, colCount>  m;
+
+                                       m[translateColumnNumber][0] = translateX;
+                                       m[translateColumnNumber][1] = translateY;
+
+                                       m_expected.resize(expectedFloats);
+
+                                       for (deUint32 y = 0; y < height; ++y)
+                                       {
+                                               for (deUint32 x = 0; x < width; ++x)
+                                               {
+                                                       const deUint32  elem0Pos = x + width * y;
+
+                                                       for (deUint32 rowNdx = 0; rowNdx < rowCount; ++rowNdx)
+                                                               for (deUint32 colNdx = 0; colNdx < colCount; ++colNdx)
+                                                               {
+                                                                       const deUint32  zNdx = rowNdx * colCount + colNdx;
+                                                                       const deUint32  posNdx = elem0Pos + zStride * zNdx;
+
+                                                                       m_expected[posNdx] = static_cast<deInt32>(FIXED_POINT_DIVISOR * m[colNdx][rowNdx]);
+                                                               }
+                                               }
+                                       }
+                               }
+
+                               return m_topAccelerationStructure.get()->getPtr();
+                       }
 
-                                       geometryData.push_back(tcu::Vec3(x0, y0, z));
-                                       geometryData.push_back(tcu::Vec3(xm, y1, z));
-                                       geometryData.push_back(tcu::Vec3(x1, ym, z));
+                       const std::string TestConfigurationWorldToObject::getShaderBodyText(const TestParams& testParams)
+                       {
+                               if (testParams.geomType == GEOM_TYPE_AABBS)
+                               {
+                                       const std::string result =
+                                               "  const int   k        = " + de::toString(FIXED_POINT_DIVISOR) + ";\n"
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  mat4x3      value    = mat4x3(-k);\n"
+                                               "  const float t        = abs(float(pos.x * pos.y) / float (size.x * size.y));\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value -= mat4x3(k);\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
+                                               "    {\n"
+                                               "      value -= mat4x3(k);\n"
+                                               "      rayQueryGenerateIntersectionEXT(rayQuery, t);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
+                                               "        value = mat4x3(k * rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true));\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  int ndx = -1;\n"
+                                               "  for (int row = 0; row < 3; row++)\n"
+                                               "  for (int col = 0; col < 4; col++)\n"
+                                               "  {\n"
+                                               "    ndx++;\n"
+                                               "    ivec3 p = ivec3(pos.xy, ndx);\n"
+                                               "    float r = value[col][row];\n"
+                                               "    ivec4 c = ivec4(int(r),0,0,1);\n"
+                                               "    imageStore(result, p, c);\n"
+                                               "  }\n";
+
+                                       return result;
+                               }
+                               else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
+                               {
+                                       const std::string result =
+                                               "  const int   k        = " + de::toString(FIXED_POINT_DIVISOR) + ";\n"
+                                               "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  mat4x3      value    = mat4x3(-k);\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  if (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "    value -= mat4x3(k);\n"
+                                               "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
+                                               "    {\n"
+                                               "      value -= mat4x3(k);\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "\n"
+                                               "      rayQueryProceedEXT(rayQuery);\n"
+                                               "\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
+                                               "        value = mat4x3(k * rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true));\n"
+                                               "    }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  int ndx = -1;\n"
+                                               "  for (int row = 0; row < 3; row++)\n"
+                                               "  for (int col = 0; col < 4; col++)\n"
+                                               "  {\n"
+                                               "    ndx++;\n"
+                                               "    ivec3 p = ivec3(pos.xy, ndx);\n"
+                                               "    float r = value[col][row];\n"
+                                               "    ivec4 c = ivec4(int(r),0,0,1);\n"
+                                               "    imageStore(result, p, c);\n"
+                                               "  }\n";
+
+                                       return result;
                                }
                                else
                                {
-                                       geometryData.push_back(tcu::Vec3(x0, y0, z));
-                                       geometryData.push_back(tcu::Vec3(x1, y1, z * 0.9f));
+                                       TCU_THROW(InternalError, "Unknown geometry type");
                                }
+                       }
 
-                               startPos.y() = m / width;
-                               startPos.x() = m % width;
+                       class TestConfigurationNullASStruct : public TestConfiguration
+                       {
+                       public:
+                               TestConfigurationNullASStruct();
+                               ~TestConfigurationNullASStruct();
+
+                               static const std::string                                        getShaderBodyText(const TestParams& testParams);
+                               static void                                                                     checkSupport(Context& context,
+                                       const TestParams& testParams);
+
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       protected:
+                               Move<VkAccelerationStructureKHR>                        m_emptyAccelerationStructure;
+                       };
+
+                       TestConfigurationNullASStruct::TestConfigurationNullASStruct()
+                               : TestConfiguration()
+                               , m_emptyAccelerationStructure()
+                       {
                        }
 
-                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
-               }
+                       TestConfigurationNullASStruct::~TestConfigurationNullASStruct()
+                       {
+                       }
 
-               rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
-               m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
-               m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4, instanceNdx + 1);
-       }
+                       const VkAccelerationStructureKHR* TestConfigurationNullASStruct::initAccelerationStructures(Context& context,
+                               TestParams& testParams,
+                               VkCommandBuffer cmdBuffer)
+                       {
+                               DE_UNREF(context);
+                               DE_UNREF(cmdBuffer);
 
-       m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                               m_expected = std::vector<deInt32>(testParams.width * testParams.height, 1);
 
-       return m_topAccelerationStructure.get()->getPtr();
-}
+                               return &m_emptyAccelerationStructure.get();
+                       }
 
-const std::string TestConfigurationInstanceCustomIndex::getShaderBodyText (const TestParams& testParams)
-{
-       if (testParams.geomType == GEOM_TYPE_AABBS)
-       {
-               const std::string result =
-                       "  uint        rayFlags = 0;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  uint        value    = -1;\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value--;\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
-                       "    {\n"
-                       "      value--;\n"
-                       "      rayQueryGenerateIntersectionEXT(rayQuery, 0.5f);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
-                       "        value = rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true);\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
-
-               return result;
-       }
-       else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
-       {
-               const std::string result =
-                       "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  uint        value    = -1;\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value--;\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
-                       "    {\n"
-                       "      value--;\n"
-                       "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
-                       "        value = rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true);\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
-
-               return result;
-       }
-       else
-       {
-               TCU_THROW(InternalError, "Unknown geometry type");
-       }
-}
+                       void TestConfigurationNullASStruct::checkSupport(Context& context,
+                               const TestParams& testParams)
+                       {
+                               DE_UNREF(testParams);
 
-class TestConfigurationIntersectionT : public TestConfigurationFloat
-{
-public:
-       static const std::string                                        getShaderBodyText                       (const TestParams&                                      testParams);
+                               context.requireDeviceFunctionality("VK_EXT_robustness2");
 
-       virtual const VkAccelerationStructureKHR*       initAccelerationStructures      (Context&                                                       context,
-                                                                                                                                                        TestParams&                                            testParams,
-                                                                                                                                                        VkCommandBuffer                                        cmdBuffer) override;
-};
+                               const vk::VkPhysicalDeviceRobustness2FeaturesEXT& robustness2FeaturesEXT = context.getRobustness2FeaturesEXT();
 
-const VkAccelerationStructureKHR* TestConfigurationIntersectionT::initAccelerationStructures (Context&                 context,
-                                                                                                                                                                                         TestParams&           testParams,
-                                                                                                                                                                                         VkCommandBuffer       cmdBuffer)
-{
-       const DeviceInterface&                                          vkd                                                                             = context.getDeviceInterface();
-       const VkDevice                                                          device                                                                  = context.getDevice();
-       Allocator&                                                                      allocator                                                               = context.getDefaultAllocator();
-       const deUint32                                                          width                                                                   = testParams.width;
-       const deUint32                                                          height                                                                  = testParams.height;
-       const bool                                                                      triangles                                                               = (testParams.geomType == GEOM_TYPE_TRIANGLES);
-       const deUint32                                                          instancesGroupCount                                             = testParams.instancesGroupCount;
-       const deUint32                                                          geometriesGroupCount                                    = testParams.geometriesGroupCount;
-       const deUint32                                                          squaresGroupCount                                               = testParams.squaresGroupCount;
-       tcu::UVec2                                                                      startPos                                                                = tcu::UVec2(0, 0);
-       de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure   = makeTopLevelAccelerationStructure();
+                               if (!robustness2FeaturesEXT.nullDescriptor)
+                                       TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceRobustness2FeaturesEXT::nullDescriptor");
+                       }
 
-       DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
+                       const std::string TestConfigurationNullASStruct::getShaderBodyText(const TestParams& testParams)
+                       {
+                               DE_UNREF(testParams);
+
+                               const std::string result =
+                                       "  uint        rayFlags = 0;\n"
+                                       "  uint        cullMask = 0xFF;\n"
+                                       "  float       tmin     = 0.0;\n"
+                                       "  float       tmax     = 9.0;\n"
+                                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
+                                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                       "  uint        value    = 1;\n"
+                                       "  rayQueryEXT rayQuery;\n"
+                                       "\n"
+                                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                       "\n"
+                                       "  if (rayQueryProceedEXT(rayQuery))\n"
+                                       "  {\n"
+                                       "    value++;\n"
+                                       "\n"
+                                       "    rayQueryTerminateEXT(rayQuery);\n"
+                                       "  }\n"
+                                       "\n"
+                                       "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
 
-       m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
+                               return result;
+                       }
 
-       m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
+                       class TestConfigurationGetIntersectionCandidateAABBOpaque : public TestConfiguration
+                       {
+                       public:
+                               static const std::string                                        getShaderBodyText(const TestParams& testParams);
 
-       m_expected.resize(width * height);
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
 
-       for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
-       {
-               de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure        = makeBottomLevelAccelerationStructure();
+                       const VkAccelerationStructureKHR* TestConfigurationGetIntersectionCandidateAABBOpaque::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               const bool                                                                      usesTriangles = (testParams.geomType == GEOM_TYPE_TRIANGLES);
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
 
-               for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
-               {
-                       std::vector<tcu::Vec3>  geometryData;
+                               DE_ASSERT(instancesGroupCount == 1);
+                               DE_ASSERT(geometriesGroupCount == 1);
+                               DE_ASSERT(squaresGroupCount == width * height);
 
-                       geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
 
-                       for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
-                       {
-                               const deUint32  n       = width * startPos.y() + startPos.x();
-                               const deUint32  m       = (n + 11) % (width * height);
-                               const float             x0      = float(startPos.x() + 0) / float(width);
-                               const float             y0      = float(startPos.y() + 0) / float(height);
-                               const float             x1      = float(startPos.x() + 1) / float(width);
-                               const float             y1      = float(startPos.y() + 1) / float(height);
-                               const float             eps     = 1.0f / float(FIXED_POINT_DIVISOR);
-                               const float             z       = -deFloatAbs(eps + float(startPos.x()) * float(startPos.y()) / float (width * height));
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
 
-                               m_expected[n] = -int(z * FIXED_POINT_DIVISOR);
+                               m_expected.resize(width * height);
 
-                               if (triangles)
+                               for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
                                {
-                                       const float     xm      = (x0 + x1) / 2.0f;
-                                       const float     ym      = (y0 + y1) / 2.0f;
+                                       de::MovePtr<BottomLevelAccelerationStructure> rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
 
-                                       geometryData.push_back(tcu::Vec3(x0, y0, z));
-                                       geometryData.push_back(tcu::Vec3(xm, y1, z));
-                                       geometryData.push_back(tcu::Vec3(x1, ym, z));
+                                       for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
+                                       {
+                                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                                               {
+                                                       std::vector<tcu::Vec3> geometryData;
+
+                                                       const auto                                      squareX = (squareNdx % width);
+                                                       const auto                                      squareY = (squareNdx / width);
+                                                       const bool                                      isOpaque = (squareNdx % 2) == 0;
+                                                       const VkGeometryFlagsKHR        flags = (isOpaque) ? VK_GEOMETRY_OPAQUE_BIT_KHR
+                                                               : 0;
+
+                                                       const float x0 = float(squareX + 0) / float(width);
+                                                       const float y0 = float(squareY + 0) / float(height);
+                                                       const float x1 = float(squareX + 1) / float(width);
+                                                       const float y1 = float(squareY + 1) / float(height);
+
+                                                       if (usesTriangles)
+                                                       {
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                       }
+                                                       else
+                                                       {
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+                                                       }
+
+                                                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, usesTriangles, flags);
+                                               }
+                                       }
 
+                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4, instanceNdx + 1);
                                }
-                               else
+
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+
+                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
                                {
-                                       geometryData.push_back(tcu::Vec3(x0, y0, z));
-                                       geometryData.push_back(tcu::Vec3(x1, y1, z * 0.9f));
+                                       m_expected.at(squareNdx) = (squareNdx % 2) == 0;
                                }
 
-                               startPos.y() = m / width;
-                               startPos.x() = m % width;
+                               return m_topAccelerationStructure.get()->getPtr();
                        }
 
-                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
-               }
+                       const std::string TestConfigurationGetIntersectionCandidateAABBOpaque::getShaderBodyText(const TestParams& testParams)
+                       {
+                               if (testParams.geomType == GEOM_TYPE_AABBS ||
+                                       testParams.geomType == GEOM_TYPE_TRIANGLES)
+                               {
+                                       const std::string result =
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0001;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.2);\n"
+                                               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  int result_i32 = 0;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  while (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "      if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
+                                               "      {\n"
+                                               "          result_i32 |= rayQueryGetIntersectionCandidateAABBOpaqueEXT(rayQuery) ? 1 : 0;\n"
+                                               "\n"
+                                               "          rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "      }\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(result_i32, 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else
+                               {
+                                       TCU_THROW(InternalError, "Unknown geometry type");
+                               }
+                       }
+
+                       class TestConfigurationGetIntersectionFrontFace : public TestConfiguration
+                       {
+                       public:
+                               static const std::string                                        getShaderBodyTextCandidate(const TestParams& testParams);
+                               static const std::string                                        getShaderBodyTextCommitted(const TestParams& testParams);
 
-               rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
-               m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
-               m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4);
-       }
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
 
-       m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                       const VkAccelerationStructureKHR* TestConfigurationGetIntersectionFrontFace::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
 
-       return m_topAccelerationStructure.get()->getPtr();
-}
+                               DE_ASSERT(instancesGroupCount == 1);
+                               DE_ASSERT(geometriesGroupCount == 1);
+                               DE_ASSERT(squaresGroupCount == width * height);
 
-const std::string TestConfigurationIntersectionT::getShaderBodyText (const TestParams& testParams)
-{
-       if (testParams.geomType == GEOM_TYPE_AABBS)
-       {
-               const std::string result =
-                       "  const int   k        = " +de::toString(FIXED_POINT_DIVISOR) + ";\n"
-                       "  uint        rayFlags = 0;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  int         value    = -k;\n"
-                       "  const float t        = abs(float(pos.x * pos.y) / float (size.x * size.y));\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value -= k;\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
-                       "    {\n"
-                       "      value -= k;\n"
-                       "      rayQueryGenerateIntersectionEXT(rayQuery, t);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
-                       "        value = int(k * rayQueryGetIntersectionTEXT(rayQuery, true));\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
-
-               return result;
-       }
-       else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
-       {
-               const std::string result =
-                       "  const int   k        = " +de::toString(FIXED_POINT_DIVISOR) + ";\n"
-                       "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  int         value    = -k;\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value -= k;\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
-                       "    {\n"
-                       "      value -= k;\n"
-                       "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
-                       "        value = int(k * rayQueryGetIntersectionTEXT(rayQuery, true));\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
-
-               return result;
-       }
-       else
-       {
-               TCU_THROW(InternalError, "Unknown geometry type");
-       }
-}
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
 
-class TestConfigurationObjectRayOrigin : public TestConfigurationVector
-{
-public:
-       static const std::string                                        getShaderBodyText                       (const TestParams&                                      testParams);
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
 
-       virtual const VkAccelerationStructureKHR*       initAccelerationStructures      (Context&                                                       context,
-                                                                                                                                                        TestParams&                                            testParams,
-                                                                                                                                                        VkCommandBuffer                                        cmdBuffer) override;
-};
+                               m_expected.resize(width * height);
 
-const VkAccelerationStructureKHR* TestConfigurationObjectRayOrigin::initAccelerationStructures (Context&                       context,
-                                                                                                                                                                                               TestParams&             testParams,
-                                                                                                                                                                                               VkCommandBuffer cmdBuffer)
-{
-       const DeviceInterface&                                          vkd                                                                             = context.getDeviceInterface();
-       const VkDevice                                                          device                                                                  = context.getDevice();
-       Allocator&                                                                      allocator                                                               = context.getDefaultAllocator();
-       const deUint32                                                          width                                                                   = testParams.width;
-       const deUint32                                                          height                                                                  = testParams.height;
-       const deUint32                                                          depth                                                                   = testParams.depth;
-       const bool                                                                      triangles                                                               = (testParams.geomType == GEOM_TYPE_TRIANGLES);
-       const deUint32                                                          instancesGroupCount                                             = testParams.instancesGroupCount;
-       const deUint32                                                          geometriesGroupCount                                    = testParams.geometriesGroupCount;
-       const deUint32                                                          squaresGroupCount                                               = testParams.squaresGroupCount;
-       const float                                                                     z                                                                               = -1.0f;
-       tcu::UVec2                                                                      startPos                                                                = tcu::UVec2(0, 0);
-       deUint32                                                                        pos                                                                             = 0;
-       de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure   = makeTopLevelAccelerationStructure();
-
-       DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
-
-       m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
-
-       m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
-
-       for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
-       {
-               de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure        = makeBottomLevelAccelerationStructure();
+                               for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
+                               {
+                                       de::MovePtr<BottomLevelAccelerationStructure> rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
 
-               for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
-               {
-                       std::vector<tcu::Vec3>  geometryData;
+                                       for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
+                                       {
+                                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                                               {
+                                                       std::vector<tcu::Vec3> geometryData;
+
+                                                       const auto      squareX = (squareNdx % width);
+                                                       const auto      squareY = (squareNdx / width);
+
+                                                       const float x0 = float(squareX + 0) / float(width);
+                                                       const float y0 = float(squareY + 0) / float(height);
+                                                       const float x1 = float(squareX + 1) / float(width);
+                                                       const float y1 = float(squareY + 1) / float(height);
+
+                                                       if ((squareNdx % 2) == 0)
+                                                       {
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                       }
+                                                       else
+                                                       {
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+                                                       }
+
+                                                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, true /* triangles */);
+                                               }
+                                       }
 
-                       geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4, instanceNdx + 1);
+                               }
 
-                       for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
-                       {
-                               const deUint32  n       = width * startPos.y() + startPos.x();
-                               const deUint32  m       = (n + 11) % (width * height);
-                               const float             x0      = float(startPos.x() + 0) / float(width);
-                               const float             y0      = float(startPos.y() + 0) / float(height);
-                               const float             x1      = float(startPos.x() + 1) / float(width);
-                               const float             y1      = float(startPos.y() + 1) / float(height);
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
 
-                               if (triangles)
+                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
                                {
-                                       const float     xm      = (x0 + x1) / 2.0f;
-                                       const float     ym      = (y0 + y1) / 2.0f;
+                                       m_expected.at(squareNdx) = (squareNdx % 2) != 0;
+                               }
 
-                                       geometryData.push_back(tcu::Vec3(x0, y0, z));
-                                       geometryData.push_back(tcu::Vec3(xm, y1, z));
-                                       geometryData.push_back(tcu::Vec3(x1, ym, z));
+                               return m_topAccelerationStructure.get()->getPtr();
+                       }
 
+                       const std::string TestConfigurationGetIntersectionFrontFace::getShaderBodyTextCandidate(const TestParams& testParams)
+                       {
+                               if (testParams.geomType == GEOM_TYPE_AABBS ||
+                                       testParams.geomType == GEOM_TYPE_TRIANGLES)
+                               {
+                                       const std::string result =
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0001;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y),  0.2);\n"
+                                               "  vec3        direct   = vec3(0,                                                                         0,                                                                 -1.0);\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  int result_i32 = 2;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  while (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "      result_i32 = rayQueryGetIntersectionFrontFaceEXT(rayQuery, false) ? 1 : 0;\n"
+                                               "\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(result_i32, 0, 0, 0));\n";
+
+                                       return result;
                                }
                                else
                                {
-                                       geometryData.push_back(tcu::Vec3(x0, y0, z));
-                                       geometryData.push_back(tcu::Vec3(x1, y1, z * 0.9f));
+                                       TCU_THROW(InternalError, "Unknown geometry type");
                                }
+                       }
 
-                               startPos.y() = m / width;
-                               startPos.x() = m % width;
+                       const std::string TestConfigurationGetIntersectionFrontFace::getShaderBodyTextCommitted(const TestParams& testParams)
+                       {
+                               if (testParams.geomType == GEOM_TYPE_AABBS ||
+                                       testParams.geomType == GEOM_TYPE_TRIANGLES)
+                               {
+                                       const std::string result =
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0001;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y),  0.2);\n"
+                                               "  vec3        direct   = vec3(0,                                                                         0,                                                                 -1.0);\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  bool intersection_found = false;\n"
+                                               "  int  result_i32         = 0;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  while (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "      intersection_found = true;\n"
+                                               "\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  result_i32 = (intersection_found) ? (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true) ? 1 : 0)\n"
+                                               "                                                                        : 2;\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(result_i32, 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else
+                               {
+                                       TCU_THROW(InternalError, "Unknown geometry type");
+                               }
                        }
 
-                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
-               }
+                       class TestConfigurationGetIntersectionGeometryIndex : public TestConfiguration
+                       {
+                       public:
+                               static const std::string                                        getShaderBodyTextCandidate(const TestParams& testParams);
+                               static const std::string                                        getShaderBodyTextCommitted(const TestParams& testParams);
 
-               rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
-               m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
-               m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4);
-       }
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
 
-       m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                       const VkAccelerationStructureKHR* TestConfigurationGetIntersectionGeometryIndex::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
 
-       m_expected.resize(width * height * depth);
-       for (deUint32 y = 0; y < height; ++y)
-       for (deUint32 x = 0; x < width; ++x)
-               m_expected[pos++] = int(float(FIXED_POINT_DIVISOR) * (0.5f + float(x)) / float(width));
+                               DE_ASSERT(instancesGroupCount == 1);
+                               DE_ASSERT(geometriesGroupCount == 1);
+                               DE_ASSERT(squaresGroupCount == width * height);
 
-       for (deUint32 y = 0; y < height; ++y)
-       for (deUint32 x = 0; x < width; ++x)
-               m_expected[pos++] = int(float(FIXED_POINT_DIVISOR) * (0.5f + float(y)) / float(height));
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
 
-       for (deUint32 y = 0; y < height; ++y)
-       for (deUint32 x = 0; x < width; ++x)
-               m_expected[pos++] = 0;
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
 
-       return m_topAccelerationStructure.get()->getPtr();
-}
+                               m_expected.resize(width * height);
 
-const std::string TestConfigurationObjectRayOrigin::getShaderBodyText (const TestParams& testParams)
-{
-       if (testParams.geomType == GEOM_TYPE_AABBS)
-       {
-               const std::string result =
-                       "  const int   k        = " +de::toString(FIXED_POINT_DIVISOR) + ";\n"
-                       "  uint        rayFlags = 0;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  ivec3       value    = ivec3(-k);\n"
-                       "  const float t        = abs(float(pos.x * pos.y) / float (size.x * size.y));\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value -= ivec3(k);\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
-                       "    {\n"
-                       "      value -= ivec3(k);\n"
-                       "      rayQueryGenerateIntersectionEXT(rayQuery, t);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
-                       "        value = ivec3(k * rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true));\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  imageStore(result, ivec3(pos.x, pos.y, 0), ivec4(value.x, 0, 0, 0));\n"
-                       "  imageStore(result, ivec3(pos.x, pos.y, 1), ivec4(value.y, 0, 0, 0));\n"
-                       "  imageStore(result, ivec3(pos.x, pos.y, 2), ivec4(value.z, 0, 0, 0));\n";
-
-               return result;
-       }
-       else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
-       {
-               const std::string result =
-                       "  const int   k        = " +de::toString(FIXED_POINT_DIVISOR) + ";\n"
-                       "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  ivec3       value    = ivec3(-k);\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value -= ivec3(k);\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
-                       "    {\n"
-                       "      value -= ivec3(k);\n"
-                       "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
-                       "        value = ivec3(k * rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true));\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  imageStore(result, ivec3(pos.x, pos.y, 0), ivec4(value.x, 0, 0, 0));\n"
-                       "  imageStore(result, ivec3(pos.x, pos.y, 1), ivec4(value.y, 0, 0, 0));\n"
-                       "  imageStore(result, ivec3(pos.x, pos.y, 2), ivec4(value.z, 0, 0, 0));\n";
-
-               return result;
-       }
-       else
-       {
-               TCU_THROW(InternalError, "Unknown geometry type");
-       }
-}
+                               for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
+                               {
+                                       de::MovePtr<BottomLevelAccelerationStructure> rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
 
-class TestConfigurationObjectRayDirection : public TestConfigurationVector
-{
-public:
-       static const std::string                                        getShaderBodyText                       (const TestParams&                                      testParams);
+                                       for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
+                                       {
+                                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                                               {
+                                                       std::vector<tcu::Vec3> geometryData;
+
+                                                       const auto      squareX = (squareNdx % width);
+                                                       const auto      squareY = (squareNdx / width);
+
+                                                       const float x0 = float(squareX + 0) / float(width);
+                                                       const float y0 = float(squareY + 0) / float(height);
+                                                       const float x1 = float(squareX + 1) / float(width);
+                                                       const float y1 = float(squareY + 1) / float(height);
+
+                                                       if ((squareNdx % 2) == 0)
+                                                       {
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                       }
+                                                       else
+                                                       {
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+                                                       }
+
+                                                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, true /* triangles */);
+                                               }
+                                       }
 
-       virtual const VkAccelerationStructureKHR*       initAccelerationStructures      (Context&                                                       context,
-                                                                                                                                                        TestParams&                                            testParams,
-                                                                                                                                                        VkCommandBuffer                                        cmdBuffer) override;
-};
+                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4, instanceNdx + 1);
+                               }
 
-const VkAccelerationStructureKHR* TestConfigurationObjectRayDirection::initAccelerationStructures (Context&                    context,
-                                                                                                                                                                                                  TestParams&          testParams,
-                                                                                                                                                                                                  VkCommandBuffer      cmdBuffer)
-{
-       const DeviceInterface&                                          vkd                                                                             = context.getDeviceInterface();
-       const VkDevice                                                          device                                                                  = context.getDevice();
-       Allocator&                                                                      allocator                                                               = context.getDefaultAllocator();
-       const deUint32                                                          width                                                                   = testParams.width;
-       const deUint32                                                          height                                                                  = testParams.height;
-       const deUint32                                                          depth                                                                   = testParams.depth;
-       const bool                                                                      triangles                                                               = (testParams.geomType == GEOM_TYPE_TRIANGLES);
-       const deUint32                                                          instancesGroupCount                                             = testParams.instancesGroupCount;
-       const deUint32                                                          geometriesGroupCount                                    = testParams.geometriesGroupCount;
-       const deUint32                                                          squaresGroupCount                                               = testParams.squaresGroupCount;
-       const float                                                                     z                                                                               = -1.0f;
-       tcu::UVec2                                                                      startPos                                                                = tcu::UVec2(0, 0);
-       deUint32                                                                        pos                                                                             = 0;
-       de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure   = makeTopLevelAccelerationStructure();
-
-       DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
-
-       m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
-
-       m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
-
-       for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
-       {
-               de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure        = makeBottomLevelAccelerationStructure();
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
 
-               for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
-               {
-                       std::vector<tcu::Vec3>  geometryData;
+                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                               {
+                                       m_expected.at(squareNdx) = squareNdx;
+                               }
 
-                       geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+                               return m_topAccelerationStructure.get()->getPtr();
+                       }
 
-                       for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                       const std::string TestConfigurationGetIntersectionGeometryIndex::getShaderBodyTextCandidate(const TestParams& testParams)
                        {
-                               const deUint32  n       = width * startPos.y() + startPos.x();
-                               const deUint32  m       = (n + 11) % (width * height);
-                               const float             x0      = float(startPos.x() + 0) / float(width);
-                               const float             y0      = float(startPos.y() + 0) / float(height);
-                               const float             x1      = float(startPos.x() + 1) / float(width);
-                               const float             y1      = float(startPos.y() + 1) / float(height);
-
-                               if (triangles)
+                               if (testParams.geomType == GEOM_TYPE_AABBS ||
+                                       testParams.geomType == GEOM_TYPE_TRIANGLES)
                                {
-                                       const float     xm      = (x0 + x1) / 2.0f;
-                                       const float     ym      = (y0 + y1) / 2.0f;
-
-                                       geometryData.push_back(tcu::Vec3(x0, y0, z));
-                                       geometryData.push_back(tcu::Vec3(xm, y1, z));
-                                       geometryData.push_back(tcu::Vec3(x1, ym, z));
-
+                                       const std::string result =
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0001;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y),  0.2);\n"
+                                               "  vec3        direct   = vec3(0,                                                                         0,                                                                 -1.0);\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  int result_i32 = 123456;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  while (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "      result_i32 = rayQueryGetIntersectionGeometryIndexEXT(rayQuery, false);\n"
+                                               "\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(result_i32, 0, 0, 0));\n";
+
+                                       return result;
                                }
                                else
                                {
-                                       geometryData.push_back(tcu::Vec3(x0, y0, z));
-                                       geometryData.push_back(tcu::Vec3(x1, y1, z * 0.9f));
+                                       TCU_THROW(InternalError, "Unknown geometry type");
                                }
+                       }
 
-                               startPos.y() = m / width;
-                               startPos.x() = m % width;
+                       const std::string TestConfigurationGetIntersectionGeometryIndex::getShaderBodyTextCommitted(const TestParams& testParams)
+                       {
+                               if (testParams.geomType == GEOM_TYPE_AABBS ||
+                                       testParams.geomType == GEOM_TYPE_TRIANGLES)
+                               {
+                                       const std::string result =
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0001;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y),  0.2);\n"
+                                               "  vec3        direct   = vec3(0,                                                                         0,                                                                 -1.0);\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  bool intersection_found = false;\n"
+                                               "  int  result_i32         = 0;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  while (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "      intersection_found = true;\n"
+                                               "\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  result_i32 = (intersection_found) ? (rayQueryGetIntersectionGeometryIndexEXT(rayQuery, true) )\n"
+                                               "                                                                        : 2;\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(result_i32, 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else
+                               {
+                                       TCU_THROW(InternalError, "Unknown geometry type");
+                               }
                        }
 
-                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
-               }
+                       class TestConfigurationGetIntersectionBarycentrics : public TestConfigurationVector
+                       {
+                       public:
+                               TestConfigurationGetIntersectionBarycentrics()
+                                       : TestConfigurationVector(false)
+                               {
+                                       /* Stub */
+                               }
 
-               rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
-               m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
-               m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4);
-       }
+                               static const std::string        getShaderBodyTextCandidate(const TestParams& testParams);
+                               static const std::string        getShaderBodyTextCommitted(const TestParams& testParams);
 
-       m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
 
-       m_expected.resize(width * height * depth);
-       for (deUint32 y = 0; y < height; ++y)
-       for (deUint32 x = 0; x < width; ++x)
-               m_expected[pos++] = 0;
+                       const VkAccelerationStructureKHR* TestConfigurationGetIntersectionBarycentrics::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
 
-       for (deUint32 y = 0; y < height; ++y)
-       for (deUint32 x = 0; x < width; ++x)
-               m_expected[pos++] = 0;
+                               DE_ASSERT(instancesGroupCount == 1);
+                               DE_ASSERT(geometriesGroupCount == 1);
+                               DE_ASSERT(squaresGroupCount == width * height);
 
-       for (deUint32 y = 0; y < height; ++y)
-       for (deUint32 x = 0; x < width; ++x)
-               m_expected[pos++] = -static_cast<deInt32>(FIXED_POINT_DIVISOR);
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
 
-       return m_topAccelerationStructure.get()->getPtr();
-}
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
 
-const std::string TestConfigurationObjectRayDirection::getShaderBodyText (const TestParams& testParams)
-{
-       if (testParams.geomType == GEOM_TYPE_AABBS)
-       {
-               const std::string result =
-                       "  const int   k        = " +de::toString(FIXED_POINT_DIVISOR) + ";\n"
-                       "  uint        rayFlags = 0;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  ivec3       value    = ivec3(-k);\n"
-                       "  const float t        = abs(float(pos.x * pos.y) / float (size.x * size.y));\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value -= ivec3(k);\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
-                       "    {\n"
-                       "      value -= ivec3(k);\n"
-                       "      rayQueryGenerateIntersectionEXT(rayQuery, t);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
-                       "        value = ivec3(k * rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true));\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  imageStore(result, ivec3(pos.x, pos.y, 0), ivec4(value.x, 0, 0, 0));\n"
-                       "  imageStore(result, ivec3(pos.x, pos.y, 1), ivec4(value.y, 0, 0, 0));\n"
-                       "  imageStore(result, ivec3(pos.x, pos.y, 2), ivec4(value.z, 0, 0, 0));\n";
-
-               return result;
-       }
-       else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
-       {
-               const std::string result =
-                       "  const int   k        = " +de::toString(FIXED_POINT_DIVISOR) + ";\n"
-                       "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  ivec3       value    = ivec3(-k);\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value -= ivec3(k);\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
-                       "    {\n"
-                       "      value -= ivec3(k);\n"
-                       "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
-                       "        value = ivec3(k * rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true));\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  imageStore(result, ivec3(pos.x, pos.y, 0), ivec4(value.x, 0, 0, 0));\n"
-                       "  imageStore(result, ivec3(pos.x, pos.y, 1), ivec4(value.y, 0, 0, 0));\n"
-                       "  imageStore(result, ivec3(pos.x, pos.y, 2), ivec4(value.z, 0, 0, 0));\n";
-
-               return result;
-       }
-       else
-       {
-               TCU_THROW(InternalError, "Unknown geometry type");
-       }
-}
+                               m_expected.resize(width * height * 3);
 
-class TestConfigurationObjectToWorld : public TestConfigurationMatrix
-{
-public:
-       static const std::string                                        getShaderBodyText                       (const TestParams&                                      testParams);
+                               for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
+                               {
+                                       de::MovePtr<BottomLevelAccelerationStructure> rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
 
-       virtual const VkAccelerationStructureKHR*       initAccelerationStructures      (Context&                                                       context,
-                                                                                                                                                        TestParams&                                            testParams,
-                                                                                                                                                        VkCommandBuffer                                        cmdBuffer) override;
-};
+                                       for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
+                                       {
+                                               for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
+                                               {
+                                                       std::vector<tcu::Vec3> geometryData;
 
-const VkAccelerationStructureKHR* TestConfigurationObjectToWorld::initAccelerationStructures (Context&                 context,
-                                                                                                                                                                                         TestParams&           testParams,
-                                                                                                                                                                                         VkCommandBuffer       cmdBuffer)
-{
-       const DeviceInterface&                                          vkd                                                                             = context.getDeviceInterface();
-       const VkDevice                                                          device                                                                  = context.getDevice();
-       Allocator&                                                                      allocator                                                               = context.getDefaultAllocator();
-       const deUint32                                                          width                                                                   = testParams.width;
-       const deUint32                                                          height                                                                  = testParams.height;
-       const bool                                                                      triangles                                                               = (testParams.geomType == GEOM_TYPE_TRIANGLES);
-       const deUint32                                                          instancesGroupCount                                             = testParams.instancesGroupCount;
-       const deUint32                                                          geometriesGroupCount                                    = testParams.geometriesGroupCount;
-       const deUint32                                                          squaresGroupCount                                               = testParams.squaresGroupCount;
-       const float                                                                     z                                                                               = -1.0f;
-       tcu::UVec2                                                                      startPos                                                                = tcu::UVec2(0, 0);
-       de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure   = makeTopLevelAccelerationStructure();
-
-       DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
-
-       m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
-
-       m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
-
-       for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
-       {
-               de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure        = makeBottomLevelAccelerationStructure();
-               VkTransformMatrixKHR                                                    transform                                                                       = identityMatrix3x4;
+                                                       const auto      squareX = (squareNdx % width);
+                                                       const auto      squareY = (squareNdx / width);
 
-               transform.matrix[0][3] = (1.0f / 8.0f) / float(width);
-               transform.matrix[1][3] = (1.0f / 16.0f) / float(height);
+                                                       const float x0 = float(squareX + 0) / float(width);
+                                                       const float y0 = float(squareY + 0) / float(height);
+                                                       const float x1 = float(squareX + 1) / float(width);
+                                                       const float y1 = float(squareY + 1) / float(height);
 
-               for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
-               {
-                       std::vector<tcu::Vec3>  geometryData;
+                                                       const float x05 = x0 + (x1 - x0) * 0.5f;
+                                                       const float y05 = y0 + (y1 - y0) * 0.5f;
 
-                       geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+                                                       geometryData.push_back(tcu::Vec3(x05, y0, 0.0));
+                                                       geometryData.push_back(tcu::Vec3(x0, y1, 0.0));
+                                                       geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
 
-                       for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
-                       {
-                               const deUint32  n       = width * startPos.y() + startPos.x();
-                               const deUint32  m       = (n + 11) % (width * height);
-                               const float             x0      = float(startPos.x() + 0) / float(width);
-                               const float             y0      = float(startPos.y() + 0) / float(height);
-                               const float             x1      = float(startPos.x() + 1) / float(width);
-                               const float             y1      = float(startPos.y() + 1) / float(height);
+                                                       /* With each cell, ray target moves from (x1, y1) to (x0.5, y0.5). This guarantees a hit and different barycentric coords
+                                                        * per each traced ray.
+                                                        */
+                                                       const float t = float(squareNdx) / float(squaresGroupCount - 1);
 
-                               if (triangles)
-                               {
-                                       const float     xm      = (x0 + x1) / 2.0f;
-                                       const float     ym      = (y0 + y1) / 2.0f;
+                                                       const float hitX = x0 + 0.125f / float(width) + (x1 - x05) * t;
+                                                       const float hitY = y1 - 0.125f / float(height) - (y1 - y05) * t;
 
-                                       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));
-                               }
+                                                       const float barycentricX = ((0 + (x1 - x0) * (hitY - y1)) / (0 + (x1 - x0) * (y0 - y1)));
+                                                       const float barycentricY = (((y1 - y0) * (hitX - x1) + (x05 - x1) * (hitY - y1)) / (0 + (x1 - x0) * (y0 - y1)));
 
-                               startPos.y() = m / width;
-                               startPos.x() = m % width;
-                       }
+                                                       m_expected.at(squaresGroupCount * 0 + squareNdx) = static_cast<deInt32>(FIXED_POINT_DIVISOR * barycentricY);
+                                                       m_expected.at(squaresGroupCount * 1 + squareNdx) = static_cast<deInt32>(FIXED_POINT_DIVISOR * barycentricX);
+                                                       m_expected.at(squaresGroupCount * 2 + squareNdx) = static_cast<deInt32>(FIXED_POINT_DIVISOR * (1.0f - barycentricX - barycentricY));
 
-                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
-               }
+                                                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, true /* triangles */);
+                                               }
+                                       }
 
-               rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
-               m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
-               m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), transform);
-       }
+                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4, instanceNdx + 1);
+                               }
 
-       m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
 
-       {
-               const deUint32                                                  imageDepth                              = 4 * 4;
-               const int                                                               translateColumnNumber   = 3;
-               const deUint32                                                  colCount                                = 4;
-               const deUint32                                                  rowCount                                = 3;
-               const deUint32                                                  zStride                                 = height * width;
-               const deUint32                                                  expectedFloats                  = imageDepth * zStride;
-               const float                                                             translateX                              = (+1.0f / 8.0f) / float(width);
-               const float                                                             translateY                              = (+1.0f / 16.0f) / float(height);
-               tcu::Matrix<float, rowCount, colCount>  m;
-
-               m[translateColumnNumber][0] = translateX;
-               m[translateColumnNumber][1] = translateY;
-
-               m_expected.resize(expectedFloats);
-
-               for (deUint32 y = 0; y < height; ++y)
-               {
-                       for (deUint32 x = 0; x < width; ++x)
-                       {
-                               const deUint32  elem0Pos        = x + width * y;
+                               return m_topAccelerationStructure.get()->getPtr();
+                       }
 
-                               for (deUint32 rowNdx = 0; rowNdx < rowCount; ++rowNdx)
-                               for (deUint32 colNdx = 0; colNdx < colCount; ++colNdx)
+                       const std::string TestConfigurationGetIntersectionBarycentrics::getShaderBodyTextCandidate(const TestParams& testParams)
+                       {
+                               if (testParams.geomType == GEOM_TYPE_AABBS ||
+                                       testParams.geomType == GEOM_TYPE_TRIANGLES)
                                {
-                                       const deUint32  zNdx    = rowNdx * colCount + colNdx;
-                                       const deUint32  posNdx  = elem0Pos + zStride * zNdx;
+                                       const std::string result =
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0001;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y),  0.2);\n"
+                                               "\n"
+                                               "  int         nSquare = pos.y * size.x + pos.x;\n"
+                                               "  float       t        = float(pos.y * size.x + pos.x) / float(size.x * size.y - 1);\n"
+                                               "  float       x0       = float(pos.x)     / float(size.x);\n"
+                                               "  float       x1       = float(pos.x + 1) / float(size.x);\n"
+                                               "  float       x05      = mix(x0, x1, 0.5);\n"
+                                               "  float       y0       = float(pos.y)     / float(size.y);\n"
+                                               "  float       y1       = float(pos.y + 1) / float(size.y);\n"
+                                               "  float       y05      = mix(y0, y1, 0.5);\n"
+                                               "  vec3        target   = vec3(x0 + 0.125 / float(size.x) + (x1 - x05) * t,\n"
+                                               "                              y1 - 0.125 / float(size.y) - (y1 - y05) * t,\n"
+                                               "                              0.0);\n"
+                                               "  vec3        direct   = normalize(target - origin);\n"
+                                               "\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  vec2 result_fp32 = vec2(1234, 5678);\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  while (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "      result_fp32 = rayQueryGetIntersectionBarycentricsEXT(rayQuery, false);\n"
+                                               "\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, ivec3(pos.xy, 0), ivec4(result_fp32.x * " + de::toString(FIXED_POINT_DIVISOR) + ", 0, 0, 0));\n"
+                                               "  imageStore(result, ivec3(pos.xy, 1), ivec4(result_fp32.y * " + de::toString(FIXED_POINT_DIVISOR) + ", 0, 0, 0));\n"
+                                               "  imageStore(result, ivec3(pos.xy, 2), ivec4((1.0 - result_fp32.x - result_fp32.y) * " + de::toString(FIXED_POINT_DIVISOR) + ", 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else
+                               {
+                                       TCU_THROW(InternalError, "Unknown geometry type");
+                               }
+                       }
 
-                                       m_expected[posNdx] = static_cast<deInt32>(FIXED_POINT_DIVISOR * m[colNdx][rowNdx]);
+                       const std::string TestConfigurationGetIntersectionBarycentrics::getShaderBodyTextCommitted(const TestParams& testParams)
+                       {
+                               if (testParams.geomType == GEOM_TYPE_AABBS ||
+                                       testParams.geomType == GEOM_TYPE_TRIANGLES)
+                               {
+                                       const std::string result =
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0001;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y),  0.2);\n"
+                                               "\n"
+                                               "  int         nSquare = pos.y * size.x + pos.x;\n"
+                                               "  float       t        = float(pos.y * size.x + pos.x) / float(size.x * size.y - 1);\n"
+                                               "  float       x0       = float(pos.x)     / float(size.x);\n"
+                                               "  float       x1       = float(pos.x + 1) / float(size.x);\n"
+                                               "  float       x05      = mix(x0, x1, 0.5);\n"
+                                               "  float       y0       = float(pos.y)     / float(size.y);\n"
+                                               "  float       y1       = float(pos.y + 1) / float(size.y);\n"
+                                               "  float       y05      = mix(y0, y1, 0.5);\n"
+                                               "  vec3        target   = vec3(x0 + 0.125 / float(size.x) + (x1 - x05) * t,\n"
+                                               "                              y1 - 0.125 / float(size.y) - (y1 - y05) * t,\n"
+                                               "                              0.0);\n"
+                                               "  vec3        direct   = normalize(target - origin);\n"
+                                               "\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  bool intersection_found = false;\n"
+                                               "  vec2 result_fp32        = vec2(1234, 5678);\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  while (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "      intersection_found = true;\n"
+                                               "\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  if (intersection_found)\n"
+                                               "  {\n"
+                                               "    result_fp32 = rayQueryGetIntersectionBarycentricsEXT(rayQuery, true);\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, ivec3(pos.xy, 0), ivec4(result_fp32.x * " + de::toString(FIXED_POINT_DIVISOR) + ", 0, 0, 0));\n"
+                                               "  imageStore(result, ivec3(pos.xy, 1), ivec4(result_fp32.y * " + de::toString(FIXED_POINT_DIVISOR) + ", 0, 0, 0));\n"
+                                               "  imageStore(result, ivec3(pos.xy, 2), ivec4((1.0 - result_fp32.x - result_fp32.y) * " + de::toString(FIXED_POINT_DIVISOR) + ", 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else
+                               {
+                                       TCU_THROW(InternalError, "Unknown geometry type");
                                }
                        }
-               }
-       }
 
-       return m_topAccelerationStructure.get()->getPtr();
-}
+                       /// <summary>
+                       class TestConfigurationGetIntersectionInstanceShaderBindingTableRecordOffset : public TestConfiguration
+                       {
+                       public:
+                               static const std::string                                        getShaderBodyTextCandidate(const TestParams& testParams);
+                               static const std::string                                        getShaderBodyTextCommitted(const TestParams& testParams);
+
+                               virtual const VkAccelerationStructureKHR* initAccelerationStructures(Context& context,
+                                       TestParams& testParams,
+                                       VkCommandBuffer                                 cmdBuffer) override;
+                       };
 
-const std::string TestConfigurationObjectToWorld::getShaderBodyText (const TestParams& testParams)
-{
-       if (testParams.geomType == GEOM_TYPE_AABBS)
-       {
-               const std::string result =
-                       "  const int   k        = " +de::toString(FIXED_POINT_DIVISOR) + ";\n"
-                       "  uint        rayFlags = 0;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  mat4x3      value    = mat4x3(-k);\n"
-                       "  const float t        = abs(float(pos.x * pos.y) / float (size.x * size.y));\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value -= mat4x3(k);\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
-                       "    {\n"
-                       "      value -= mat4x3(k);\n"
-                       "      rayQueryGenerateIntersectionEXT(rayQuery, t);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
-                       "        value = mat4x3(k * rayQueryGetIntersectionObjectToWorldEXT(rayQuery, true));\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  int ndx = -1;\n"
-                       "  for (int row = 0; row < 3; row++)\n"
-                       "  for (int col = 0; col < 4; col++)\n"
-                       "  {\n"
-                       "    ndx++;\n"
-                       "    ivec3 p = ivec3(pos.xy, ndx);\n"
-                       "    float r = value[col][row];\n"
-                       "    ivec4 c = ivec4(int(r),0,0,1);\n"
-                       "    imageStore(result, p, c);\n"
-                       "  }\n";
-
-               return result;
-       }
-       else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
-       {
-               const std::string result =
-                       "  const int   k        = " +de::toString(FIXED_POINT_DIVISOR) + ";\n"
-                       "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  mat4x3      value    = mat4x3(-k);\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value -= mat4x3(k);\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
-                       "    {\n"
-                       "      value -= mat4x3(k);\n"
-                       "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
-                       "        value = mat4x3(k * rayQueryGetIntersectionObjectToWorldEXT(rayQuery, true));\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  int ndx = -1;\n"
-                       "  for (int row = 0; row < 3; row++)\n"
-                       "  for (int col = 0; col < 4; col++)\n"
-                       "  {\n"
-                       "    ndx++;\n"
-                       "    ivec3 p = ivec3(pos.xy, ndx);\n"
-                       "    float r = value[col][row];\n"
-                       "    ivec4 c = ivec4(int(r),0,0,1);\n"
-                       "    imageStore(result, p, c);\n"
-                       "  }\n";
-
-               return result;
-       }
-       else
-       {
-               TCU_THROW(InternalError, "Unknown geometry type");
-       }
-}
+                       const VkAccelerationStructureKHR* TestConfigurationGetIntersectionInstanceShaderBindingTableRecordOffset::initAccelerationStructures(Context& context, TestParams& testParams, VkCommandBuffer cmdBuffer)
+                       {
+                               const DeviceInterface& vkd = context.getDeviceInterface();
+                               const VkDevice                                                          device = context.getDevice();
+                               Allocator& allocator = context.getDefaultAllocator();
+                               const deUint32                                                          width = testParams.width;
+                               const deUint32                                                          height = testParams.height;
+                               const deUint32                                                          instancesGroupCount = testParams.instancesGroupCount;
+                               const deUint32                                                          geometriesGroupCount = testParams.geometriesGroupCount;
+                               const deUint32                                                          squaresGroupCount = testParams.squaresGroupCount;
+                               deUint32                                                                        squareNdx = 0;
+                               de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure = makeTopLevelAccelerationStructure();
 
-class TestConfigurationWorldToObject : public TestConfigurationMatrix
-{
-public:
-       static const std::string                                        getShaderBodyText                       (const TestParams&                                      testParams);
+                               DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
 
-       virtual const VkAccelerationStructureKHR*       initAccelerationStructures      (Context&                                                       context,
-                                                                                                                                                        TestParams&                                            testParams,
-                                                                                                                                                        VkCommandBuffer                                        cmdBuffer) override;
-};
+                               m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
 
-const VkAccelerationStructureKHR* TestConfigurationWorldToObject::initAccelerationStructures (Context&                 context,
-                                                                                                                                                                                         TestParams&           testParams,
-                                                                                                                                                                                         VkCommandBuffer       cmdBuffer)
-{
-       const DeviceInterface&                                          vkd                                                                             = context.getDeviceInterface();
-       const VkDevice                                                          device                                                                  = context.getDevice();
-       Allocator&                                                                      allocator                                                               = context.getDefaultAllocator();
-       const deUint32                                                          width                                                                   = testParams.width;
-       const deUint32                                                          height                                                                  = testParams.height;
-       const bool                                                                      triangles                                                               = (testParams.geomType == GEOM_TYPE_TRIANGLES);
-       const deUint32                                                          instancesGroupCount                                             = testParams.instancesGroupCount;
-       const deUint32                                                          geometriesGroupCount                                    = testParams.geometriesGroupCount;
-       const deUint32                                                          squaresGroupCount                                               = testParams.squaresGroupCount;
-       const float                                                                     z                                                                               = -1.0f;
-       tcu::UVec2                                                                      startPos                                                                = tcu::UVec2(0, 0);
-       de::MovePtr<TopLevelAccelerationStructure>      rayQueryTopLevelAccelerationStructure   = makeTopLevelAccelerationStructure();
-
-       DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == width * height);
-
-       m_topAccelerationStructure = de::SharedPtr<TopLevelAccelerationStructure>(rayQueryTopLevelAccelerationStructure.release());
-
-       m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
-
-       for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
-       {
-               de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure        = makeBottomLevelAccelerationStructure();
-               VkTransformMatrixKHR                                                    transform                                                                       = identityMatrix3x4;
+                               m_topAccelerationStructure->setInstanceCount(instancesGroupCount);
 
-               transform.matrix[0][3] = (1.0f / 8.0f) / float(width);
-               transform.matrix[1][3] = (1.0f / 16.0f) / float(height);
+                               m_expected.resize(width * height);
 
-               for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
-               {
-                       std::vector<tcu::Vec3>  geometryData;
+                               for (deUint32 instanceNdx = 0; instanceNdx < instancesGroupCount; ++instanceNdx)
+                               {
+                                       for (deUint32 geometryNdx = 0; geometryNdx < geometriesGroupCount; ++geometryNdx)
+                                       {
+                                               for (deUint32 groupNdx = 0; groupNdx < squaresGroupCount; ++groupNdx, ++squareNdx)
+                                               {
+                                                       de::MovePtr<BottomLevelAccelerationStructure>   rayQueryBottomLevelAccelerationStructure = makeBottomLevelAccelerationStructure();
+                                                       std::vector<tcu::Vec3>                                                  geometryData;
+
+                                                       const auto      squareX = (squareNdx % width);
+                                                       const auto      squareY = (squareNdx / width);
+
+                                                       const float x0 = float(squareX + 0) / float(width);
+                                                       const float y0 = float(squareY + 0) / float(height);
+                                                       const float x1 = float(squareX + 1) / float(width);
+                                                       const float y1 = float(squareY + 1) / float(height);
+
+                                                       if ((squareNdx % 2) == 0)
+                                                       {
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                       }
+                                                       else
+                                                       {
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y1, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+
+                                                               geometryData.push_back(tcu::Vec3(x0, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y0, 0.0));
+                                                               geometryData.push_back(tcu::Vec3(x1, y1, 0.0));
+                                                       }
+
+                                                       m_expected.at(squareNdx) = ((1 << 24) - 1) / static_cast<deUint32>(m_expected.size()) * squareNdx;
+
+                                                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, true /* triangles */);
+
+                                                       rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
+                                                       m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
+
+                                                       m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), identityMatrix3x4, instanceNdx + 1, 255U, m_expected.at(squareNdx));
+                                               }
+                                       }
+                               }
 
-                       geometryData.reserve(squaresGroupCount * (triangles ? 3u : 2u));
+                               m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
 
-                       for (deUint32 squareNdx = 0; squareNdx < squaresGroupCount; ++squareNdx)
-                       {
-                               const deUint32  n       = width * startPos.y() + startPos.x();
-                               const deUint32  m       = (n + 11) % (width * height);
-                               const float             x0      = float(startPos.x() + 0) / float(width);
-                               const float             y0      = float(startPos.y() + 0) / float(height);
-                               const float             x1      = float(startPos.x() + 1) / float(width);
-                               const float             y1      = float(startPos.y() + 1) / float(height);
+                               return m_topAccelerationStructure.get()->getPtr();
+                       }
 
-                               if (triangles)
+                       const std::string TestConfigurationGetIntersectionInstanceShaderBindingTableRecordOffset::getShaderBodyTextCandidate(const TestParams& testParams)
+                       {
+                               if (testParams.geomType == GEOM_TYPE_AABBS ||
+                                       testParams.geomType == GEOM_TYPE_TRIANGLES)
                                {
-                                       const float     xm      = (x0 + x1) / 2.0f;
-                                       const float     ym      = (y0 + y1) / 2.0f;
-
-                                       geometryData.push_back(tcu::Vec3(x0, y0, z));
-                                       geometryData.push_back(tcu::Vec3(xm, y1, z));
-                                       geometryData.push_back(tcu::Vec3(x1, ym, z));
+                                       const std::string result =
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0001;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y),  0.2);\n"
+                                               "  vec3        direct   = vec3(0,                                                                         0,                                                                 -1.0);\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  int result_i32 = 2;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  while (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "      result_i32 = int(rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, false) );\n"
+                                               "\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(result_i32, 0, 0, 0));\n";
+
+                                       return result;
                                }
                                else
                                {
-                                       geometryData.push_back(tcu::Vec3(x0, y0, z));
-                                       geometryData.push_back(tcu::Vec3(x1, y1, z * 0.9f));
+                                       TCU_THROW(InternalError, "Unknown geometry type");
                                }
-
-                               startPos.y() = m / width;
-                               startPos.x() = m % width;
                        }
 
-                       rayQueryBottomLevelAccelerationStructure->addGeometry(geometryData, triangles);
-               }
-
-               rayQueryBottomLevelAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
-               m_bottomAccelerationStructures.push_back(de::SharedPtr<BottomLevelAccelerationStructure>(rayQueryBottomLevelAccelerationStructure.release()));
-               m_topAccelerationStructure->addInstance(m_bottomAccelerationStructures.back(), transform);
-       }
-
-       m_topAccelerationStructure->createAndBuild(vkd, device, cmdBuffer, allocator);
-
-       {
-               const deUint32                                                  imageDepth                              = 4 * 4;
-               const int                                                               translateColumnNumber   = 3;
-               const deUint32                                                  colCount                                = 4;
-               const deUint32                                                  rowCount                                = 3;
-               const deUint32                                                  zStride                                 = height * width;
-               const deUint32                                                  expectedFloats                  = imageDepth * zStride;
-               const float                                                             translateX                              = (-1.0f / 8.0f) / float(width);
-               const float                                                             translateY                              = (-1.0f / 16.0f) / float(height);
-               tcu::Matrix<float, rowCount, colCount>  m;
-
-               m[translateColumnNumber][0] = translateX;
-               m[translateColumnNumber][1] = translateY;
-
-               m_expected.resize(expectedFloats);
-
-               for (deUint32 y = 0; y < height; ++y)
-               {
-                       for (deUint32 x = 0; x < width; ++x)
+                       const std::string TestConfigurationGetIntersectionInstanceShaderBindingTableRecordOffset::getShaderBodyTextCommitted(const TestParams& testParams)
                        {
-                               const deUint32  elem0Pos        = x + width * y;
-
-                               for (deUint32 rowNdx = 0; rowNdx < rowCount; ++rowNdx)
-                               for (deUint32 colNdx = 0; colNdx < colCount; ++colNdx)
+                               if (testParams.geomType == GEOM_TYPE_AABBS ||
+                                       testParams.geomType == GEOM_TYPE_TRIANGLES)
                                {
-                                       const deUint32  zNdx    = rowNdx * colCount + colNdx;
-                                       const deUint32  posNdx  = elem0Pos + zStride * zNdx;
-
-                                       m_expected[posNdx] = static_cast<deInt32>(FIXED_POINT_DIVISOR * m[colNdx][rowNdx]);
+                                       const std::string result =
+                                               "  uint        rayFlags = 0;\n"
+                                               "  uint        cullMask = 0xFF;\n"
+                                               "  float       tmin     = 0.0001;\n"
+                                               "  float       tmax     = 9.0;\n"
+                                               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y),  0.2);\n"
+                                               "  vec3        direct   = vec3(0,                                                                         0,                                                                 -1.0);\n"
+                                               "  rayQueryEXT rayQuery;\n"
+                                               "\n"
+                                               "  bool intersection_found = false;\n"
+                                               "  int  result_i32         = 0;\n"
+                                               "\n"
+                                               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
+                                               "\n"
+                                               "  while (rayQueryProceedEXT(rayQuery))\n"
+                                               "  {\n"
+                                               "      intersection_found = true;\n"
+                                               "\n"
+                                               "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
+                                               "  }\n"
+                                               "\n"
+                                               "  result_i32 = (intersection_found) ? int(rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, true) )\n"
+                                               "                                                                        : 2;\n"
+                                               "\n"
+                                               "  imageStore(result, pos, ivec4(result_i32, 0, 0, 0));\n";
+
+                                       return result;
+                               }
+                               else
+                               {
+                                       TCU_THROW(InternalError, "Unknown geometry type");
                                }
                        }
-               }
-       }
-
-       return m_topAccelerationStructure.get()->getPtr();
-}
+                       /// </summary>
 
-const std::string TestConfigurationWorldToObject::getShaderBodyText (const TestParams& testParams)
-{
-       if (testParams.geomType == GEOM_TYPE_AABBS)
-       {
-               const std::string result =
-                       "  const int   k        = " +de::toString(FIXED_POINT_DIVISOR) + ";\n"
-                       "  uint        rayFlags = 0;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  mat4x3      value    = mat4x3(-k);\n"
-                       "  const float t        = abs(float(pos.x * pos.y) / float (size.x * size.y));\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value -= mat4x3(k);\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionAABBEXT)\n"
-                       "    {\n"
-                       "      value -= mat4x3(k);\n"
-                       "      rayQueryGenerateIntersectionEXT(rayQuery, t);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionGeneratedEXT)\n"
-                       "        value = mat4x3(k * rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true));\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  int ndx = -1;\n"
-                       "  for (int row = 0; row < 3; row++)\n"
-                       "  for (int col = 0; col < 4; col++)\n"
-                       "  {\n"
-                       "    ndx++;\n"
-                       "    ivec3 p = ivec3(pos.xy, ndx);\n"
-                       "    float r = value[col][row];\n"
-                       "    ivec4 c = ivec4(int(r),0,0,1);\n"
-                       "    imageStore(result, p, c);\n"
-                       "  }\n";
-
-               return result;
-       }
-       else if (testParams.geomType == GEOM_TYPE_TRIANGLES)
-       {
-               const std::string result =
-                       "  const int   k        = " +de::toString(FIXED_POINT_DIVISOR) + ";\n"
-                       "  uint        rayFlags = gl_RayFlagsNoOpaqueEXT;\n"
-                       "  uint        cullMask = 0xFF;\n"
-                       "  float       tmin     = 0.0;\n"
-                       "  float       tmax     = 9.0;\n"
-                       "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-                       "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-                       "  mat4x3      value    = mat4x3(-k);\n"
-                       "  rayQueryEXT rayQuery;\n"
-                       "\n"
-                       "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-                       "\n"
-                       "  if (rayQueryProceedEXT(rayQuery))\n"
-                       "  {\n"
-                       "    value -= mat4x3(k);\n"
-                       "    if (rayQueryGetIntersectionTypeEXT(rayQuery, false) == gl_RayQueryCandidateIntersectionTriangleEXT)\n"
-                       "    {\n"
-                       "      value -= mat4x3(k);\n"
-                       "      rayQueryConfirmIntersectionEXT(rayQuery);\n"
-                       "\n"
-                       "      rayQueryProceedEXT(rayQuery);\n"
-                       "\n"
-                       "      if (rayQueryGetIntersectionTypeEXT(rayQuery, true) == gl_RayQueryCommittedIntersectionTriangleEXT)\n"
-                       "        value = mat4x3(k * rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true));\n"
-                       "    }\n"
-                       "  }\n"
-                       "\n"
-                       "  int ndx = -1;\n"
-                       "  for (int row = 0; row < 3; row++)\n"
-                       "  for (int col = 0; col < 4; col++)\n"
-                       "  {\n"
-                       "    ndx++;\n"
-                       "    ivec3 p = ivec3(pos.xy, ndx);\n"
-                       "    float r = value[col][row];\n"
-                       "    ivec4 c = ivec4(int(r),0,0,1);\n"
-                       "    imageStore(result, p, c);\n"
-                       "  }\n";
-
-               return result;
-       }
-       else
-       {
-               TCU_THROW(InternalError, "Unknown geometry type");
-       }
-}
+                       class RayQueryBuiltinTestInstance : public TestInstance
+                       {
+                       public:
+                               RayQueryBuiltinTestInstance(Context& context, const TestParams& data);
+                               virtual                                                         ~RayQueryBuiltinTestInstance(void);
+                               tcu::TestStatus                                         iterate(void);
+
+                       private:
+                               TestParams                                                      m_data;
+                               de::MovePtr<TestConfiguration>          m_testConfig;
+                               de::MovePtr<PipelineConfiguration>      m_pipelineConfig;
+                       };
+
+                       RayQueryBuiltinTestInstance::RayQueryBuiltinTestInstance(Context& context, const TestParams& data)
+                               : vkt::TestInstance(context)
+                               , m_data(data)
+                       {
+                               switch (m_data.testType)
+                               {
+                               case TEST_TYPE_FLOW:                                                                                                                                    m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationFlow());                                                                                                             break;
+                               case TEST_TYPE_PRIMITIVE_ID:                                                                                                                    m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationPrimitiveId());                                                                                              break;
+                               case TEST_TYPE_INSTANCE_ID:                                                                                                                             m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationInstanceId());                                                                                               break;
+                               case TEST_TYPE_INSTANCE_CUSTOM_INDEX:                                                                                                   m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationInstanceCustomIndex());                                                                              break;
+                               case TEST_TYPE_INTERSECTION_T_KHR:                                                                                                              m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationIntersectionT());                                                                                    break;
+                               case TEST_TYPE_OBJECT_RAY_ORIGIN_KHR:                                                                                                   m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationObjectRayOrigin());                                                                                  break;
+                               case TEST_TYPE_OBJECT_RAY_DIRECTION_KHR:                                                                                                m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationObjectRayDirection());                                                                               break;
+                               case TEST_TYPE_OBJECT_TO_WORLD_KHR:                                                                                                             m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationObjectToWorld());                                                                                    break;
+                               case TEST_TYPE_WORLD_TO_OBJECT_KHR:                                                                                                             m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationWorldToObject());                                                                                    break;
+                               case TEST_TYPE_NULL_ACCELERATION_STRUCTURE:                                                                                             m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationNullASStruct());                                                                                             break;
+                               case TEST_TYPE_GET_RAY_TMIN:                                                                                                                    m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetRayTMin());                                                                                               break;
+                               case TEST_TYPE_GET_WORLD_RAY_ORIGIN:                                                                                                    m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetWorldRayOrigin());                                                                                break;
+                               case TEST_TYPE_GET_WORLD_RAY_DIRECTION:                                                                                                 m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetWorldRayDirection());                                                                             break;
+                               case TEST_TYPE_GET_INTERSECTION_CANDIDATE_AABB_OPAQUE:                                                                  m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionCandidateAABBOpaque());                                               break;
+                               case TEST_TYPE_GET_INTERSECTION_FRONT_FACE_CANDIDATE:                                                                   m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionFrontFace());                                                                 break;
+                               case TEST_TYPE_GET_INTERSECTION_FRONT_FACE_COMMITTED:                                                                   m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionFrontFace());                                                                 break;
+                               case TEST_TYPE_GET_INTERSECTION_GEOMETRY_INDEX_CANDIDATE:                                                               m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionGeometryIndex());                                                             break;
+                               case TEST_TYPE_GET_INTERSECTION_GEOMETRY_INDEX_COMMITTED:                                                               m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionGeometryIndex());                                                             break;
+                               case TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_CANDIDATE:                                                                 m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionBarycentrics());                                                              break;
+                               case TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_COMMITTED:                                                                 m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionBarycentrics());                                                              break;
+                               case TEST_TYPE_GET_INTERSECTION_INSTANCE_SHADER_BINDING_TABLE_RECORD_OFFSET_CANDIDATE:  m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionInstanceShaderBindingTableRecordOffset());    break;
+                               case TEST_TYPE_GET_INTERSECTION_INSTANCE_SHADER_BINDING_TABLE_RECORD_OFFSET_COMMITTED:  m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationGetIntersectionInstanceShaderBindingTableRecordOffset());    break;
+
+                               default: TCU_THROW(InternalError, "Unknown test type");
+                               }
 
-class TestConfigurationNullASStruct : public TestConfiguration
-{
-public:
-                                                                                               TestConfigurationNullASStruct           ();
-                                                                                               ~TestConfigurationNullASStruct          ();
-
-       static const std::string                                        getShaderBodyText                                       (const TestParams&                                      testParams);
-       static void                                                                     checkSupport                                            (Context&                                                       context,
-                                                                                                                                                                        const TestParams&                                      testParams);
-
-       virtual const VkAccelerationStructureKHR*       initAccelerationStructures                      (Context&                                                       context,
-                                                                                                                                                                        TestParams&                                            testParams,
-                                                                                                                                                                        VkCommandBuffer                                        cmdBuffer) override;
-protected:
-       Move<VkAccelerationStructureKHR>                        m_emptyAccelerationStructure;
-};
-
-TestConfigurationNullASStruct::TestConfigurationNullASStruct ()
-       : TestConfiguration                             ()
-       , m_emptyAccelerationStructure  ()
-{
-}
+                               switch (m_data.stage)
+                               {
+                               case VK_SHADER_STAGE_VERTEX_BIT:
+                               case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
+                               case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
+                               case VK_SHADER_STAGE_GEOMETRY_BIT:
+                               case VK_SHADER_STAGE_FRAGMENT_BIT:
+                               {
+                                       m_pipelineConfig = de::MovePtr<PipelineConfiguration>(new GraphicsConfiguration());
+                                       break;
+                               }
 
-TestConfigurationNullASStruct::~TestConfigurationNullASStruct ()
-{
-}
+                               case VK_SHADER_STAGE_COMPUTE_BIT:
+                               {
+                                       m_pipelineConfig = de::MovePtr<PipelineConfiguration>(new ComputeConfiguration());
+                                       break;
+                               }
 
-const VkAccelerationStructureKHR* TestConfigurationNullASStruct::initAccelerationStructures (Context&                  context,
-                                                                                                                                                                                        TestParams&            testParams,
-                                                                                                                                                                                        VkCommandBuffer        cmdBuffer)
-{
-       DE_UNREF(context);
-       DE_UNREF(cmdBuffer);
+                               case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
+                               case VK_SHADER_STAGE_ANY_HIT_BIT_KHR:
+                               case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
+                               case VK_SHADER_STAGE_MISS_BIT_KHR:
+                               case VK_SHADER_STAGE_INTERSECTION_BIT_KHR:
+                               case VK_SHADER_STAGE_CALLABLE_BIT_KHR:
+                               {
+                                       m_pipelineConfig = de::MovePtr<PipelineConfiguration>(new RayTracingConfiguration());
+                                       break;
+                               }
 
-       m_expected = std::vector<deInt32>(testParams.width * testParams.height, 1);
+                               default:
+                                       TCU_THROW(InternalError, "Unknown shader stage");
+                               }
+                       }
 
-       return &m_emptyAccelerationStructure.get();
-}
+                       RayQueryBuiltinTestInstance::~RayQueryBuiltinTestInstance(void)
+                       {
+                       }
 
-void TestConfigurationNullASStruct::checkSupport (Context&                     context,
-                                                                                                const TestParams&      testParams)
-{
-       DE_UNREF(testParams);
+                       tcu::TestStatus RayQueryBuiltinTestInstance::iterate (void)
+                       {
+                               const DeviceInterface&                          vkd                                                                     = m_context.getDeviceInterface();
+                               const VkDevice                                          device                                                          = m_context.getDevice();
+                               const VkQueue                                           queue                                                           = m_context.getUniversalQueue();
+                               Allocator&                                                      allocator                                                       = m_context.getDefaultAllocator();
+                               const deUint32                                          queueFamilyIndex                                        = m_context.getUniversalQueueFamilyIndex();
+
+                               const deUint32                                          width                                                           = m_data.width;
+                               const deUint32                                          height                                                          = m_data.height;
+                               const deUint32                                          depth                                                           = m_data.depth;
+                               const VkImageCreateInfo                         imageCreateInfo                                         = makeImageCreateInfo(m_data.format, width, height, depth);
+                               const VkImageSubresourceRange           imageSubresourceRange                           = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
+                               const de::MovePtr<ImageWithMemory>      image                                                           = de::MovePtr<ImageWithMemory>(new ImageWithMemory(vkd, device, allocator, imageCreateInfo, MemoryRequirement::Any));
+                               const Move<VkImageView>                         imageView                                                       = makeImageView(vkd, device, **image, VK_IMAGE_VIEW_TYPE_3D, m_data.format, imageSubresourceRange);
+
+                               const deUint32                                          pixelSize                                                       = mapVkFormat(m_data.format).getPixelSize();
+                               const VkBufferCreateInfo                        resultBufferCreateInfo                          = makeBufferCreateInfo(width * height * depth * pixelSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+                               const VkImageSubresourceLayers          resultBufferImageSubresourceLayers      = makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u);
+                               const VkBufferImageCopy                         resultBufferImageRegion                         = makeBufferImageCopy(makeExtent3D(width, height, depth), resultBufferImageSubresourceLayers);
+                               de::MovePtr<BufferWithMemory>           resultBuffer                                            = de::MovePtr<BufferWithMemory>(new BufferWithMemory(vkd, device, allocator, resultBufferCreateInfo, MemoryRequirement::HostVisible));
+
+                               const VkDescriptorImageInfo                     resultImageInfo                                         = makeDescriptorImageInfo(DE_NULL, *imageView, VK_IMAGE_LAYOUT_GENERAL);
+
+                               const Move<VkCommandPool>                       cmdPool                                                         = createCommandPool(vkd, device, 0, queueFamilyIndex);
+                               const Move<VkCommandBuffer>                     cmdBuffer                                                       = allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
+                               const VkAccelerationStructureKHR*       topAccelerationStructurePtr                     = DE_NULL;
+
+                               m_pipelineConfig->initConfiguration(m_context, m_data);
+
+                               beginCommandBuffer(vkd, *cmdBuffer, 0u);
+                               {
+                                       const VkImageMemoryBarrier      preImageBarrier                 = makeImageMemoryBarrier(0u, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, **image, imageSubresourceRange);
+                                       const VkClearValue                      clearValue                              = makeClearValueColorU32(0u, 0u, 0u, 0u);
+                                       const VkImageMemoryBarrier      postImageBarrier                = makeImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, **image, imageSubresourceRange);
+                                       const VkMemoryBarrier           postTestMemoryBarrier   = makeMemoryBarrier(VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT);
 
-       context.requireDeviceFunctionality("VK_EXT_robustness2");
+                                       cmdPipelineImageMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, &preImageBarrier);
+                                       vkd.cmdClearColorImage(*cmdBuffer, **image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearValue.color, 1, &imageSubresourceRange);
+                                       cmdPipelineImageMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, &postImageBarrier);
 
-       const vk::VkPhysicalDeviceRobustness2FeaturesEXT&       robustness2FeaturesEXT  = context.getRobustness2FeaturesEXT();
+                                       topAccelerationStructurePtr = m_testConfig->initAccelerationStructures(m_context, m_data, *cmdBuffer);
 
-       if (!robustness2FeaturesEXT.nullDescriptor)
-               TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceRobustness2FeaturesEXT::nullDescriptor");
-}
+                                       m_pipelineConfig->fillCommandBuffer(m_context, m_data, *cmdBuffer, topAccelerationStructurePtr, resultImageInfo);
 
-const std::string TestConfigurationNullASStruct::getShaderBodyText (const TestParams& testParams)
-{
-       DE_UNREF(testParams);
-
-       const std::string result =
-               "  uint        rayFlags = 0;\n"
-               "  uint        cullMask = 0xFF;\n"
-               "  float       tmin     = 0.0;\n"
-               "  float       tmax     = 9.0;\n"
-               "  vec3        origin   = vec3((float(pos.x) + 0.5f) / float(size.x), (float(pos.y) + 0.5f) / float(size.y), 0.0);\n"
-               "  vec3        direct   = vec3(0.0, 0.0, -1.0);\n"
-               "  uint        value    = 1;\n"
-               "  rayQueryEXT rayQuery;\n"
-               "\n"
-               "  rayQueryInitializeEXT(rayQuery, rayQueryTopLevelAccelerationStructure, rayFlags, cullMask, origin, tmin, direct, tmax);\n"
-               "\n"
-               "  if (rayQueryProceedEXT(rayQuery))\n"
-               "  {\n"
-               "    value++;\n"
-               "\n"
-               "    rayQueryTerminateEXT(rayQuery);\n"
-               "  }\n"
-               "\n"
-               "  imageStore(result, pos, ivec4(value, 0, 0, 0));\n";
-
-       return result;
-}
-
-class RayQueryBuiltinTestInstance : public TestInstance
-{
-public:
-                                                                               RayQueryBuiltinTestInstance             (Context& context, const TestParams& data);
-       virtual                                                         ~RayQueryBuiltinTestInstance    (void);
-       tcu::TestStatus                                         iterate                                                 (void);
-
-private:
-       TestParams                                                      m_data;
-       de::MovePtr<TestConfiguration>          m_testConfig;
-       de::MovePtr<PipelineConfiguration>      m_pipelineConfig;
-};
-
-RayQueryBuiltinTestInstance::RayQueryBuiltinTestInstance (Context& context, const TestParams& data)
-       : vkt::TestInstance             (context)
-       , m_data                                (data)
-{
-       switch (m_data.testType)
-       {
-               case TEST_TYPE_FLOW:                                            m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationFlow());                                     break;
-               case TEST_TYPE_PRIMITIVE_ID:                            m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationPrimitiveId());                      break;
-               case TEST_TYPE_INSTANCE_ID:                                     m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationInstanceId());                       break;
-               case TEST_TYPE_INSTANCE_CUSTOM_INDEX:           m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationInstanceCustomIndex());      break;
-               case TEST_TYPE_INTERSECTION_T_KHR:                      m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationIntersectionT());            break;
-               case TEST_TYPE_OBJECT_RAY_ORIGIN_KHR:           m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationObjectRayOrigin());          break;
-               case TEST_TYPE_OBJECT_RAY_DIRECTION_KHR:        m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationObjectRayDirection());       break;
-               case TEST_TYPE_OBJECT_TO_WORLD_KHR:                     m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationObjectToWorld());            break;
-               case TEST_TYPE_WORLD_TO_OBJECT_KHR:                     m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationWorldToObject());            break;
-               case TEST_TYPE_NULL_ACCELERATION_STRUCTURE:     m_testConfig = de::MovePtr<TestConfiguration>(new TestConfigurationNullASStruct());                     break;
-               default: TCU_THROW(InternalError, "Unknown test type");
-       }
-
-       switch (m_data.stage)
-       {
-               case VK_SHADER_STAGE_VERTEX_BIT:
-               case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
-               case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
-               case VK_SHADER_STAGE_GEOMETRY_BIT:
-               case VK_SHADER_STAGE_FRAGMENT_BIT:
-               {
-                       m_pipelineConfig = de::MovePtr<PipelineConfiguration>(new GraphicsConfiguration());
-                       break;
-               }
+                                       cmdPipelineMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, &postTestMemoryBarrier);
 
-               case VK_SHADER_STAGE_COMPUTE_BIT:
-               {
-                       m_pipelineConfig = de::MovePtr<PipelineConfiguration>(new ComputeConfiguration());
-                       break;
-               }
+                                       vkd.cmdCopyImageToBuffer(*cmdBuffer, **image, VK_IMAGE_LAYOUT_GENERAL, **resultBuffer, 1u, &resultBufferImageRegion);
+                               }
+                               endCommandBuffer(vkd, *cmdBuffer);
 
-               case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
-               case VK_SHADER_STAGE_ANY_HIT_BIT_KHR:
-               case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
-               case VK_SHADER_STAGE_MISS_BIT_KHR:
-               case VK_SHADER_STAGE_INTERSECTION_BIT_KHR:
-               case VK_SHADER_STAGE_CALLABLE_BIT_KHR:
-               {
-                       m_pipelineConfig = de::MovePtr<PipelineConfiguration>(new RayTracingConfiguration());
-                       break;
-               }
+                               submitCommandsAndWait(vkd, device, queue, cmdBuffer.get());
 
-               default:
-                       TCU_THROW(InternalError, "Unknown shader stage");
-       }
-}
+                               invalidateMappedMemoryRange(vkd, device, resultBuffer->getAllocation().getMemory(), resultBuffer->getAllocation().getOffset(), VK_WHOLE_SIZE);
 
-RayQueryBuiltinTestInstance::~RayQueryBuiltinTestInstance (void)
-{
-}
+                               if (m_testConfig->verify(resultBuffer.get(), m_context, m_data))
+                                       return tcu::TestStatus::pass("Pass");
+                               else
+                                       return tcu::TestStatus::fail("Fail");
+                       }
 
-tcu::TestStatus RayQueryBuiltinTestInstance::iterate (void)
-{
-       const DeviceInterface&                          vkd                                                                     = m_context.getDeviceInterface();
-       const VkDevice                                          device                                                          = m_context.getDevice();
-       const VkQueue                                           queue                                                           = m_context.getUniversalQueue();
-       Allocator&                                                      allocator                                                       = m_context.getDefaultAllocator();
-       const deUint32                                          queueFamilyIndex                                        = m_context.getUniversalQueueFamilyIndex();
-
-       const deUint32                                          width                                                           = m_data.width;
-       const deUint32                                          height                                                          = m_data.height;
-       const deUint32                                          depth                                                           = m_data.depth;
-       const VkImageCreateInfo                         imageCreateInfo                                         = makeImageCreateInfo(m_data.format, width, height, depth);
-       const VkImageSubresourceRange           imageSubresourceRange                           = makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, 0u, 1u);
-       const de::MovePtr<ImageWithMemory>      image                                                           = de::MovePtr<ImageWithMemory>(new ImageWithMemory(vkd, device, allocator, imageCreateInfo, MemoryRequirement::Any));
-       const Move<VkImageView>                         imageView                                                       = makeImageView(vkd, device, **image, VK_IMAGE_VIEW_TYPE_3D, m_data.format, imageSubresourceRange);
-
-       const deUint32                                          pixelSize                                                       = mapVkFormat(m_data.format).getPixelSize();
-       const VkBufferCreateInfo                        resultBufferCreateInfo                          = makeBufferCreateInfo(width * height * depth * pixelSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
-       const VkImageSubresourceLayers          resultBufferImageSubresourceLayers      = makeImageSubresourceLayers(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 0u, 1u);
-       const VkBufferImageCopy                         resultBufferImageRegion                         = makeBufferImageCopy(makeExtent3D(width, height, depth), resultBufferImageSubresourceLayers);
-       de::MovePtr<BufferWithMemory>           resultBuffer                                            = de::MovePtr<BufferWithMemory>(new BufferWithMemory(vkd, device, allocator, resultBufferCreateInfo, MemoryRequirement::HostVisible));
-
-       const VkDescriptorImageInfo                     resultImageInfo                                         = makeDescriptorImageInfo(DE_NULL, *imageView, VK_IMAGE_LAYOUT_GENERAL);
-
-       const Move<VkCommandPool>                       cmdPool                                                         = createCommandPool(vkd, device, 0, queueFamilyIndex);
-       const Move<VkCommandBuffer>                     cmdBuffer                                                       = allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY);
-       const VkAccelerationStructureKHR*       topAccelerationStructurePtr                     = DE_NULL;
-
-       m_pipelineConfig->initConfiguration(m_context, m_data);
-
-       beginCommandBuffer(vkd, *cmdBuffer, 0u);
-       {
-               const VkImageMemoryBarrier      preImageBarrier                 = makeImageMemoryBarrier(0u, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, **image, imageSubresourceRange);
-               const VkClearValue                      clearValue                              = makeClearValueColorU32(0u, 0u, 0u, 0u);
-               const VkImageMemoryBarrier      postImageBarrier                = makeImageMemoryBarrier(VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, **image, imageSubresourceRange);
-               const VkMemoryBarrier           postTestMemoryBarrier   = makeMemoryBarrier(VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT);
+                       class RayQueryBuiltinTestCase : public TestCase
+                       {
+                       public:
+                               RayQueryBuiltinTestCase(tcu::TestContext& context, const char* name, const char* desc, const TestParams data);
+                               ~RayQueryBuiltinTestCase(void);
 
-               cmdPipelineImageMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, &preImageBarrier);
-               vkd.cmdClearColorImage(*cmdBuffer, **image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearValue.color, 1, &imageSubresourceRange);
-               cmdPipelineImageMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, &postImageBarrier);
+                               virtual void                    checkSupport(Context& context) const;
+                               virtual void                    initPrograms(SourceCollections& programCollection) const;
+                               virtual TestInstance* createInstance(Context& context) const;
 
-               topAccelerationStructurePtr = m_testConfig->initAccelerationStructures(m_context, m_data, *cmdBuffer);
+                       private:
+                               TestParams                              m_data;
+                       };
 
-               m_pipelineConfig->fillCommandBuffer(m_context, m_data, *cmdBuffer, topAccelerationStructurePtr, resultImageInfo);
+                       RayQueryBuiltinTestCase::RayQueryBuiltinTestCase(tcu::TestContext& context, const char* name, const char* desc, const TestParams data)
+                               : vkt::TestCase(context, name, desc)
+                               , m_data(data)
+                       {
+                       }
 
-               cmdPipelineMemoryBarrier(vkd, *cmdBuffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, &postTestMemoryBarrier);
+                       RayQueryBuiltinTestCase::~RayQueryBuiltinTestCase(void)
+                       {
+                       }
 
-               vkd.cmdCopyImageToBuffer(*cmdBuffer, **image, VK_IMAGE_LAYOUT_GENERAL, **resultBuffer, 1u, &resultBufferImageRegion);
-       }
-       endCommandBuffer(vkd, *cmdBuffer);
+                       void RayQueryBuiltinTestCase::checkSupport(Context& context) const
+                       {
+                               context.requireDeviceFunctionality("VK_KHR_acceleration_structure");
+                               context.requireDeviceFunctionality("VK_KHR_ray_query");
 
-       submitCommandsAndWait(vkd, device, queue, cmdBuffer.get());
+                               const VkPhysicalDeviceRayQueryFeaturesKHR& rayQueryFeaturesKHR = context.getRayQueryFeatures();
+                               if (rayQueryFeaturesKHR.rayQuery == DE_FALSE)
+                                       TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceRayQueryFeaturesKHR.rayQuery");
 
-       invalidateMappedMemoryRange(vkd, device, resultBuffer->getAllocation().getMemory(), resultBuffer->getAllocation().getOffset(), VK_WHOLE_SIZE);
+                               const VkPhysicalDeviceAccelerationStructureFeaturesKHR& accelerationStructureFeaturesKHR = context.getAccelerationStructureFeatures();
+                               if (accelerationStructureFeaturesKHR.accelerationStructure == DE_FALSE)
+                                       TCU_THROW(TestError, "VK_KHR_ray_query requires VkPhysicalDeviceAccelerationStructureFeaturesKHR.accelerationStructure");
 
-       if (m_testConfig->verify(resultBuffer.get(), m_context, m_data))
-               return tcu::TestStatus::pass("Pass");
-       else
-               return tcu::TestStatus::fail("Fail");
-}
+                               m_data.pipelineCheckSupport(context, m_data);
 
-class RayQueryBuiltinTestCase : public TestCase
-{
-       public:
-                                                       RayQueryBuiltinTestCase         (tcu::TestContext& context, const char* name, const char* desc, const TestParams data);
-                                                       ~RayQueryBuiltinTestCase        (void);
+                               if (m_data.testConfigCheckSupport != DE_NULL)
+                                       m_data.testConfigCheckSupport(context, m_data);
+                       }
 
-       virtual void                    checkSupport                            (Context& context) const;
-       virtual void                    initPrograms                            (SourceCollections& programCollection) const;
-       virtual TestInstance*   createInstance                          (Context& context) const;
+                       TestInstance* RayQueryBuiltinTestCase::createInstance(Context& context) const
+                       {
+                               return new RayQueryBuiltinTestInstance(context, m_data);
+                       }
 
-private:
-       TestParams                              m_data;
-};
+                       void RayQueryBuiltinTestCase::initPrograms(SourceCollections& programCollection) const
+                       {
+                               m_data.pipelineInitPrograms(programCollection, m_data);
+                       }
 
-RayQueryBuiltinTestCase::RayQueryBuiltinTestCase (tcu::TestContext& context, const char* name, const char* desc, const TestParams data)
-       : vkt::TestCase (context, name, desc)
-       , m_data                (data)
-{
-}
+                       static inline CheckSupportFunc getPipelineCheckSupport(const VkShaderStageFlagBits stage)
+                       {
+                               switch (stage)
+                               {
+                               case VK_SHADER_STAGE_VERTEX_BIT:
+                               case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
+                               case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
+                               case VK_SHADER_STAGE_GEOMETRY_BIT:
+                               case VK_SHADER_STAGE_FRAGMENT_BIT:
+                                       return GraphicsConfiguration::checkSupport;
+
+                               case VK_SHADER_STAGE_COMPUTE_BIT:
+                                       return ComputeConfiguration::checkSupport;
+
+                               case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
+                               case VK_SHADER_STAGE_ANY_HIT_BIT_KHR:
+                               case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
+                               case VK_SHADER_STAGE_MISS_BIT_KHR:
+                               case VK_SHADER_STAGE_INTERSECTION_BIT_KHR:
+                               case VK_SHADER_STAGE_CALLABLE_BIT_KHR:
+                                       return RayTracingConfiguration::checkSupport;
+
+                               default:
+                                       TCU_THROW(InternalError, "Unknown shader stage");
+                               }
+                       }
 
-RayQueryBuiltinTestCase::~RayQueryBuiltinTestCase (void)
-{
-}
+                       static inline InitProgramsFunc getPipelineInitPrograms(const VkShaderStageFlagBits stage)
+                       {
+                               switch (stage)
+                               {
+                               case VK_SHADER_STAGE_VERTEX_BIT:
+                               case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
+                               case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
+                               case VK_SHADER_STAGE_GEOMETRY_BIT:
+                               case VK_SHADER_STAGE_FRAGMENT_BIT:
+                                       return GraphicsConfiguration::initPrograms;
+
+                               case VK_SHADER_STAGE_COMPUTE_BIT:
+                                       return ComputeConfiguration::initPrograms;
+
+                               case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
+                               case VK_SHADER_STAGE_ANY_HIT_BIT_KHR:
+                               case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
+                               case VK_SHADER_STAGE_MISS_BIT_KHR:
+                               case VK_SHADER_STAGE_INTERSECTION_BIT_KHR:
+                               case VK_SHADER_STAGE_CALLABLE_BIT_KHR:
+                                       return RayTracingConfiguration::initPrograms;
+
+                               default:
+                                       TCU_THROW(InternalError, "Unknown shader stage");
+                               }
+                       }
 
-void RayQueryBuiltinTestCase::checkSupport (Context& context) const
-{
-       context.requireDeviceFunctionality("VK_KHR_acceleration_structure");
-       context.requireDeviceFunctionality("VK_KHR_ray_query");
+                       static inline ShaderBodyTextFunc getShaderBodyTextFunc(const TestType testType)
+                       {
+                               switch (testType)
+                               {
+                               case TEST_TYPE_FLOW:                                                                                                                                    return TestConfigurationFlow::getShaderBodyText;                                                                                                                        break;
+                               case TEST_TYPE_PRIMITIVE_ID:                                                                                                                    return TestConfigurationPrimitiveId::getShaderBodyText;                                                                                                         break;
+                               case TEST_TYPE_INSTANCE_ID:                                                                                                                             return TestConfigurationInstanceId::getShaderBodyText;                                                                                                          break;
+                               case TEST_TYPE_INSTANCE_CUSTOM_INDEX:                                                                                                   return TestConfigurationInstanceCustomIndex::getShaderBodyText;                                                                                         break;
+                               case TEST_TYPE_INTERSECTION_T_KHR:                                                                                                              return TestConfigurationIntersectionT::getShaderBodyText;                                                                                                       break;
+                               case TEST_TYPE_OBJECT_RAY_ORIGIN_KHR:                                                                                                   return TestConfigurationObjectRayOrigin::getShaderBodyText;                                                                                                     break;
+                               case TEST_TYPE_OBJECT_RAY_DIRECTION_KHR:                                                                                                return TestConfigurationObjectRayDirection::getShaderBodyText;                                                                                          break;
+                               case TEST_TYPE_OBJECT_TO_WORLD_KHR:                                                                                                             return TestConfigurationObjectToWorld::getShaderBodyText;                                                                                                       break;
+                               case TEST_TYPE_WORLD_TO_OBJECT_KHR:                                                                                                             return TestConfigurationWorldToObject::getShaderBodyText;                                                                                                       break;
+                               case TEST_TYPE_NULL_ACCELERATION_STRUCTURE:                                                                                             return TestConfigurationNullASStruct::getShaderBodyText;                                                                                                        break;
+                               case TEST_TYPE_GET_RAY_TMIN:                                                                                                                    return TestConfigurationGetRayTMin::getShaderBodyText;                                                                                                          break;
+                               case TEST_TYPE_GET_WORLD_RAY_ORIGIN:                                                                                                    return TestConfigurationGetWorldRayOrigin::getShaderBodyText;                                                                                           break;
+                               case TEST_TYPE_GET_WORLD_RAY_DIRECTION:                                                                                                 return TestConfigurationGetWorldRayDirection::getShaderBodyText;                                                                                        break;
+                               case TEST_TYPE_GET_INTERSECTION_CANDIDATE_AABB_OPAQUE:                                                                  return TestConfigurationGetIntersectionCandidateAABBOpaque::getShaderBodyText;                                                          break;
+                               case TEST_TYPE_GET_INTERSECTION_FRONT_FACE_CANDIDATE:                                                                   return TestConfigurationGetIntersectionFrontFace::getShaderBodyTextCandidate;                                                           break;
+                               case TEST_TYPE_GET_INTERSECTION_FRONT_FACE_COMMITTED:                                                                   return TestConfigurationGetIntersectionFrontFace::getShaderBodyTextCommitted;                                                           break;
+                               case TEST_TYPE_GET_INTERSECTION_GEOMETRY_INDEX_CANDIDATE:                                                               return TestConfigurationGetIntersectionGeometryIndex::getShaderBodyTextCandidate;                                                       break;
+                               case TEST_TYPE_GET_INTERSECTION_GEOMETRY_INDEX_COMMITTED:                                                               return TestConfigurationGetIntersectionGeometryIndex::getShaderBodyTextCommitted;                                                       break;
+                               case TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_CANDIDATE:                                                                 return TestConfigurationGetIntersectionBarycentrics::getShaderBodyTextCandidate;                                                        break;
+                               case TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_COMMITTED:                                                                 return TestConfigurationGetIntersectionBarycentrics::getShaderBodyTextCommitted;                                                        break;
+                               case TEST_TYPE_GET_INTERSECTION_INSTANCE_SHADER_BINDING_TABLE_RECORD_OFFSET_CANDIDATE:  return TestConfigurationGetIntersectionInstanceShaderBindingTableRecordOffset::getShaderBodyTextCandidate;      break;
+                               case TEST_TYPE_GET_INTERSECTION_INSTANCE_SHADER_BINDING_TABLE_RECORD_OFFSET_COMMITTED:  return TestConfigurationGetIntersectionInstanceShaderBindingTableRecordOffset::getShaderBodyTextCommitted;      break;
+
+                               default:                                                                        TCU_THROW(InternalError, "Unknown test type");
+                               }
+                       }
 
-       const VkPhysicalDeviceRayQueryFeaturesKHR&                              rayQueryFeaturesKHR                                     = context.getRayQueryFeatures();
-       if (rayQueryFeaturesKHR.rayQuery == DE_FALSE)
-               TCU_THROW(NotSupportedError, "Requires VkPhysicalDeviceRayQueryFeaturesKHR.rayQuery");
+                       static inline CheckSupportFunc getTestConfigCheckSupport(const TestType testType)
+                       {
+                               if (testType >= TEST_TYPE_LAST)
+                                       TCU_THROW(InternalError, "Unknown test type");
 
-       const VkPhysicalDeviceAccelerationStructureFeaturesKHR& accelerationStructureFeaturesKHR        = context.getAccelerationStructureFeatures();
-       if (accelerationStructureFeaturesKHR.accelerationStructure == DE_FALSE)
-               TCU_THROW(TestError, "VK_KHR_ray_query requires VkPhysicalDeviceAccelerationStructureFeaturesKHR.accelerationStructure");
+                               switch (testType)
+                               {
+                               case TEST_TYPE_NULL_ACCELERATION_STRUCTURE:     return TestConfigurationNullASStruct::checkSupport;     break;
+                               default:                                                                        return DE_NULL;
+                               }
+                       }
 
-       m_data.pipelineCheckSupport(context, m_data);
+               }       // anonymous
 
-       if (m_data.testConfigCheckSupport != DE_NULL)
-               m_data.testConfigCheckSupport(context, m_data);
-}
+               const struct PipelineStages
+               {
+                       VkShaderStageFlagBits   stage;
+                       const char* name;
+               }
+               pipelineStages[] =
+               {
+                       { VK_SHADER_STAGE_VERTEX_BIT,                                   "vert"  },
+                       { VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,             "tesc"  },
+                       { VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,  "tese"  },
+                       { VK_SHADER_STAGE_GEOMETRY_BIT,                                 "geom"  },
+                       { VK_SHADER_STAGE_FRAGMENT_BIT,                                 "frag"  },
+                       { VK_SHADER_STAGE_COMPUTE_BIT,                                  "comp"  },
+                       { VK_SHADER_STAGE_RAYGEN_BIT_KHR,                               "rgen"  },
+                       { VK_SHADER_STAGE_ANY_HIT_BIT_KHR,                              "ahit"  },
+                       { VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR,                  "chit"  },
+                       { VK_SHADER_STAGE_MISS_BIT_KHR,                                 "miss"  },
+                       { VK_SHADER_STAGE_INTERSECTION_BIT_KHR,                 "sect"  },
+                       { VK_SHADER_STAGE_CALLABLE_BIT_KHR,                             "call"  },
+               };
+
+               const struct GeomTypes
+               {
+                       GeomType        geomType;
+                       const char* name;
+               }
+               geomTypes[] =
+               {
+                       { GEOM_TYPE_TRIANGLES,                                                  "triangles" },
+                       { GEOM_TYPE_AABBS,                                                              "aabbs" },
+               };
 
-TestInstance* RayQueryBuiltinTestCase::createInstance (Context& context) const
-{
-       return new RayQueryBuiltinTestInstance(context, m_data);
-}
+               tcu::TestCaseGroup* createBuiltinTests(tcu::TestContext& testCtx)
+               {
+                       de::MovePtr<tcu::TestCaseGroup>         group(new tcu::TestCaseGroup(testCtx, "builtin", "Tests verifying builtins provided by ray query"));
 
-void RayQueryBuiltinTestCase::initPrograms (SourceCollections& programCollection) const
-{
-       m_data.pipelineInitPrograms(programCollection, m_data);
-}
+                       const struct TestTypes
+                       {
+                               TestType        testType;
+                               const char* name;
+                       }
+                       testTypes[] =
+                       {
+                               { TEST_TYPE_FLOW,                                                                                                                                       "flow"                                                                                                                  },
+                               { TEST_TYPE_PRIMITIVE_ID,                                                                                                                       "primitiveid"                                                                                                   },
+                               { TEST_TYPE_INSTANCE_ID,                                                                                                                        "instanceid"                                                                                                    },
+                               { TEST_TYPE_INSTANCE_CUSTOM_INDEX,                                                                                                      "instancecustomindex"                                                                                   },
+                               { TEST_TYPE_INTERSECTION_T_KHR,                                                                                                         "intersectiont"                                                                                                 },
+                               { TEST_TYPE_OBJECT_RAY_ORIGIN_KHR,                                                                                                      "objectrayorigin"                                                                                               },
+                               { TEST_TYPE_OBJECT_RAY_DIRECTION_KHR,                                                                                           "objectraydirection"                                                                                    },
+                               { TEST_TYPE_OBJECT_TO_WORLD_KHR,                                                                                                        "objecttoworld"                                                                                                 },
+                               { TEST_TYPE_WORLD_TO_OBJECT_KHR,                                                                                                        "worldtoobject"                                                                                                 },
+                               { TEST_TYPE_GET_RAY_TMIN,                                                                                                                       "getraytmin"                                                                                                    },
+                               { TEST_TYPE_GET_WORLD_RAY_ORIGIN,                                                                                                       "getworldrayorigin"                                                                                             },
+                               { TEST_TYPE_GET_WORLD_RAY_DIRECTION,                                                                                            "getworldraydirection"                                                                                  },
+                               { TEST_TYPE_GET_INTERSECTION_CANDIDATE_AABB_OPAQUE,                                                                     "getintersectioncandidateaabbopaque"                                                    },
+                               { TEST_TYPE_GET_INTERSECTION_FRONT_FACE_CANDIDATE,                                                                      "getintersectionfrontfaceCandidate"                                                             },
+                               { TEST_TYPE_GET_INTERSECTION_FRONT_FACE_COMMITTED,                                                                      "getintersectionfrontfaceCommitted"                                                             },
+                               { TEST_TYPE_GET_INTERSECTION_GEOMETRY_INDEX_CANDIDATE,                                                          "getintersectiongeometryindexCandidate"                                                 },
+                               { TEST_TYPE_GET_INTERSECTION_GEOMETRY_INDEX_COMMITTED,                                                          "getintersectiongeometryindexCommitted"                                                 },
+                               { TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_CANDIDATE,                                                            "getintersectionbarycentricsCandidate"                                                  },
+                               { TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_COMMITTED,                                                            "getintersectionbarycentricsCommitted"                                                  },
+                               { TEST_TYPE_GET_INTERSECTION_INSTANCE_SHADER_BINDING_TABLE_RECORD_OFFSET_CANDIDATE,     "getintersectioninstanceshaderbindingtablerecordoffsetCandidate"},
+                               { TEST_TYPE_GET_INTERSECTION_INSTANCE_SHADER_BINDING_TABLE_RECORD_OFFSET_COMMITTED,     "getintersectioninstanceshaderbindingtablerecordoffsetCommitted"},
+                       };
+
+                       for (size_t testTypeNdx = 0; testTypeNdx < DE_LENGTH_OF_ARRAY(testTypes); ++testTypeNdx)
+                       {
+                               de::MovePtr<tcu::TestCaseGroup> testTypeGroup(new tcu::TestCaseGroup(group->getTestContext(), testTypes[testTypeNdx].name, ""));
+                               const TestType                                  testType = testTypes[testTypeNdx].testType;
+                               const ShaderBodyTextFunc                testConfigShaderBodyTextFunc = getShaderBodyTextFunc(testType);
+                               const bool                                              fixedPointVectorOutput = testType == TEST_TYPE_OBJECT_RAY_ORIGIN_KHR
+                                       || testType == TEST_TYPE_OBJECT_RAY_DIRECTION_KHR
+                                       || testType == TEST_TYPE_GET_WORLD_RAY_ORIGIN
+                                       || testType == TEST_TYPE_GET_WORLD_RAY_DIRECTION
+                                       || testType == TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_CANDIDATE
+                                       || testType == TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_COMMITTED
+                                       || testType == TEST_TYPE_GET_INTERSECTION_INSTANCE_SHADER_BINDING_TABLE_RECORD_OFFSET_CANDIDATE
+                                       || testType == TEST_TYPE_GET_INTERSECTION_INSTANCE_SHADER_BINDING_TABLE_RECORD_OFFSET_COMMITTED;
+                               const bool                                              fixedPointMatrixOutput = testType == TEST_TYPE_OBJECT_TO_WORLD_KHR
+                                       || testType == TEST_TYPE_WORLD_TO_OBJECT_KHR;
+                               const bool                                              single = testTypeNdx == TEST_TYPE_FLOW
+                                       || testType == TEST_TYPE_OBJECT_RAY_ORIGIN_KHR
+                                       || testType == TEST_TYPE_OBJECT_RAY_DIRECTION_KHR
+                                       || testType == TEST_TYPE_OBJECT_TO_WORLD_KHR
+                                       || testType == TEST_TYPE_WORLD_TO_OBJECT_KHR
+                                       || testType == TEST_TYPE_GET_RAY_TMIN
+                                       || testType == TEST_TYPE_GET_WORLD_RAY_ORIGIN
+                                       || testType == TEST_TYPE_GET_WORLD_RAY_DIRECTION
+                                       || testType == TEST_TYPE_GET_INTERSECTION_CANDIDATE_AABB_OPAQUE
+                                       || testType == TEST_TYPE_GET_INTERSECTION_FRONT_FACE_CANDIDATE
+                                       || testType == TEST_TYPE_GET_INTERSECTION_FRONT_FACE_COMMITTED
+                                       || testType == TEST_TYPE_GET_INTERSECTION_GEOMETRY_INDEX_CANDIDATE
+                                       || testType == TEST_TYPE_GET_INTERSECTION_GEOMETRY_INDEX_COMMITTED
+                                       || testType == TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_CANDIDATE
+                                       || testType == TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_COMMITTED;
+                               const deUint32                                  imageDepth = fixedPointMatrixOutput ? 4 * 4
+                                       : fixedPointVectorOutput ? 4
+                                       : 1;
+
+                               for (size_t pipelineStageNdx = 0; pipelineStageNdx < DE_LENGTH_OF_ARRAY(pipelineStages); ++pipelineStageNdx)
+                               {
+                                       de::MovePtr<tcu::TestCaseGroup> sourceTypeGroup(new tcu::TestCaseGroup(group->getTestContext(), pipelineStages[pipelineStageNdx].name, ""));
+                                       const VkShaderStageFlagBits             stage = pipelineStages[pipelineStageNdx].stage;
+                                       const CheckSupportFunc                  pipelineCheckSupport = getPipelineCheckSupport(stage);
+                                       const InitProgramsFunc                  pipelineInitPrograms = getPipelineInitPrograms(stage);
+                                       const deUint32                                  instancesGroupCount = single ? 1 : 2;
+                                       const deUint32                                  geometriesGroupCount = single ? 1 : 8;
+                                       const deUint32                                  squaresGroupCount = (TEST_WIDTH * TEST_HEIGHT) / geometriesGroupCount / instancesGroupCount;
 
-static inline CheckSupportFunc getPipelineCheckSupport (const VkShaderStageFlagBits stage)
-{
-       switch (stage)
-       {
-               case VK_SHADER_STAGE_VERTEX_BIT:
-               case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
-               case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
-               case VK_SHADER_STAGE_GEOMETRY_BIT:
-               case VK_SHADER_STAGE_FRAGMENT_BIT:
-                       return GraphicsConfiguration::checkSupport;
-
-               case VK_SHADER_STAGE_COMPUTE_BIT:
-                       return ComputeConfiguration::checkSupport;
-
-               case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
-               case VK_SHADER_STAGE_ANY_HIT_BIT_KHR:
-               case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
-               case VK_SHADER_STAGE_MISS_BIT_KHR:
-               case VK_SHADER_STAGE_INTERSECTION_BIT_KHR:
-               case VK_SHADER_STAGE_CALLABLE_BIT_KHR:
-                       return RayTracingConfiguration::checkSupport;
-
-               default:
-                       TCU_THROW(InternalError, "Unknown shader stage");
-       }
-}
-
-static inline InitProgramsFunc getPipelineInitPrograms (const VkShaderStageFlagBits stage)
-{
-       switch (stage)
-       {
-               case VK_SHADER_STAGE_VERTEX_BIT:
-               case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
-               case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
-               case VK_SHADER_STAGE_GEOMETRY_BIT:
-               case VK_SHADER_STAGE_FRAGMENT_BIT:
-                       return GraphicsConfiguration::initPrograms;
-
-               case VK_SHADER_STAGE_COMPUTE_BIT:
-                       return ComputeConfiguration::initPrograms;
-
-               case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
-               case VK_SHADER_STAGE_ANY_HIT_BIT_KHR:
-               case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
-               case VK_SHADER_STAGE_MISS_BIT_KHR:
-               case VK_SHADER_STAGE_INTERSECTION_BIT_KHR:
-               case VK_SHADER_STAGE_CALLABLE_BIT_KHR:
-                       return RayTracingConfiguration::initPrograms;
-
-               default:
-                       TCU_THROW(InternalError, "Unknown shader stage");
-       }
-}
-
-static inline ShaderBodyTextFunc getShaderBodyTextFunc (const TestType testType)
-{
-       switch (testType)
-       {
-               case TEST_TYPE_FLOW:                                            return TestConfigurationFlow::getShaderBodyText;                                break;
-               case TEST_TYPE_PRIMITIVE_ID:                            return TestConfigurationPrimitiveId::getShaderBodyText;                 break;
-               case TEST_TYPE_INSTANCE_ID:                                     return TestConfigurationInstanceId::getShaderBodyText;                  break;
-               case TEST_TYPE_INSTANCE_CUSTOM_INDEX:           return TestConfigurationInstanceCustomIndex::getShaderBodyText; break;
-               case TEST_TYPE_INTERSECTION_T_KHR:                      return TestConfigurationIntersectionT::getShaderBodyText;               break;
-               case TEST_TYPE_OBJECT_RAY_ORIGIN_KHR:           return TestConfigurationObjectRayOrigin::getShaderBodyText;             break;
-               case TEST_TYPE_OBJECT_RAY_DIRECTION_KHR:        return TestConfigurationObjectRayDirection::getShaderBodyText;  break;
-               case TEST_TYPE_OBJECT_TO_WORLD_KHR:                     return TestConfigurationObjectToWorld::getShaderBodyText;               break;
-               case TEST_TYPE_WORLD_TO_OBJECT_KHR:                     return TestConfigurationWorldToObject::getShaderBodyText;               break;
-               case TEST_TYPE_NULL_ACCELERATION_STRUCTURE:     return TestConfigurationNullASStruct::getShaderBodyText;                break;
-               default:                                                                        TCU_THROW(InternalError, "Unknown test type");
-       }
-}
-
-static inline CheckSupportFunc getTestConfigCheckSupport (const TestType testType)
-{
-       if (testType >= TEST_TYPE_LAST)
-               TCU_THROW(InternalError, "Unknown test type");
+                                       DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == TEST_WIDTH * TEST_HEIGHT);
 
-       switch (testType)
-       {
-               case TEST_TYPE_NULL_ACCELERATION_STRUCTURE:     return TestConfigurationNullASStruct::checkSupport;     break;
-               default:                                                                        return DE_NULL;
-       }
-}
+                                       for (size_t geomTypeNdx = 0; geomTypeNdx < DE_LENGTH_OF_ARRAY(geomTypes); ++geomTypeNdx)
+                                       {
+                                               const GeomType          geomType = geomTypes[geomTypeNdx].geomType;
+                                               const TestParams        testParams =
+                                               {
+                                                       TEST_WIDTH,                                             //  deUint32                            width;
+                                                       TEST_HEIGHT,                                    //  deUint32                            height;
+                                                       imageDepth,                                             //  deUint32                            depth;
+                                                       testType,                                               //  TestType                            testType;
+                                                       stage,                                                  //  VkShaderStageFlagBits       stage;
+                                                       geomType,                                               //  GeomType                            geomType;
+                                                       squaresGroupCount,                              //  deUint32                            squaresGroupCount;
+                                                       geometriesGroupCount,                   //  deUint32                            geometriesGroupCount;
+                                                       instancesGroupCount,                    //  deUint32                            instancesGroupCount;
+                                                       VK_FORMAT_R32_SINT,                             //  VkFormat                            format;
+                                                       pipelineCheckSupport,                   //  CheckSupportFunc            pipelineCheckSupport;
+                                                       pipelineInitPrograms,                   //  InitProgramsFunc            pipelineInitPrograms;
+                                                       testConfigShaderBodyTextFunc,   //  ShaderTestTextFunc          testConfigShaderBodyText;
+                                                       DE_NULL,                                                //  CheckSupportFunc            testConfigCheckSupport;
+                                               };
+
+                                               if (geomType != GEOM_TYPE_AABBS &&
+                                                       testType == TEST_TYPE_GET_INTERSECTION_CANDIDATE_AABB_OPAQUE)
+                                               {
+                                                       continue;
+                                               }
+
+                                               if (geomType != GEOM_TYPE_TRIANGLES &&
+                                                       (testType == TEST_TYPE_GET_INTERSECTION_FRONT_FACE_CANDIDATE ||
+                                                               testType == TEST_TYPE_GET_INTERSECTION_FRONT_FACE_COMMITTED ||
+                                                               testType == TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_CANDIDATE ||
+                                                               testType == TEST_TYPE_GET_INTERSECTION_BARYCENTRICS_COMMITTED))
+                                               {
+                                                       continue;
+                                               }
+
+                                               sourceTypeGroup->addChild(new RayQueryBuiltinTestCase(group->getTestContext(), geomTypes[geomTypeNdx].name, "", testParams));
+                                       }
 
-}      // anonymous
+                                       testTypeGroup->addChild(sourceTypeGroup.release());
+                               }
 
-const struct PipelineStages
-{
-       VkShaderStageFlagBits   stage;
-       const char*                             name;
-}
-pipelineStages[] =
-{
-       { VK_SHADER_STAGE_VERTEX_BIT,                                   "vert"  },
-       { VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,             "tesc"  },
-       { VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,  "tese"  },
-       { VK_SHADER_STAGE_GEOMETRY_BIT,                                 "geom"  },
-       { VK_SHADER_STAGE_FRAGMENT_BIT,                                 "frag"  },
-       { VK_SHADER_STAGE_COMPUTE_BIT,                                  "comp"  },
-       { VK_SHADER_STAGE_RAYGEN_BIT_KHR,                               "rgen"  },
-       { VK_SHADER_STAGE_ANY_HIT_BIT_KHR,                              "ahit"  },
-       { VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR,                  "chit"  },
-       { VK_SHADER_STAGE_MISS_BIT_KHR,                                 "miss"  },
-       { VK_SHADER_STAGE_INTERSECTION_BIT_KHR,                 "sect"  },
-       { VK_SHADER_STAGE_CALLABLE_BIT_KHR,                             "call"  },
-};
-
-const struct GeomTypes
-{
-       GeomType        geomType;
-       const char*     name;
-}
-geomTypes[] =
-{
-       { GEOM_TYPE_TRIANGLES,                                                  "triangles" },
-       { GEOM_TYPE_AABBS,                                                              "aabbs" },
-};
+                               group->addChild(testTypeGroup.release());
+                       }
 
-tcu::TestCaseGroup*    createBuiltinTests      (tcu::TestContext& testCtx)
-{
-       de::MovePtr<tcu::TestCaseGroup>         group   (new tcu::TestCaseGroup(testCtx, "builtin", "Tests verifying builtins provided by ray query"));
+                       return group.release();
+               }
 
-       const struct TestTypes
-       {
-               TestType        testType;
-               const char*     name;
-       }
-       testTypes[] =
-       {
-               { TEST_TYPE_FLOW,                                                               "flow"                                  },
-               { TEST_TYPE_PRIMITIVE_ID,                                               "primitiveid"                   },
-               { TEST_TYPE_INSTANCE_ID,                                                "instanceid"                    },
-               { TEST_TYPE_INSTANCE_CUSTOM_INDEX,                              "instancecustomindex"   },
-               { TEST_TYPE_INTERSECTION_T_KHR,                                 "intersectiont"                 },
-               { TEST_TYPE_OBJECT_RAY_ORIGIN_KHR,                              "objectrayorigin"               },
-               { TEST_TYPE_OBJECT_RAY_DIRECTION_KHR,                   "objectraydirection"    },
-               { TEST_TYPE_OBJECT_TO_WORLD_KHR,                                "objecttoworld"                 },
-               { TEST_TYPE_WORLD_TO_OBJECT_KHR,                                "worldtoobject"                 },
-       };
-
-       for (size_t testTypeNdx = 0; testTypeNdx < DE_LENGTH_OF_ARRAY(testTypes); ++testTypeNdx)
-       {
-               de::MovePtr<tcu::TestCaseGroup> testTypeGroup                                   (new tcu::TestCaseGroup(group->getTestContext(), testTypes[testTypeNdx].name, ""));
-               const TestType                                  testType                                                = testTypes[testTypeNdx].testType;
-               const ShaderBodyTextFunc                testConfigShaderBodyTextFunc    = getShaderBodyTextFunc(testType);
-               const bool                                              fixedPointVectorOutput                  =  testType == TEST_TYPE_OBJECT_RAY_ORIGIN_KHR
-                                                                                                                                               || testType == TEST_TYPE_OBJECT_RAY_DIRECTION_KHR;
-               const bool                                              fixedPointMatrixOutput                  =  testType == TEST_TYPE_OBJECT_TO_WORLD_KHR
-                                                                                                                                               || testType == TEST_TYPE_WORLD_TO_OBJECT_KHR;
-               const bool                                              single                                                  =  testTypeNdx == TEST_TYPE_FLOW
-                                                                                                                                               || testType == TEST_TYPE_OBJECT_RAY_ORIGIN_KHR
-                                                                                                                                               || testType == TEST_TYPE_OBJECT_RAY_DIRECTION_KHR
-                                                                                                                                               || testType == TEST_TYPE_OBJECT_TO_WORLD_KHR
-                                                                                                                                               || testType == TEST_TYPE_WORLD_TO_OBJECT_KHR;
-               const deUint32                                  imageDepth                                              = fixedPointMatrixOutput ? 4 * 4
-                                                                                                                                               : fixedPointVectorOutput ? 4
-                                                                                                                                               : 1;
-
-               for (size_t pipelineStageNdx = 0; pipelineStageNdx < DE_LENGTH_OF_ARRAY(pipelineStages); ++pipelineStageNdx)
+               tcu::TestCaseGroup* createAdvancedTests(tcu::TestContext& testCtx)
                {
-                       de::MovePtr<tcu::TestCaseGroup> sourceTypeGroup                 (new tcu::TestCaseGroup(group->getTestContext(), pipelineStages[pipelineStageNdx].name, ""));
-                       const VkShaderStageFlagBits             stage                                   = pipelineStages[pipelineStageNdx].stage;
-                       const CheckSupportFunc                  pipelineCheckSupport    = getPipelineCheckSupport(stage);
-                       const InitProgramsFunc                  pipelineInitPrograms    = getPipelineInitPrograms(stage);
-                       const deUint32                                  instancesGroupCount             = single ? 1 : 2;
-                       const deUint32                                  geometriesGroupCount    = single ? 1 : 8;
-                       const deUint32                                  squaresGroupCount               = (TEST_WIDTH * TEST_HEIGHT) / geometriesGroupCount / instancesGroupCount;
-
-                       DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == TEST_WIDTH * TEST_HEIGHT);
-
-                       for (size_t geomTypeNdx = 0; geomTypeNdx < DE_LENGTH_OF_ARRAY(geomTypes); ++geomTypeNdx)
-                       {
-                               const GeomType          geomType        = geomTypes[geomTypeNdx].geomType;
-                               const TestParams        testParams      =
-                               {
-                                       TEST_WIDTH,                                             //  deUint32                            width;
-                                       TEST_HEIGHT,                                    //  deUint32                            height;
-                                       imageDepth,                                             //  deUint32                            depth;
-                                       testType,                                               //  TestType                            testType;
-                                       stage,                                                  //  VkShaderStageFlagBits       stage;
-                                       geomType,                                               //  GeomType                            geomType;
-                                       squaresGroupCount,                              //  deUint32                            squaresGroupCount;
-                                       geometriesGroupCount,                   //  deUint32                            geometriesGroupCount;
-                                       instancesGroupCount,                    //  deUint32                            instancesGroupCount;
-                                       VK_FORMAT_R32_SINT,                             //  VkFormat                            format;
-                                       pipelineCheckSupport,                   //  CheckSupportFunc            pipelineCheckSupport;
-                                       pipelineInitPrograms,                   //  InitProgramsFunc            pipelineInitPrograms;
-                                       testConfigShaderBodyTextFunc,   //  ShaderTestTextFunc          testConfigShaderBodyText;
-                                       DE_NULL,                                                //  CheckSupportFunc            testConfigCheckSupport;
-                               };
+                       de::MovePtr<tcu::TestCaseGroup>         group(new tcu::TestCaseGroup(testCtx, "advanced", "Advanced ray query tests"));
 
-                               sourceTypeGroup->addChild(new RayQueryBuiltinTestCase(group->getTestContext(), geomTypes[geomTypeNdx].name, "", testParams));
+                       const struct TestTypes
+                       {
+                               TestType        testType;
+                               const char* name;
                        }
+                       testTypes[] =
+                       {
+                               { TEST_TYPE_NULL_ACCELERATION_STRUCTURE,        "null_as"       },
+                       };
 
-                       testTypeGroup->addChild(sourceTypeGroup.release());
-               }
-
-               group->addChild(testTypeGroup.release());
-       }
-
-       return group.release();
-}
+                       for (size_t testTypeNdx = 0; testTypeNdx < DE_LENGTH_OF_ARRAY(testTypes); ++testTypeNdx)
+                       {
+                               de::MovePtr<tcu::TestCaseGroup> testTypeGroup(new tcu::TestCaseGroup(group->getTestContext(), testTypes[testTypeNdx].name, ""));
+                               const TestType                                  testType = testTypes[testTypeNdx].testType;
+                               const ShaderBodyTextFunc                testConfigShaderBodyTextFunc = getShaderBodyTextFunc(testType);
+                               const CheckSupportFunc                  testConfigCheckSupport = getTestConfigCheckSupport(testType);
+                               const deUint32                                  imageDepth = 1;
 
-tcu::TestCaseGroup*    createAdvancedTests     (tcu::TestContext& testCtx)
-{
-       de::MovePtr<tcu::TestCaseGroup>         group   (new tcu::TestCaseGroup(testCtx, "advanced", "Advanced ray query tests"));
+                               for (size_t pipelineStageNdx = 0; pipelineStageNdx < DE_LENGTH_OF_ARRAY(pipelineStages); ++pipelineStageNdx)
+                               {
+                                       de::MovePtr<tcu::TestCaseGroup> sourceTypeGroup(new tcu::TestCaseGroup(group->getTestContext(), pipelineStages[pipelineStageNdx].name, ""));
+                                       const VkShaderStageFlagBits             stage = pipelineStages[pipelineStageNdx].stage;
+                                       const CheckSupportFunc                  pipelineCheckSupport = getPipelineCheckSupport(stage);
+                                       const InitProgramsFunc                  pipelineInitPrograms = getPipelineInitPrograms(stage);
+                                       const deUint32                                  instancesGroupCount = 1;
+                                       const deUint32                                  geometriesGroupCount = 1;
+                                       const deUint32                                  squaresGroupCount = (TEST_WIDTH * TEST_HEIGHT) / geometriesGroupCount / instancesGroupCount;
 
-       const struct TestTypes
-       {
-               TestType        testType;
-               const char*     name;
-       }
-       testTypes[] =
-       {
-               { TEST_TYPE_NULL_ACCELERATION_STRUCTURE,        "null_as"       },
-       };
+                                       DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == TEST_WIDTH * TEST_HEIGHT);
 
-       for (size_t testTypeNdx = 0; testTypeNdx < DE_LENGTH_OF_ARRAY(testTypes); ++testTypeNdx)
-       {
-               de::MovePtr<tcu::TestCaseGroup> testTypeGroup                                   (new tcu::TestCaseGroup(group->getTestContext(), testTypes[testTypeNdx].name, ""));
-               const TestType                                  testType                                                = testTypes[testTypeNdx].testType;
-               const ShaderBodyTextFunc                testConfigShaderBodyTextFunc    = getShaderBodyTextFunc(testType);
-               const CheckSupportFunc                  testConfigCheckSupport                  = getTestConfigCheckSupport(testType);
-               const deUint32                                  imageDepth                                              = 1;
+                                       for (size_t geomTypeNdx = 0; geomTypeNdx < DE_LENGTH_OF_ARRAY(geomTypes); ++geomTypeNdx)
+                                       {
+                                               const GeomType          geomType = geomTypes[geomTypeNdx].geomType;
+                                               const TestParams        testParams =
+                                               {
+                                                       TEST_WIDTH,                                             //  deUint32                            width;
+                                                       TEST_HEIGHT,                                    //  deUint32                            height;
+                                                       imageDepth,                                             //  deUint32                            depth;
+                                                       testType,                                               //  TestType                            testType;
+                                                       stage,                                                  //  VkShaderStageFlagBits       stage;
+                                                       geomType,                                               //  GeomType                            geomType;
+                                                       squaresGroupCount,                              //  deUint32                            squaresGroupCount;
+                                                       geometriesGroupCount,                   //  deUint32                            geometriesGroupCount;
+                                                       instancesGroupCount,                    //  deUint32                            instancesGroupCount;
+                                                       VK_FORMAT_R32_SINT,                             //  VkFormat                            format;
+                                                       pipelineCheckSupport,                   //  CheckSupportFunc            pipelineCheckSupport;
+                                                       pipelineInitPrograms,                   //  InitProgramsFunc            pipelineInitPrograms;
+                                                       testConfigShaderBodyTextFunc,   //  ShaderTestTextFunc          testConfigShaderBodyText;
+                                                       testConfigCheckSupport,                 //  CheckSupportFunc            testConfigCheckSupport;
+                                               };
+
+                                               sourceTypeGroup->addChild(new RayQueryBuiltinTestCase(group->getTestContext(), geomTypes[geomTypeNdx].name, "", testParams));
+                                       }
 
-               for (size_t pipelineStageNdx = 0; pipelineStageNdx < DE_LENGTH_OF_ARRAY(pipelineStages); ++pipelineStageNdx)
-               {
-                       de::MovePtr<tcu::TestCaseGroup> sourceTypeGroup                 (new tcu::TestCaseGroup(group->getTestContext(), pipelineStages[pipelineStageNdx].name, ""));
-                       const VkShaderStageFlagBits             stage                                   = pipelineStages[pipelineStageNdx].stage;
-                       const CheckSupportFunc                  pipelineCheckSupport    = getPipelineCheckSupport(stage);
-                       const InitProgramsFunc                  pipelineInitPrograms    = getPipelineInitPrograms(stage);
-                       const deUint32                                  instancesGroupCount             = 1;
-                       const deUint32                                  geometriesGroupCount    = 1;
-                       const deUint32                                  squaresGroupCount               = (TEST_WIDTH * TEST_HEIGHT) / geometriesGroupCount / instancesGroupCount;
-
-                       DE_ASSERT(instancesGroupCount * geometriesGroupCount * squaresGroupCount == TEST_WIDTH * TEST_HEIGHT);
-
-                       for (size_t geomTypeNdx = 0; geomTypeNdx < DE_LENGTH_OF_ARRAY(geomTypes); ++geomTypeNdx)
-                       {
-                               const GeomType          geomType        = geomTypes[geomTypeNdx].geomType;
-                               const TestParams        testParams      =
-                               {
-                                       TEST_WIDTH,                                             //  deUint32                            width;
-                                       TEST_HEIGHT,                                    //  deUint32                            height;
-                                       imageDepth,                                             //  deUint32                            depth;
-                                       testType,                                               //  TestType                            testType;
-                                       stage,                                                  //  VkShaderStageFlagBits       stage;
-                                       geomType,                                               //  GeomType                            geomType;
-                                       squaresGroupCount,                              //  deUint32                            squaresGroupCount;
-                                       geometriesGroupCount,                   //  deUint32                            geometriesGroupCount;
-                                       instancesGroupCount,                    //  deUint32                            instancesGroupCount;
-                                       VK_FORMAT_R32_SINT,                             //  VkFormat                            format;
-                                       pipelineCheckSupport,                   //  CheckSupportFunc            pipelineCheckSupport;
-                                       pipelineInitPrograms,                   //  InitProgramsFunc            pipelineInitPrograms;
-                                       testConfigShaderBodyTextFunc,   //  ShaderTestTextFunc          testConfigShaderBodyText;
-                                       testConfigCheckSupport,                 //  CheckSupportFunc            testConfigCheckSupport;
-                               };
+                                       testTypeGroup->addChild(sourceTypeGroup.release());
+                               }
 
-                               sourceTypeGroup->addChild(new RayQueryBuiltinTestCase(group->getTestContext(), geomTypes[geomTypeNdx].name, "", testParams));
+                               group->addChild(testTypeGroup.release());
                        }
 
-                       testTypeGroup->addChild(sourceTypeGroup.release());
+                       return group.release();
                }
 
-               group->addChild(testTypeGroup.release());
-       }
-
-       return group.release();
-}
-
-}      // RayQuery
+       }       // RayQuery
 }      // vkt
index 00020ba..d97a2f1 100644 (file)
@@ -704968,6 +704968,234 @@ dEQP-VK.ray_query.builtin.worldtoobject.sect.triangles
 dEQP-VK.ray_query.builtin.worldtoobject.sect.aabbs
 dEQP-VK.ray_query.builtin.worldtoobject.call.triangles
 dEQP-VK.ray_query.builtin.worldtoobject.call.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.vert.triangles
+dEQP-VK.ray_query.builtin.getraytmin.vert.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.tesc.triangles
+dEQP-VK.ray_query.builtin.getraytmin.tesc.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.tese.triangles
+dEQP-VK.ray_query.builtin.getraytmin.tese.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.geom.triangles
+dEQP-VK.ray_query.builtin.getraytmin.geom.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.frag.triangles
+dEQP-VK.ray_query.builtin.getraytmin.frag.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.comp.triangles
+dEQP-VK.ray_query.builtin.getraytmin.comp.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.rgen.triangles
+dEQP-VK.ray_query.builtin.getraytmin.rgen.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.ahit.triangles
+dEQP-VK.ray_query.builtin.getraytmin.ahit.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.chit.triangles
+dEQP-VK.ray_query.builtin.getraytmin.chit.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.miss.triangles
+dEQP-VK.ray_query.builtin.getraytmin.miss.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.sect.triangles
+dEQP-VK.ray_query.builtin.getraytmin.sect.aabbs
+dEQP-VK.ray_query.builtin.getraytmin.call.triangles
+dEQP-VK.ray_query.builtin.getraytmin.call.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.vert.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.vert.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.tesc.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.tesc.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.tese.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.tese.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.geom.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.geom.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.frag.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.frag.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.comp.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.comp.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.rgen.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.rgen.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.ahit.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.ahit.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.chit.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.chit.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.miss.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.miss.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.sect.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.sect.aabbs
+dEQP-VK.ray_query.builtin.getworldrayorigin.call.triangles
+dEQP-VK.ray_query.builtin.getworldrayorigin.call.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.vert.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.vert.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.tesc.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.tesc.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.tese.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.tese.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.geom.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.geom.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.frag.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.frag.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.comp.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.comp.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.rgen.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.rgen.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.ahit.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.ahit.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.chit.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.chit.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.miss.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.miss.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.sect.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.sect.aabbs
+dEQP-VK.ray_query.builtin.getworldraydirection.call.triangles
+dEQP-VK.ray_query.builtin.getworldraydirection.call.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.vert.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.tesc.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.tese.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.geom.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.frag.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.comp.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.rgen.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.ahit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.chit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.miss.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.sect.aabbs
+dEQP-VK.ray_query.builtin.getintersectioncandidateaabbopaque.call.aabbs
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCandidate.call.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectionfrontfaceCommitted.call.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.vert.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.tesc.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.tese.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.geom.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.frag.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.comp.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.rgen.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.ahit.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.chit.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.miss.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.sect.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.call.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCandidate.call.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.vert.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.tesc.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.tese.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.geom.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.frag.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.comp.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.rgen.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.ahit.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.chit.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.miss.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.sect.aabbs
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.call.triangles
+dEQP-VK.ray_query.builtin.getintersectiongeometryindexCommitted.call.aabbs
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCandidate.call.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectionbarycentricsCommitted.call.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.vert.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.tesc.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.tese.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.geom.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.frag.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.comp.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.rgen.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.ahit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.chit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.miss.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.sect.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.call.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCandidate.call.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.vert.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.vert.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.tesc.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.tesc.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.tese.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.tese.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.geom.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.geom.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.frag.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.frag.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.comp.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.comp.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.rgen.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.rgen.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.ahit.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.ahit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.chit.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.chit.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.miss.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.miss.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.sect.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.sect.aabbs
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.call.triangles
+dEQP-VK.ray_query.builtin.getintersectioninstanceshaderbindingtablerecordoffsetCommitted.call.aabbs
 dEQP-VK.ray_query.traversal_control.vertex_shader.generate_intersection.triangles
 dEQP-VK.ray_query.traversal_control.vertex_shader.generate_intersection.aabbs
 dEQP-VK.ray_query.traversal_control.vertex_shader.skip_intersection.triangles