From: Ostrowski, Igor Date: Fri, 9 Feb 2018 10:56:15 +0000 (+0100) Subject: RESTRICT AUTOMERGE: Backport tests for VK_KHR_draw_indirect_count X-Git-Tag: upstream/1.3.5~1974^2~8^2~5^2~19 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=43622dc64ce9f19461828b0bd62ca5342c26eb40;p=platform%2Fupstream%2FVK-GL-CTS.git RESTRICT AUTOMERGE: Backport tests for VK_KHR_draw_indirect_count This change add new tests for VK_KHR_draw_indirect_count extension, and adds the extension to the whitelist. New Tests: dEQP-VK.draw.indirect_draw.*.indirect_draw_count.* dEQP-VK.draw.indirect_draw.*.indirect_draw_first_instance.* dEQP-VK.draw.indirect_draw.*.indirect_draw_count_first_instance.* dEQP-VK.draw.indirect_draw.*.indirect_draw_count_instanced.* Note: for Android CTS backport, adjusted excluded test list to not impact previously-passing implementations that don't care about this extension. Affected tests: dEQP-VK.api.info.device.extensions Components: Vulkan, Framework VK-GL-CTS issue: 1004 Bug: b/111786155 Change-Id: I3d53806eb1a45293a77b940d9c2fa540a6d83d50 (cherry picked from Khronos commit 7b47cd53c6656b866e7c3a3c0a590da85f3b2de1) --- diff --git a/android/cts/master/src/vk-excluded-tests.txt b/android/cts/master/src/vk-excluded-tests.txt index 2e6b354..220123f 100644 --- a/android/cts/master/src/vk-excluded-tests.txt +++ b/android/cts/master/src/vk-excluded-tests.txt @@ -300,3 +300,8 @@ dEQP-VK.wsi.android.shared_presentable_image.scale_down.* # Issue: b/67022169 dEQP-VK.wsi.android.incremental_present.scale_down.* +# Issue: b/111786155 Backport of tests for KHR_draw_indirect_count, but change +# includes some unrelated test refactoring. Exclude the tests that would affect +# previously-passing implementations. +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_first_instance.* +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_first_instance.* diff --git a/android/cts/master/vk-master.txt b/android/cts/master/vk-master.txt index 7bf5d20..c7f2896 100755 --- a/android/cts/master/vk-master.txt +++ b/android/cts/master/vk-master.txt @@ -204754,16 +204754,32 @@ dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_list dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_strip dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_list dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_strip +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count.triangle_list +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count.triangle_strip +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_first_instance.triangle_list +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_first_instance.triangle_strip dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_list dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_strip dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_list dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_strip +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_instanced.no_first_instance.triangle_list +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_instanced.no_first_instance.triangle_strip +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_instanced.first_instance.triangle_list +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_instanced.first_instance.triangle_strip dEQP-VK.draw.indirect_draw.indexed.indirect_draw.triangle_list dEQP-VK.draw.indirect_draw.indexed.indirect_draw.triangle_strip +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count.triangle_list +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count.triangle_strip +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_first_instance.triangle_list +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_first_instance.triangle_strip dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.no_first_instance.triangle_list dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.no_first_instance.triangle_strip dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.first_instance.triangle_list dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.first_instance.triangle_strip +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_instanced.no_first_instance.triangle_list +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_instanced.no_first_instance.triangle_strip +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_instanced.first_instance.triangle_list +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_instanced.first_instance.triangle_strip dEQP-VK.draw.basic_draw.draw.point_list.1 dEQP-VK.draw.basic_draw.draw.point_list.3 dEQP-VK.draw.basic_draw.draw.point_list.17 diff --git a/external/vulkancts/data/vulkan/draw/VertexFetchInstanceIndex.vert b/external/vulkancts/data/vulkan/draw/VertexFetchInstanceIndex.vert new file mode 100644 index 0000000..3ed625a --- /dev/null +++ b/external/vulkancts/data/vulkan/draw/VertexFetchInstanceIndex.vert @@ -0,0 +1,19 @@ +#version 430 + +layout(location = 0) in vec4 in_position; +layout(location = 1) in vec4 in_color; +layout(location = 2) in int in_refInstanceIndex; + +layout(location = 0) out vec4 out_color; + +out gl_PerVertex { + vec4 gl_Position; +}; + +void main() { + gl_Position = in_position; + if (gl_InstanceIndex == in_refInstanceIndex) + out_color = in_color; + else + out_color = vec4(1.0, 0.0, 0.0, 1.0); +} \ No newline at end of file diff --git a/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl b/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl index 79b448a..881bf56 100644 --- a/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl +++ b/external/vulkancts/framework/vulkan/vkConcreteDeviceInterface.inl @@ -168,6 +168,8 @@ virtual void cmdDebugMarkerEndEXT (VkCommandBuffer commandBuffer) const; virtual void cmdDebugMarkerInsertEXT (VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const; virtual void cmdDrawIndirectCountAMD (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const; virtual void cmdDrawIndexedIndirectCountAMD (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const; +virtual void cmdDrawIndirectCountKHR (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const; +virtual void cmdDrawIndexedIndirectCountKHR (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const; virtual VkResult getMemoryWin32HandleNV (VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, pt::Win32Handle* pHandle) const; virtual void cmdProcessCommandsNVX (VkCommandBuffer commandBuffer, const VkCmdProcessCommandsInfoNVX* pProcessCommandsInfo) const; virtual void cmdReserveSpaceForCommandsNVX (VkCommandBuffer commandBuffer, const VkCmdReserveSpaceForCommandsInfoNVX* pReserveSpaceInfo) const; diff --git a/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl b/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl index 0a7842a..2718d7a 100644 --- a/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl +++ b/external/vulkancts/framework/vulkan/vkDeviceDriverImpl.inl @@ -837,6 +837,16 @@ void DeviceDriver::cmdDrawIndexedIndirectCountAMD (VkCommandBuffer commandBuffer m_vk.cmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride); } +void DeviceDriver::cmdDrawIndirectCountKHR (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const +{ + m_vk.cmdDrawIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride); +} + +void DeviceDriver::cmdDrawIndexedIndirectCountKHR (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const +{ + m_vk.cmdDrawIndexedIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride); +} + VkResult DeviceDriver::getMemoryWin32HandleNV (VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, pt::Win32Handle* pHandle) const { return m_vk.getMemoryWin32HandleNV(device, memory, handleType, pHandle); diff --git a/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl index ae069e2..785cf10 100644 --- a/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl +++ b/external/vulkancts/framework/vulkan/vkDeviceFunctionPointers.inl @@ -168,6 +168,8 @@ CmdDebugMarkerEndEXTFunc cmdDebugMarkerEndEXT; CmdDebugMarkerInsertEXTFunc cmdDebugMarkerInsertEXT; CmdDrawIndirectCountAMDFunc cmdDrawIndirectCountAMD; CmdDrawIndexedIndirectCountAMDFunc cmdDrawIndexedIndirectCountAMD; +CmdDrawIndirectCountKHRFunc cmdDrawIndirectCountKHR; +CmdDrawIndexedIndirectCountKHRFunc cmdDrawIndexedIndirectCountKHR; GetMemoryWin32HandleNVFunc getMemoryWin32HandleNV; CmdProcessCommandsNVXFunc cmdProcessCommandsNVX; CmdReserveSpaceForCommandsNVXFunc cmdReserveSpaceForCommandsNVX; diff --git a/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl b/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl index 4b685e3..780b3b7 100644 --- a/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl +++ b/external/vulkancts/framework/vulkan/vkFunctionPointerTypes.inl @@ -252,6 +252,8 @@ typedef VKAPI_ATTR void (VKAPI_CALL* CmdDebugMarkerEndEXTFunc) (VkCom typedef VKAPI_ATTR void (VKAPI_CALL* CmdDebugMarkerInsertEXTFunc) (VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo); typedef VKAPI_ATTR void (VKAPI_CALL* CmdDrawIndirectCountAMDFunc) (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride); typedef VKAPI_ATTR void (VKAPI_CALL* CmdDrawIndexedIndirectCountAMDFunc) (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride); +typedef VKAPI_ATTR void (VKAPI_CALL* CmdDrawIndirectCountKHRFunc) (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride); +typedef VKAPI_ATTR void (VKAPI_CALL* CmdDrawIndexedIndirectCountKHRFunc) (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride); typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetPhysicalDeviceExternalImageFormatPropertiesNVFunc) (VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType, VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties); typedef VKAPI_ATTR VkResult (VKAPI_CALL* GetMemoryWin32HandleNVFunc) (VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, pt::Win32Handle* pHandle); typedef VKAPI_ATTR VkResult (VKAPI_CALL* CreateViSurfaceNNFunc) (VkInstance instance, const VkViSurfaceCreateInfoNN* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); diff --git a/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl b/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl index dccca72..48f0303 100644 --- a/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl +++ b/external/vulkancts/framework/vulkan/vkInitDeviceFunctionPointers.inl @@ -198,6 +198,8 @@ m_vk.cmdDebugMarkerEndEXT = (CmdDebugMarkerEndEXTFunc) GET_PROC_ADDR(" m_vk.cmdDebugMarkerInsertEXT = (CmdDebugMarkerInsertEXTFunc) GET_PROC_ADDR("vkCmdDebugMarkerInsertEXT"); m_vk.cmdDrawIndirectCountAMD = (CmdDrawIndirectCountAMDFunc) GET_PROC_ADDR("vkCmdDrawIndirectCountAMD"); m_vk.cmdDrawIndexedIndirectCountAMD = (CmdDrawIndexedIndirectCountAMDFunc) GET_PROC_ADDR("vkCmdDrawIndexedIndirectCountAMD"); +m_vk.cmdDrawIndirectCountKHR = (CmdDrawIndirectCountKHRFunc) GET_PROC_ADDR("vkCmdDrawIndirectCountKHR"); +m_vk.cmdDrawIndexedIndirectCountKHR = (CmdDrawIndexedIndirectCountKHRFunc) GET_PROC_ADDR("vkCmdDrawIndexedIndirectCountKHR"); m_vk.getMemoryWin32HandleNV = (GetMemoryWin32HandleNVFunc) GET_PROC_ADDR("vkGetMemoryWin32HandleNV"); m_vk.cmdProcessCommandsNVX = (CmdProcessCommandsNVXFunc) GET_PROC_ADDR("vkCmdProcessCommandsNVX"); m_vk.cmdReserveSpaceForCommandsNVX = (CmdReserveSpaceForCommandsNVXFunc) GET_PROC_ADDR("vkCmdReserveSpaceForCommandsNVX"); diff --git a/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl b/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl index 451228e..e7b419e 100644 --- a/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl +++ b/external/vulkancts/framework/vulkan/vkNullDriverImpl.inl @@ -1563,6 +1563,28 @@ VKAPI_ATTR void VKAPI_CALL cmdDrawIndexedIndirectCountAMD (VkCommandBuffer comma DE_UNREF(stride); } +VKAPI_ATTR void VKAPI_CALL cmdDrawIndirectCountKHR (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) +{ + DE_UNREF(commandBuffer); + DE_UNREF(buffer); + DE_UNREF(offset); + DE_UNREF(countBuffer); + DE_UNREF(countBufferOffset); + DE_UNREF(maxDrawCount); + DE_UNREF(stride); +} + +VKAPI_ATTR void VKAPI_CALL cmdDrawIndexedIndirectCountKHR (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) +{ + DE_UNREF(commandBuffer); + DE_UNREF(buffer); + DE_UNREF(offset); + DE_UNREF(countBuffer); + DE_UNREF(countBufferOffset); + DE_UNREF(maxDrawCount); + DE_UNREF(stride); +} + VKAPI_ATTR VkResult VKAPI_CALL getPhysicalDeviceExternalImageFormatPropertiesNV (VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType, VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties) { DE_UNREF(physicalDevice); @@ -2043,6 +2065,8 @@ static const tcu::StaticFunctionLibrary::Entry s_deviceFunctions[] = VK_NULL_FUNC_ENTRY(vkCmdDebugMarkerInsertEXT, cmdDebugMarkerInsertEXT), VK_NULL_FUNC_ENTRY(vkCmdDrawIndirectCountAMD, cmdDrawIndirectCountAMD), VK_NULL_FUNC_ENTRY(vkCmdDrawIndexedIndirectCountAMD, cmdDrawIndexedIndirectCountAMD), + VK_NULL_FUNC_ENTRY(vkCmdDrawIndirectCountKHR, cmdDrawIndirectCountKHR), + VK_NULL_FUNC_ENTRY(vkCmdDrawIndexedIndirectCountKHR, cmdDrawIndexedIndirectCountKHR), VK_NULL_FUNC_ENTRY(vkGetMemoryWin32HandleNV, getMemoryWin32HandleNV), VK_NULL_FUNC_ENTRY(vkCmdProcessCommandsNVX, cmdProcessCommandsNVX), VK_NULL_FUNC_ENTRY(vkCmdReserveSpaceForCommandsNVX, cmdReserveSpaceForCommandsNVX), diff --git a/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl b/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl index 6839862..b522715 100644 --- a/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl +++ b/external/vulkancts/framework/vulkan/vkVirtualDeviceInterface.inl @@ -168,6 +168,8 @@ virtual void cmdDebugMarkerEndEXT (VkCommandBuffer commandBuffer) const = virtual void cmdDebugMarkerInsertEXT (VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const = 0; virtual void cmdDrawIndirectCountAMD (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const = 0; virtual void cmdDrawIndexedIndirectCountAMD (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const = 0; +virtual void cmdDrawIndirectCountKHR (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const = 0; +virtual void cmdDrawIndexedIndirectCountKHR (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, deUint32 maxDrawCount, deUint32 stride) const = 0; virtual VkResult getMemoryWin32HandleNV (VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, pt::Win32Handle* pHandle) const = 0; virtual void cmdProcessCommandsNVX (VkCommandBuffer commandBuffer, const VkCmdProcessCommandsInfoNVX* pProcessCommandsInfo) const = 0; virtual void cmdReserveSpaceForCommandsNVX (VkCommandBuffer commandBuffer, const VkCmdReserveSpaceForCommandsInfoNVX* pReserveSpaceInfo) const = 0; diff --git a/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp b/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp index 1b5f847..49d63fc 100644 --- a/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp +++ b/external/vulkancts/modules/vulkan/api/vktApiFeatureInfo.cpp @@ -755,6 +755,7 @@ void checkDeviceExtensions (tcu::ResultCollector& results, const vector& "VK_KHR_device_group", "VK_KHR_multiview", "VK_KHR_maintenance3", + "VK_KHR_draw_indirect_count" }; checkKhrExtensions(results, extensions, DE_LENGTH_OF_ARRAY(s_allowedDeviceKhrExtensions), s_allowedDeviceKhrExtensions); diff --git a/external/vulkancts/modules/vulkan/draw/vktDrawIndirectTest.cpp b/external/vulkancts/modules/vulkan/draw/vktDrawIndirectTest.cpp index cb89897..0c72ccf 100644 --- a/external/vulkancts/modules/vulkan/draw/vktDrawIndirectTest.cpp +++ b/external/vulkancts/modules/vulkan/draw/vktDrawIndirectTest.cpp @@ -34,6 +34,7 @@ #include "tcuImageCompare.hpp" #include "tcuTextureUtil.hpp" #include "tcuRGBA.hpp" +#include "vkQueryUtil.hpp" #include "vkDefs.hpp" @@ -70,7 +71,14 @@ enum DrawType struct DrawTypedTestSpec : public TestSpecBase { - DrawType drawType; + DrawTypedTestSpec() + : testFirstInstanceNdx(false) + , testIndirectCountExt(false) + {}; + + DrawType drawType; + bool testFirstInstanceNdx; + bool testIndirectCountExt; }; class IndirectDraw : public DrawTestsBaseClass @@ -84,28 +92,37 @@ public: template void addCommand (const T&); protected: - std::vector m_indirectBufferContents; + void setVertexBuffer (void); + void setFirstInstanceVertexBuffer (void); + + std::vector m_indirectBufferContents; de::SharedPtr m_indirectBuffer; - vk::VkDeviceSize m_offsetInBuffer; - deUint32 m_strideInBuffer; + vk::VkDeviceSize m_offsetInBuffer; + deUint32 m_strideInBuffer; + + const bool m_testIndirectCountExt; + de::SharedPtr m_indirectCountBuffer; + vk::VkDeviceSize m_offsetInCountBuffer; + const deUint32 m_indirectCountExtDrawPadding; - deUint32 m_drawCount; - JunkData m_junkData; + deUint32 m_drawCount; + JunkData m_junkData; - const DrawType m_drawType; - deBool m_isMultiDrawEnabled; - deUint32 m_drawIndirectMaxCount; + const DrawType m_drawType; + const bool m_testFirstInstanceNdx; + deBool m_isMultiDrawEnabled; + deUint32 m_drawIndirectMaxCount; de::SharedPtr m_indexBuffer; }; -struct FirtsInstanceSupported +struct FirstInstanceSupported { static deUint32 getFirstInstance (void) { return 2; } static bool isTestSupported (const vk::VkPhysicalDeviceFeatures& features) { return features.drawIndirectFirstInstance == VK_TRUE; } }; -struct FirtsInstanceNotSupported +struct FirstInstanceNotSupported { static deUint32 getFirstInstance (void) { return 0; } static bool isTestSupported (const vk::VkPhysicalDeviceFeatures&) { return true; } @@ -119,14 +136,11 @@ public: virtual tcu::TestStatus iterate (void); }; -IndirectDraw::IndirectDraw (Context &context, TestSpec testSpec) - : DrawTestsBaseClass (context, testSpec.shaders[glu::SHADERTYPE_VERTEX], testSpec.shaders[glu::SHADERTYPE_FRAGMENT], testSpec.topology) - , m_drawType (testSpec.drawType) +void IndirectDraw::setVertexBuffer (void) { - int refVertexIndex = 2; - if (testSpec.drawType == DRAW_TYPE_INDEXED) + if (m_drawType == DRAW_TYPE_INDEXED) { for (int unusedIdx = 0; unusedIdx < VERTEX_OFFSET; unusedIdx++) { @@ -136,7 +150,7 @@ IndirectDraw::IndirectDraw (Context &context, TestSpec testSpec) } m_data.push_back(VertexElementData(tcu::Vec4( 1.0f, -1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1)); - m_data.push_back(VertexElementData(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1)); + m_data.push_back(VertexElementData(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1)); switch (m_topology) { @@ -164,6 +178,78 @@ IndirectDraw::IndirectDraw (Context &context, TestSpec testSpec) } m_data.push_back(VertexElementData(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1)); +} + +void IndirectDraw::setFirstInstanceVertexBuffer (void) +{ + if (m_context.getDeviceFeatures().drawIndirectFirstInstance != VK_TRUE) + { + TCU_THROW(NotSupportedError, "Required 'drawIndirectFirstInstance' feature is not supported"); + } + + if (m_drawType == DRAW_TYPE_INDEXED) + { + for (int unusedIdx = 0; unusedIdx < VERTEX_OFFSET; unusedIdx++) + { + m_data.push_back(VertexElementData(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1)); + } + } + + m_data.push_back(VertexElementData(tcu::Vec4( 1.0f, -1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1)); + m_data.push_back(VertexElementData(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1)); + + switch (m_topology) + { + case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST: + { + int refInstanceIndex = 1; + m_data.push_back(VertexElementData(tcu::Vec4(-0.3f, -0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refInstanceIndex)); + m_data.push_back(VertexElementData(tcu::Vec4(-0.3f, 0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refInstanceIndex)); + m_data.push_back(VertexElementData(tcu::Vec4( 0.3f, -0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refInstanceIndex)); + + refInstanceIndex = 0; + m_data.push_back(VertexElementData(tcu::Vec4( 0.3f, -0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refInstanceIndex)); + m_data.push_back(VertexElementData(tcu::Vec4( 0.3f, 0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refInstanceIndex)); + m_data.push_back(VertexElementData(tcu::Vec4(-0.3f, 0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refInstanceIndex)); + break; + } + case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP: + { + int refInstanceIndex = 1; + m_data.push_back(VertexElementData(tcu::Vec4(-0.3f, 0.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refInstanceIndex)); + m_data.push_back(VertexElementData(tcu::Vec4( 0.3f, 0.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refInstanceIndex)); + m_data.push_back(VertexElementData(tcu::Vec4(-0.3f, -0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refInstanceIndex)); + m_data.push_back(VertexElementData(tcu::Vec4( 0.3f, -0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refInstanceIndex)); + + refInstanceIndex = 0; + m_data.push_back(VertexElementData(tcu::Vec4(-0.3f, 0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refInstanceIndex)); + m_data.push_back(VertexElementData(tcu::Vec4( 0.3f, 0.3f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refInstanceIndex)); + m_data.push_back(VertexElementData(tcu::Vec4(-0.3f, 0.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refInstanceIndex)); + m_data.push_back(VertexElementData(tcu::Vec4( 0.3f, 0.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), refInstanceIndex)); + break; + } + default: + DE_FATAL("Unknown topology"); + break; + } + + m_data.push_back(VertexElementData(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1)); +} + +IndirectDraw::IndirectDraw (Context &context, TestSpec testSpec) + : DrawTestsBaseClass (context, testSpec.shaders[glu::SHADERTYPE_VERTEX], testSpec.shaders[glu::SHADERTYPE_FRAGMENT], testSpec.topology) + , m_testIndirectCountExt (testSpec.testIndirectCountExt) + , m_indirectCountExtDrawPadding (1u) + , m_drawType (testSpec.drawType) + , m_testFirstInstanceNdx (testSpec.testFirstInstanceNdx) +{ + if (m_testIndirectCountExt && !de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_draw_indirect_count")) + TCU_THROW(NotSupportedError, "Missing extension: VK_KHR_draw_indirect_count"); + + if (m_testFirstInstanceNdx) + setFirstInstanceVertexBuffer(); + else + setVertexBuffer(); initialize(); @@ -181,13 +267,12 @@ IndirectDraw::IndirectDraw (Context &context, TestSpec testSpec) } // Check device for multidraw support: - if (m_context.getDeviceFeatures().multiDrawIndirect) - m_isMultiDrawEnabled = true; - else + if (!m_context.getDeviceFeatures().multiDrawIndirect || m_testFirstInstanceNdx) m_isMultiDrawEnabled = false; + else + m_isMultiDrawEnabled = true; m_drawIndirectMaxCount = m_context.getDeviceProperties().limits.maxDrawIndirectCount; - } template<> @@ -203,7 +288,7 @@ void IndirectDraw::addCommand (const vk::VkDrawIndire } template<> -void IndirectDraw::addCommand(const vk::VkDrawIndexedIndirectCommand& command) +void IndirectDraw::addCommand (const vk::VkDrawIndexedIndirectCommand& command) { DE_ASSERT(m_drawType == DRAW_TYPE_INDEXED); @@ -228,22 +313,27 @@ tcu::TestStatus IndirectDraw::iterate (void) vk::VkDrawIndirectCommand drawCommands[] = { { - 3, //vertexCount - 1, //instanceCount - 2, //firstVertex - 0 //firstInstance + 3u, //vertexCount + 1u, //instanceCount + 2u, //firstVertex + (m_testFirstInstanceNdx ? 1u : 0u) //firstInstance }, { (deUint32)-4, (deUint32)-2, (deUint32)-11, (deUint32)-9 }, // junk (stride) { - 3, //vertexCount - 1, //instanceCount - 5, //firstVertex - 0 //firstInstance + 3u, //vertexCount + 1u, //instanceCount + 5u, //firstVertex + 0u //firstInstance } }; addCommand(drawCommands[0]); addCommand(drawCommands[1]); addCommand(drawCommands[2]); + if (m_testIndirectCountExt) + { + addCommand(drawCommands[1]); + addCommand(drawCommands[1]); + } break; } case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP: @@ -251,22 +341,27 @@ tcu::TestStatus IndirectDraw::iterate (void) vk::VkDrawIndirectCommand drawCommands[] = { { - 4, //vertexCount - 1, //instanceCount - 2, //firstVertex - 0 //firstInstance + 4u, //vertexCount + 1u, //instanceCount + 2u, //firstVertex + (m_testFirstInstanceNdx ? 1u : 0u) //firstInstance }, { (deUint32)-4, (deUint32)-2, (deUint32)-11, (deUint32)-9 }, // junk (stride) { - 4, //vertexCount - 1, //instanceCount - 6, //firstVertex - 0 //firstInstance + 4u, //vertexCount + 1u, //instanceCount + 6u, //firstVertex + 0u //firstInstance } }; addCommand(drawCommands[0]); addCommand(drawCommands[1]); addCommand(drawCommands[2]); + if (m_testIndirectCountExt) + { + addCommand(drawCommands[1]); + addCommand(drawCommands[1]); + } break; } default: @@ -284,24 +379,29 @@ tcu::TestStatus IndirectDraw::iterate (void) vk::VkDrawIndexedIndirectCommand drawCommands[] = { { - 3, // indexCount - 1, // instanceCount - 2, // firstIndex - VERTEX_OFFSET, // vertexOffset - 0, // firstInstance + 3u, // indexCount + 1u, // instanceCount + 2u, // firstIndex + VERTEX_OFFSET, // vertexOffset + (m_testFirstInstanceNdx ? 1u : 0u), // firstInstance }, { (deUint32)-4, (deUint32)-2, (deUint32)-11, (deInt32)9, (deUint32)-7 }, // junk (stride) { - 3, // indexCount - 1, // instanceCount - 5, // firstIndex - VERTEX_OFFSET, // vertexOffset - 0, // firstInstance + 3u, // indexCount + 1u, // instanceCount + 5u, // firstIndex + VERTEX_OFFSET, // vertexOffset + 0u // firstInstance } }; addCommand(drawCommands[0]); addCommand(drawCommands[1]); addCommand(drawCommands[2]); + if (m_testIndirectCountExt) + { + addCommand(drawCommands[1]); + addCommand(drawCommands[1]); + } break; } case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP: @@ -309,24 +409,29 @@ tcu::TestStatus IndirectDraw::iterate (void) vk::VkDrawIndexedIndirectCommand drawCommands[] = { { - 4, // indexCount - 1, // instanceCount - 2, // firstIndex - VERTEX_OFFSET, // vertexOffset - 0, // firstInstance + 4u, // indexCount + 1u, // instanceCount + 2u, // firstIndex + VERTEX_OFFSET, // vertexOffset + (m_testFirstInstanceNdx ? 1u : 0u), // firstInstance }, { (deUint32)-4, (deUint32)-2, (deUint32)-11, (deInt32)9, (deUint32)-7 }, // junk (stride) { - 4, // indexCount - 1, // instanceCount - 6, // firstIndex - VERTEX_OFFSET, // vertexOffset - 0, // firstInstance + 4u, // indexCount + 1u, // instanceCount + 6u, // firstIndex + VERTEX_OFFSET, // vertexOffset + 0u // firstInstance } }; addCommand(drawCommands[0]); addCommand(drawCommands[1]); addCommand(drawCommands[2]); + if (m_testIndirectCountExt) + { + addCommand(drawCommands[1]); + addCommand(drawCommands[1]); + } break; } default: @@ -366,6 +471,30 @@ tcu::TestStatus IndirectDraw::iterate (void) m_indirectBuffer->getBoundMemory().getOffset(), dataSize + m_offsetInBuffer); + if (m_testIndirectCountExt) + { + m_offsetInCountBuffer = sizeof(tcu::Vec3); + m_indirectCountBuffer = Buffer::createAndAlloc(m_vk, + m_context.getDevice(), + BufferCreateInfo(m_offsetInCountBuffer + sizeof(m_drawCount), + vk::VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT), + m_context.getDefaultAllocator(), + vk::MemoryRequirement::HostVisible); + + deUint8* countBufferPtr = reinterpret_cast(m_indirectCountBuffer->getBoundMemory().getHostPtr()); + + if (m_isMultiDrawEnabled && m_drawCount <= m_drawIndirectMaxCount) + *(deUint32*)(countBufferPtr + m_offsetInCountBuffer) = m_drawCount; + else + *(deUint32*)(countBufferPtr + m_offsetInCountBuffer) = 1u; + + vk::flushMappedMemoryRange(m_vk, + m_context.getDevice(), + m_indirectCountBuffer->getBoundMemory().getMemory(), + m_indirectCountBuffer->getBoundMemory().getOffset(), + m_offsetInCountBuffer + sizeof(m_drawCount)); + } + m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline); if (m_drawType == DRAW_TYPE_INDEXED) @@ -378,11 +507,25 @@ tcu::TestStatus IndirectDraw::iterate (void) switch (m_drawType) { case DRAW_TYPE_SEQUENTIAL: - m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer); + { + if (m_testIndirectCountExt) + m_vk.cmdDrawIndirectCountKHR(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, + m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding, + m_strideInBuffer); + else + m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer); break; + } case DRAW_TYPE_INDEXED: - m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer); + { + if (m_testIndirectCountExt) + m_vk.cmdDrawIndexedIndirectCountKHR(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, + m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding, + m_strideInBuffer); + else + m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer); break; + } default: TCU_FAIL("impossible"); } @@ -394,11 +537,25 @@ tcu::TestStatus IndirectDraw::iterate (void) switch (m_drawType) { case DRAW_TYPE_SEQUENTIAL: - m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1u, 0u); + { + if (m_testIndirectCountExt) + m_vk.cmdDrawIndirectCountKHR(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, + m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding, + m_strideInBuffer); + else + m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1u, 0u); break; + } case DRAW_TYPE_INDEXED: - m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1u, 0u); + { + if (m_testIndirectCountExt) + m_vk.cmdDrawIndexedIndirectCountKHR(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, + m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding, + m_strideInBuffer); + else + m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1u, 0u); break; + } default: TCU_FAIL("impossible"); } @@ -457,13 +614,12 @@ tcu::TestStatus IndirectDraw::iterate (void) qpTestResult res = QP_TEST_RESULT_PASS; if (!tcu::fuzzyCompare(log, "Result", "Image comparison result", - referenceFrame.getLevel(0), renderedFrame, 0.05f, - tcu::COMPARE_LOG_RESULT)) { + referenceFrame.getLevel(0), renderedFrame, 0.05f, tcu::COMPARE_LOG_RESULT)) + { res = QP_TEST_RESULT_FAIL; } return tcu::TestStatus(res, qpGetTestResultName(res)); - } template @@ -507,6 +663,11 @@ tcu::TestStatus IndirectDrawInstanced::iterate (void) addCommand(drawCmd[0]); addCommand(drawCmd[1]); addCommand(drawCmd[2]); + if (m_testIndirectCountExt) + { + addCommand(drawCmd[1]); + addCommand(drawCmd[1]); + } break; } case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP: @@ -530,6 +691,11 @@ tcu::TestStatus IndirectDrawInstanced::iterate (void) addCommand(drawCmd[0]); addCommand(drawCmd[1]); addCommand(drawCmd[2]); + if (m_testIndirectCountExt) + { + addCommand(drawCmd[1]); + addCommand(drawCmd[1]); + } break; } default: @@ -566,6 +732,11 @@ tcu::TestStatus IndirectDrawInstanced::iterate (void) addCommand(drawCmd[0]); addCommand(drawCmd[1]); addCommand(drawCmd[2]); + if (m_testIndirectCountExt) + { + addCommand(drawCmd[1]); + addCommand(drawCmd[1]); + } break; } case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP: @@ -591,6 +762,11 @@ tcu::TestStatus IndirectDrawInstanced::iterate (void) addCommand(drawCmd[0]); addCommand(drawCmd[1]); addCommand(drawCmd[2]); + if (m_testIndirectCountExt) + { + addCommand(drawCmd[1]); + addCommand(drawCmd[1]); + } break; } default: @@ -631,6 +807,30 @@ tcu::TestStatus IndirectDrawInstanced::iterate (void) m_indirectBuffer->getBoundMemory().getOffset(), dataSize + m_offsetInBuffer); + if (m_testIndirectCountExt) + { + m_offsetInCountBuffer = sizeof(tcu::Vec3); + m_indirectCountBuffer = Buffer::createAndAlloc(m_vk, + m_context.getDevice(), + BufferCreateInfo(m_offsetInCountBuffer + sizeof(m_drawCount), + vk::VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT), + m_context.getDefaultAllocator(), + vk::MemoryRequirement::HostVisible); + + deUint8* countBufferPtr = reinterpret_cast(m_indirectCountBuffer->getBoundMemory().getHostPtr()); + + if (m_isMultiDrawEnabled && m_drawCount <= m_drawIndirectMaxCount) + *(deUint32*)(countBufferPtr + m_offsetInCountBuffer) = m_drawCount; + else + *(deUint32*)(countBufferPtr + m_offsetInCountBuffer) = 1u; + + vk::flushMappedMemoryRange(m_vk, + m_context.getDevice(), + m_indirectCountBuffer->getBoundMemory().getMemory(), + m_indirectCountBuffer->getBoundMemory().getOffset(), + m_offsetInCountBuffer + sizeof(m_drawCount)); + } + m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline); if (m_drawType == DRAW_TYPE_INDEXED) @@ -643,11 +843,25 @@ tcu::TestStatus IndirectDrawInstanced::iterate (void) switch (m_drawType) { case DRAW_TYPE_SEQUENTIAL: - m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer); + { + if (m_testIndirectCountExt) + m_vk.cmdDrawIndirectCountKHR(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, + m_indirectCountBuffer->object(), m_offsetInCountBuffer, + m_drawCount + m_indirectCountExtDrawPadding, m_strideInBuffer); + else + m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer); break; + } case DRAW_TYPE_INDEXED: - m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer); + { + if (m_testIndirectCountExt) + m_vk.cmdDrawIndexedIndirectCountKHR(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, + m_indirectCountBuffer->object(), m_offsetInCountBuffer, + m_drawCount + m_indirectCountExtDrawPadding, m_strideInBuffer); + else + m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer, m_drawCount, m_strideInBuffer); break; + } default: TCU_FAIL("impossible"); } @@ -659,11 +873,25 @@ tcu::TestStatus IndirectDrawInstanced::iterate (void) switch (m_drawType) { case DRAW_TYPE_SEQUENTIAL: - m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1u, 0u); + { + if (m_testIndirectCountExt) + m_vk.cmdDrawIndirectCountKHR(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, + m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding, + m_strideInBuffer); + else + m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1u, 0u); break; + } case DRAW_TYPE_INDEXED: - m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1u, 0u); + { + if (m_testIndirectCountExt) + m_vk.cmdDrawIndexedIndirectCountKHR(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, + m_indirectCountBuffer->object(), m_offsetInCountBuffer, m_drawCount + m_indirectCountExtDrawPadding, + m_strideInBuffer); + else + m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), m_offsetInBuffer + drawNdx*m_strideInBuffer, 1u, 0u); break; + } default: TCU_FAIL("impossible"); } @@ -725,14 +953,13 @@ tcu::TestStatus IndirectDrawInstanced::iterate (void) qpTestResult res = QP_TEST_RESULT_PASS; if (!tcu::fuzzyCompare(log, "Result", "Image comparison result", - referenceFrame.getLevel(0), renderedFrame, 0.05f, - tcu::COMPARE_LOG_RESULT)) { + referenceFrame.getLevel(0), renderedFrame, 0.05f, tcu::COMPARE_LOG_RESULT)) + { res = QP_TEST_RESULT_FAIL; } return tcu::TestStatus(res, qpGetTestResultName(res)); - - } +} } // anonymous @@ -764,7 +991,8 @@ void IndirectDrawTests::init (void) tcu::TestCaseGroup* drawTypeGroup = new tcu::TestCaseGroup(m_testCtx, drawTypeStr.c_str(), ("Draws geometry using " + drawTypeStr + "draw call").c_str()); { - tcu::TestCaseGroup* indirectDrawGroup = new tcu::TestCaseGroup(m_testCtx, "indirect_draw", "Draws geometry"); + tcu::TestCaseGroup* indirectDrawGroup = new tcu::TestCaseGroup(m_testCtx, "indirect_draw", "Draws geometry"); + tcu::TestCaseGroup* indirectDrawCountGroup = new tcu::TestCaseGroup(m_testCtx, "indirect_draw_count", "Draws geometry with VK_KHR_draw_indirect_count extension"); { IndirectDraw::TestSpec testSpec; testSpec.drawType = static_cast(drawTypeIdx); @@ -774,43 +1002,91 @@ void IndirectDrawTests::init (void) indirectDrawGroup->addChild(new InstanceFactory(m_testCtx, "triangle_list", "Draws triangle list", testSpec)); testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; indirectDrawGroup->addChild(new InstanceFactory(m_testCtx, "triangle_strip", "Draws triangle strip", testSpec)); + + testSpec.testIndirectCountExt = true; + testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + indirectDrawCountGroup->addChild(new InstanceFactory(m_testCtx, "triangle_list", "Draws triangle list", testSpec)); + testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; + indirectDrawCountGroup->addChild(new InstanceFactory(m_testCtx, "triangle_strip", "Draws triangle strip", testSpec)); } drawTypeGroup->addChild(indirectDrawGroup); + drawTypeGroup->addChild(indirectDrawCountGroup); + + { + tcu::TestCaseGroup* indirectDrawFirstInstanceGroup = new tcu::TestCaseGroup(m_testCtx, "indirect_draw_first_instance", "Draws geometry with different first instance in one commandbuffer"); + tcu::TestCaseGroup* indirectDrawCountFirstInstanceGroup = new tcu::TestCaseGroup(m_testCtx, "indirect_draw_count_first_instance", "Draws geometry with VK_KHR_draw_indirect_count extension with different first instance in one commandbuffer using "); + { + IndirectDraw::TestSpec testSpec; + testSpec.testFirstInstanceNdx = true; + testSpec.drawType = static_cast(drawTypeIdx); + testSpec.shaders[glu::SHADERTYPE_VERTEX] = "vulkan/draw/VertexFetchInstanceIndex.vert"; + testSpec.shaders[glu::SHADERTYPE_FRAGMENT] = "vulkan/draw/VertexFetch.frag"; + testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + indirectDrawFirstInstanceGroup->addChild(new InstanceFactory(m_testCtx, "triangle_list", "Draws triangle list", testSpec)); + testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; + indirectDrawFirstInstanceGroup->addChild(new InstanceFactory(m_testCtx, "triangle_strip", "Draws triangle strip", testSpec)); + testSpec.testIndirectCountExt = true; + testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + indirectDrawCountFirstInstanceGroup->addChild(new InstanceFactory(m_testCtx, "triangle_list", "Draws triangle list", testSpec)); + testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; + indirectDrawCountFirstInstanceGroup->addChild(new InstanceFactory(m_testCtx, "triangle_strip", "Draws triangle strip", testSpec)); + } + drawTypeGroup->addChild(indirectDrawFirstInstanceGroup); + drawTypeGroup->addChild(indirectDrawCountFirstInstanceGroup); + } - tcu::TestCaseGroup* indirectDrawInstancedGroup = new tcu::TestCaseGroup(m_testCtx, "indirect_draw_instanced", "Draws an instanced geometry"); + tcu::TestCaseGroup* indirectDrawInstancedGroup = new tcu::TestCaseGroup(m_testCtx, "indirect_draw_instanced", "Draws an instanced geometry"); + tcu::TestCaseGroup* indirectDrawCountInstancedGroup = new tcu::TestCaseGroup(m_testCtx, "indirect_draw_count_instanced", "Draws an instanced geometry with VK_KHR_draw_indirect_count extension"); { - tcu::TestCaseGroup* noFirstInstanceGroup = new tcu::TestCaseGroup(m_testCtx, "no_first_instance", "Use 0 as firstInstance"); + tcu::TestCaseGroup* indirectDrawNoFirstInstanceGroup = new tcu::TestCaseGroup(m_testCtx, "no_first_instance", "Use 0 as firstInstance"); + tcu::TestCaseGroup* indirectDrawCountNoFirstInstanceGroup = new tcu::TestCaseGroup(m_testCtx, "no_first_instance", "Use 0 as firstInstance"); { - IndirectDrawInstanced::TestSpec testSpec; + IndirectDrawInstanced::TestSpec testSpec; testSpec.drawType = static_cast(drawTypeIdx); testSpec.shaders[glu::SHADERTYPE_VERTEX] = "vulkan/draw/VertexFetchInstanced.vert"; testSpec.shaders[glu::SHADERTYPE_FRAGMENT] = "vulkan/draw/VertexFetch.frag"; testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; - noFirstInstanceGroup->addChild(new InstanceFactory >(m_testCtx, "triangle_list", "Draws an instanced triangle list", testSpec)); + indirectDrawNoFirstInstanceGroup->addChild(new InstanceFactory >(m_testCtx, "triangle_list", "Draws an instanced triangle list", testSpec)); + testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; + indirectDrawNoFirstInstanceGroup->addChild(new InstanceFactory >(m_testCtx, "triangle_strip", "Draws an instanced triangle strip", testSpec)); + + testSpec.testIndirectCountExt = true; + testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + indirectDrawCountNoFirstInstanceGroup->addChild(new InstanceFactory >(m_testCtx, "triangle_list", "Draws an instanced triangle list", testSpec)); testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; - noFirstInstanceGroup->addChild(new InstanceFactory >(m_testCtx, "triangle_strip", "Draws an instanced triangle strip", testSpec)); + indirectDrawCountNoFirstInstanceGroup->addChild(new InstanceFactory >(m_testCtx, "triangle_strip", "Draws an instanced triangle strip", testSpec)); } - indirectDrawInstancedGroup->addChild(noFirstInstanceGroup); + indirectDrawInstancedGroup->addChild(indirectDrawNoFirstInstanceGroup); + indirectDrawCountInstancedGroup->addChild(indirectDrawCountNoFirstInstanceGroup); - tcu::TestCaseGroup* firstInstanceGroup = new tcu::TestCaseGroup(m_testCtx, "first_instance", "Use drawIndirectFirstInstance optional feature"); + tcu::TestCaseGroup* indirectDrawFirstInstanceGroup = new tcu::TestCaseGroup(m_testCtx, "first_instance", "Use drawIndirectFirstInstance optional feature"); + tcu::TestCaseGroup* indirectDrawCountFirstInstanceGroup = new tcu::TestCaseGroup(m_testCtx, "first_instance", "Use drawIndirectFirstInstance optional feature"); { - IndirectDrawInstanced::TestSpec testSpec; + IndirectDrawInstanced::TestSpec testSpec; testSpec.drawType = static_cast(drawTypeIdx); testSpec.shaders[glu::SHADERTYPE_VERTEX] = "vulkan/draw/VertexFetchInstancedFirstInstance.vert"; testSpec.shaders[glu::SHADERTYPE_FRAGMENT] = "vulkan/draw/VertexFetch.frag"; testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; - firstInstanceGroup->addChild(new InstanceFactory >(m_testCtx, "triangle_list", "Draws an instanced triangle list", testSpec)); + indirectDrawFirstInstanceGroup->addChild(new InstanceFactory >(m_testCtx, "triangle_list", "Draws an instanced triangle list", testSpec)); + testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; + indirectDrawFirstInstanceGroup->addChild(new InstanceFactory >(m_testCtx, "triangle_strip", "Draws an instanced triangle strip", testSpec)); + + testSpec.testIndirectCountExt = true; + testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + indirectDrawCountFirstInstanceGroup->addChild(new InstanceFactory >(m_testCtx, "triangle_list", "Draws an instanced triangle list", testSpec)); testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; - firstInstanceGroup->addChild(new InstanceFactory >(m_testCtx, "triangle_strip", "Draws an instanced triangle strip", testSpec)); + indirectDrawCountFirstInstanceGroup->addChild(new InstanceFactory >(m_testCtx, "triangle_strip", "Draws an instanced triangle strip", testSpec)); } - indirectDrawInstancedGroup->addChild(firstInstanceGroup); + indirectDrawInstancedGroup->addChild(indirectDrawFirstInstanceGroup); + indirectDrawCountInstancedGroup->addChild(indirectDrawCountFirstInstanceGroup); } drawTypeGroup->addChild(indirectDrawInstancedGroup); + drawTypeGroup->addChild(indirectDrawCountInstancedGroup); } addChild(drawTypeGroup); diff --git a/external/vulkancts/mustpass/1.1.0/vk-default-no-waivers.txt b/external/vulkancts/mustpass/1.1.0/vk-default-no-waivers.txt index 165c8d5..25ef020 100644 --- a/external/vulkancts/mustpass/1.1.0/vk-default-no-waivers.txt +++ b/external/vulkancts/mustpass/1.1.0/vk-default-no-waivers.txt @@ -204830,16 +204830,36 @@ dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_list dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_strip dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_list dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_strip +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count.triangle_list +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count.triangle_strip +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_first_instance.triangle_list +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_first_instance.triangle_strip +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_first_instance.triangle_list +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_first_instance.triangle_strip dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_list dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_strip dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_list dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_strip +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_instanced.no_first_instance.triangle_list +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_instanced.no_first_instance.triangle_strip +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_instanced.first_instance.triangle_list +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_instanced.first_instance.triangle_strip dEQP-VK.draw.indirect_draw.indexed.indirect_draw.triangle_list dEQP-VK.draw.indirect_draw.indexed.indirect_draw.triangle_strip +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count.triangle_list +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count.triangle_strip +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_first_instance.triangle_list +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_first_instance.triangle_strip +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_first_instance.triangle_list +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_first_instance.triangle_strip dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.no_first_instance.triangle_list dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.no_first_instance.triangle_strip dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.first_instance.triangle_list dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.first_instance.triangle_strip +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_instanced.no_first_instance.triangle_list +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_instanced.no_first_instance.triangle_strip +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_instanced.first_instance.triangle_list +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_instanced.first_instance.triangle_strip dEQP-VK.draw.basic_draw.draw.point_list.1 dEQP-VK.draw.basic_draw.draw.point_list.3 dEQP-VK.draw.basic_draw.draw.point_list.17 diff --git a/external/vulkancts/mustpass/1.1.0/vk-default.txt b/external/vulkancts/mustpass/1.1.0/vk-default.txt index ba0e719..0c20f91 100755 --- a/external/vulkancts/mustpass/1.1.0/vk-default.txt +++ b/external/vulkancts/mustpass/1.1.0/vk-default.txt @@ -204792,16 +204792,36 @@ dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_list dEQP-VK.draw.indexed_draw.draw_instanced_indexed_triangle_strip dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_list dEQP-VK.draw.indirect_draw.sequential.indirect_draw.triangle_strip +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count.triangle_list +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count.triangle_strip +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_first_instance.triangle_list +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_first_instance.triangle_strip +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_first_instance.triangle_list +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_first_instance.triangle_strip dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_list dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.no_first_instance.triangle_strip dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_list dEQP-VK.draw.indirect_draw.sequential.indirect_draw_instanced.first_instance.triangle_strip +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_instanced.no_first_instance.triangle_list +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_instanced.no_first_instance.triangle_strip +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_instanced.first_instance.triangle_list +dEQP-VK.draw.indirect_draw.sequential.indirect_draw_count_instanced.first_instance.triangle_strip dEQP-VK.draw.indirect_draw.indexed.indirect_draw.triangle_list dEQP-VK.draw.indirect_draw.indexed.indirect_draw.triangle_strip +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count.triangle_list +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count.triangle_strip +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_first_instance.triangle_list +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_first_instance.triangle_strip +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_first_instance.triangle_list +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_first_instance.triangle_strip dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.no_first_instance.triangle_list dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.no_first_instance.triangle_strip dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.first_instance.triangle_list dEQP-VK.draw.indirect_draw.indexed.indirect_draw_instanced.first_instance.triangle_strip +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_instanced.no_first_instance.triangle_list +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_instanced.no_first_instance.triangle_strip +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_instanced.first_instance.triangle_list +dEQP-VK.draw.indirect_draw.indexed.indirect_draw_count_instanced.first_instance.triangle_strip dEQP-VK.draw.basic_draw.draw.point_list.1 dEQP-VK.draw.basic_draw.draw.point_list.3 dEQP-VK.draw.basic_draw.draw.point_list.17 diff --git a/external/vulkancts/scripts/src/vulkan.h.in b/external/vulkancts/scripts/src/vulkan.h.in index 00cc5a8..fa8013f 100644 --- a/external/vulkancts/scripts/src/vulkan.h.in +++ b/external/vulkancts/scripts/src/vulkan.h.in @@ -6270,6 +6270,34 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCountAMD( uint32_t stride); #endif + +#define VK_KHR_draw_indirect_count 1 +#define VK_KHR_DRAW_INDIRECT_COUNT_SPEC_VERSION 1 +#define VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME "VK_KHR_draw_indirect_count" + +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCountKHR)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCountKHR)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCountKHR( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset, + VkBuffer countBuffer, + VkDeviceSize countBufferOffset, + uint32_t maxDrawCount, + uint32_t stride); + +VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCountKHR( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset, + VkBuffer countBuffer, + VkDeviceSize countBufferOffset, + uint32_t maxDrawCount, + uint32_t stride); +#endif + #define VK_AMD_negative_viewport_height 1 #define VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_SPEC_VERSION 1 #define VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_EXTENSION_NAME "VK_AMD_negative_viewport_height"