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 @@
 # 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_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		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 @@
 	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 @@
 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* 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.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 @@
 	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 @@
 	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		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 @@
 		"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 @@
 
 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 @@
 	template<typename T> void	addCommand		(const T&);
 
 protected:
-	std::vector<char>		m_indirectBufferContents;
+	void						setVertexBuffer						(void);
+	void						setFirstInstanceVertexBuffer		(void);
+
+	std::vector<char>			m_indirectBufferContents;
 	de::SharedPtr<Buffer>		m_indirectBuffer;
-	vk::VkDeviceSize		m_offsetInBuffer;
-	deUint32			m_strideInBuffer;
+	vk::VkDeviceSize			m_offsetInBuffer;
+	deUint32					m_strideInBuffer;
 
-	deUint32			m_drawCount;
-	JunkData			m_junkData;
+	const bool					m_testIndirectCountExt;
+	de::SharedPtr<Buffer>		m_indirectCountBuffer;
+	vk::VkDeviceSize			m_offsetInCountBuffer;
+	const deUint32				m_indirectCountExtDrawPadding;
 
-	const DrawType			m_drawType;
-	deBool				m_isMultiDrawEnabled;
-	deUint32			m_drawIndirectMaxCount;
+	deUint32					m_drawCount;
+	JunkData					m_junkData;
+
+	const DrawType				m_drawType;
+	const bool					m_testFirstInstanceNdx;
+	deBool						m_isMultiDrawEnabled;
+	deUint32					m_drawIndirectMaxCount;
 
 	de::SharedPtr<Buffer>		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 @@
 	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 @@
 	}
 
 	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 @@
 	}
 
 	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 @@
 	}
 
 	// 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 @@
 }
 
 template<>
-void IndirectDraw::addCommand<vk::VkDrawIndexedIndirectCommand>(const vk::VkDrawIndexedIndirectCommand& command)
+void IndirectDraw::addCommand<vk::VkDrawIndexedIndirectCommand> (const vk::VkDrawIndexedIndirectCommand& command)
 {
 	DE_ASSERT(m_drawType == DRAW_TYPE_INDEXED);
 
@@ -228,22 +313,27 @@
 			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 @@
 			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 @@
 			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 @@
 			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 @@
 							   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<deUint8*>(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 @@
 		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 @@
 			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 @@
 	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<class FirstInstanceSupport>
@@ -507,6 +663,11 @@
 				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 @@
 				addCommand(drawCmd[0]);
 				addCommand(drawCmd[1]);
 				addCommand(drawCmd[2]);
+				if (m_testIndirectCountExt)
+				{
+					addCommand(drawCmd[1]);
+					addCommand(drawCmd[1]);
+				}
 				break;
 			}
 			default:
@@ -566,6 +732,11 @@
 				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 @@
 				addCommand(drawCmd[0]);
 				addCommand(drawCmd[1]);
 				addCommand(drawCmd[2]);
+				if (m_testIndirectCountExt)
+				{
+					addCommand(drawCmd[1]);
+					addCommand(drawCmd[1]);
+				}
 				break;
 			}
 			default:
@@ -631,6 +807,30 @@
 							   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<deUint8*>(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 @@
 		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 @@
 			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 @@
 	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 @@
 
 		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<DrawType>(drawTypeIdx);
@@ -774,43 +1002,91 @@
 				indirectDrawGroup->addChild(new InstanceFactory<IndirectDraw>(m_testCtx, "triangle_list", "Draws triangle list", testSpec));
 				testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
 				indirectDrawGroup->addChild(new InstanceFactory<IndirectDraw>(m_testCtx, "triangle_strip", "Draws triangle strip", testSpec));
+
+				testSpec.testIndirectCountExt = true;
+				testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+				indirectDrawCountGroup->addChild(new InstanceFactory<IndirectDraw>(m_testCtx, "triangle_list", "Draws triangle list", testSpec));
+				testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
+				indirectDrawCountGroup->addChild(new InstanceFactory<IndirectDraw>(m_testCtx, "triangle_strip", "Draws triangle strip", testSpec));
 			}
 			drawTypeGroup->addChild(indirectDrawGroup);
+			drawTypeGroup->addChild(indirectDrawCountGroup);
 
-
-			tcu::TestCaseGroup* indirectDrawInstancedGroup = new tcu::TestCaseGroup(m_testCtx, "indirect_draw_instanced", "Draws an instanced geometry");
 			{
-				tcu::TestCaseGroup*	noFirstInstanceGroup = new tcu::TestCaseGroup(m_testCtx, "no_first_instance", "Use 0 as firstInstance");
+				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 ");
 				{
-					IndirectDrawInstanced<FirtsInstanceNotSupported>::TestSpec testSpec;
+					IndirectDraw::TestSpec testSpec;
+					testSpec.testFirstInstanceNdx = true;
+					testSpec.drawType = static_cast<DrawType>(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<IndirectDraw>(m_testCtx, "triangle_list", "Draws triangle list", testSpec));
+					testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
+					indirectDrawFirstInstanceGroup->addChild(new InstanceFactory<IndirectDraw>(m_testCtx, "triangle_strip", "Draws triangle strip", testSpec));
+
+					testSpec.testIndirectCountExt = true;
+					testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+					indirectDrawCountFirstInstanceGroup->addChild(new InstanceFactory<IndirectDraw>(m_testCtx, "triangle_list", "Draws triangle list", testSpec));
+					testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
+					indirectDrawCountFirstInstanceGroup->addChild(new InstanceFactory<IndirectDraw>(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* indirectDrawCountInstancedGroup	= new tcu::TestCaseGroup(m_testCtx, "indirect_draw_count_instanced", "Draws an instanced geometry with VK_KHR_draw_indirect_count extension");
+			{
+				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<FirstInstanceNotSupported>::TestSpec testSpec;
 					testSpec.drawType = static_cast<DrawType>(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<IndirectDrawInstanced<FirtsInstanceNotSupported> >(m_testCtx, "triangle_list", "Draws an instanced triangle list", testSpec));
+					indirectDrawNoFirstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirstInstanceNotSupported> >(m_testCtx, "triangle_list", "Draws an instanced triangle list", testSpec));
 					testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
-					noFirstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirtsInstanceNotSupported> >(m_testCtx, "triangle_strip", "Draws an instanced triangle strip", testSpec));
-				}
-				indirectDrawInstancedGroup->addChild(noFirstInstanceGroup);
+					indirectDrawNoFirstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirstInstanceNotSupported> >(m_testCtx, "triangle_strip", "Draws an instanced triangle strip", testSpec));
 
-				tcu::TestCaseGroup*	firstInstanceGroup = new tcu::TestCaseGroup(m_testCtx, "first_instance", "Use drawIndirectFirstInstance optional feature");
+					testSpec.testIndirectCountExt = true;
+					testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
+					indirectDrawCountNoFirstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirstInstanceNotSupported> >(m_testCtx, "triangle_list", "Draws an instanced triangle list", testSpec));
+					testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
+					indirectDrawCountNoFirstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirstInstanceNotSupported> >(m_testCtx, "triangle_strip", "Draws an instanced triangle strip", testSpec));
+				}
+				indirectDrawInstancedGroup->addChild(indirectDrawNoFirstInstanceGroup);
+				indirectDrawCountInstancedGroup->addChild(indirectDrawCountNoFirstInstanceGroup);
+
+				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<FirtsInstanceSupported>::TestSpec testSpec;
+					IndirectDrawInstanced<FirstInstanceSupported>::TestSpec testSpec;
 					testSpec.drawType = static_cast<DrawType>(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<IndirectDrawInstanced<FirtsInstanceSupported> >(m_testCtx, "triangle_list", "Draws an instanced triangle list", testSpec));
+					indirectDrawFirstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirstInstanceSupported> >(m_testCtx, "triangle_list", "Draws an instanced triangle list", testSpec));
 					testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
-					firstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirtsInstanceSupported> >(m_testCtx, "triangle_strip", "Draws an instanced triangle strip", testSpec));
+					indirectDrawFirstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirstInstanceSupported> >(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<IndirectDrawInstanced<FirstInstanceSupported> >(m_testCtx, "triangle_list", "Draws an instanced triangle list", testSpec));
+					testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
+					indirectDrawCountFirstInstanceGroup->addChild(new InstanceFactory<IndirectDrawInstanced<FirstInstanceSupported> >(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_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_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 @@
     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"