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