18ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski/*------------------------------------------------------------------------
28ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski * Vulkan Conformance Tests
38ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski * ------------------------
48ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski *
58ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski * Copyright (c) 2016 The Khronos Group Inc.
68ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski *
78ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski * Licensed under the Apache License, Version 2.0 (the "License");
88ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski * you may not use this file except in compliance with the License.
98ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski * You may obtain a copy of the License at
108ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski *
118ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski *      http://www.apache.org/licenses/LICENSE-2.0
128ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski *
138ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski * Unless required by applicable law or agreed to in writing, software
148ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski * distributed under the License is distributed on an "AS IS" BASIS,
158ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
168ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski * See the License for the specific language governing permissions and
178ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski * limitations under the License.
188ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski *
198ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski *//*!
208ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski * \file
218ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski * \brief VK_KHR_shader_draw_parameters tests
228ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski *//*--------------------------------------------------------------------*/
238ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
248ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski#include "vktDrawShaderDrawParametersTests.hpp"
258ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
268ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski#include "vktTestCaseUtil.hpp"
278ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski#include "vktDrawTestCaseUtil.hpp"
288ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski#include "vktDrawBaseClass.hpp"
298ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
308ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski#include "vkQueryUtil.hpp"
318ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
328ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski#include "tcuTestLog.hpp"
338ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski#include "tcuImageCompare.hpp"
348ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski#include "tcuTextureUtil.hpp"
358ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
368ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskinamespace vkt
378ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski{
388ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskinamespace Draw
398ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski{
408ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskinamespace
418ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski{
428ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
438ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskienum TestFlagBits
448ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski{
458ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	TEST_FLAG_INSTANCED			= 1u << 0,
468ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	TEST_FLAG_INDEXED			= 1u << 1,
478ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	TEST_FLAG_INDIRECT			= 1u << 2,
488ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	TEST_FLAG_MULTIDRAW			= 1u << 3,	//!< multiDrawIndirect
498ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	TEST_FLAG_FIRST_INSTANCE	= 1u << 4,	//!< drawIndirectFirstInstance
508ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski};
518ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskitypedef deUint32 TestFlags;
528ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
538ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskistruct FlagsTestSpec : public TestSpecBase
548ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski{
558ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	TestFlags	flags;
568ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski};
578ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
588ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskiinline FlagsTestSpec addFlags (FlagsTestSpec spec, const TestFlags flags)
598ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski{
608ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	spec.flags |= flags;
618ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	return spec;
628ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski}
638ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
648ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskienum Constants
658ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski{
668ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	// \note Data layout in buffers (junk data and good data is intertwined).
678ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	//       Values are largely arbitrary, but we try to avoid "nice" numbers to make sure the test doesn't pass by accident.
688ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	NUM_VERTICES			= 4,	//!< number of consecutive good vertices
698ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	NDX_FIRST_VERTEX		= 2,	//!< index of first good vertex data
708ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	NDX_SECOND_VERTEX		= 9,	//!< index of second good vertex data
718ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	NDX_FIRST_INDEX			= 11,	//!< index of a first good index (in index data)
728ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	NDX_SECOND_INDEX		= 17,	//!< index of a second good index
738ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	OFFSET_FIRST_INDEX		= 1,	//!< offset added to the first index
748ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	OFFSET_SECOND_INDEX		= 4,	//!< offset added to the second index
758ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	MAX_INSTANCE_COUNT		= 3,	//!< max number of draw instances
768ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	MAX_INDIRECT_DRAW_COUNT	= 3,	//!< max drawCount of indirect calls
778ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski};
788ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
798ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskiclass DrawTest : public DrawTestsBaseClass
808ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski{
818ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskipublic:
828ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	typedef FlagsTestSpec	TestSpec;
838ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski							DrawTest				(Context &context, TestSpec testSpec);
848ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	tcu::TestStatus			iterate					(void);
858ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
868ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskiprivate:
878ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	template<typename T, std::size_t N>
888ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	void					setIndirectCommand		(const T (&pCmdData)[N]);
898ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
908ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	void					drawReferenceImage		(const tcu::PixelBufferAccess& refImage) const;
918ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
928ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	bool					isInstanced				(void) const { return (m_flags & TEST_FLAG_INSTANCED)		!= 0; }
938ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	bool					isIndexed				(void) const { return (m_flags & TEST_FLAG_INDEXED)			!= 0; }
948ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	bool					isIndirect				(void) const { return (m_flags & TEST_FLAG_INDIRECT)		!= 0; }
958ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	bool					isMultiDraw				(void) const { return (m_flags & TEST_FLAG_MULTIDRAW)		!= 0; }
968ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	bool					isFirstInstance			(void) const { return (m_flags & TEST_FLAG_FIRST_INSTANCE)	!= 0; }
978ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
988ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	const TestFlags			m_flags;
998ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	de::SharedPtr<Buffer>	m_indexBuffer;
1008ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	de::SharedPtr<Buffer>	m_indirectBuffer;
1018ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski};
1028ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1038ba59662bff835d72077feb906ace49c17a09a52Maciej JesionowskiDrawTest::DrawTest (Context &context, TestSpec testSpec)
1048ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	: DrawTestsBaseClass(context, testSpec.shaders[glu::SHADERTYPE_VERTEX], testSpec.shaders[glu::SHADERTYPE_FRAGMENT], testSpec.topology)
1058ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	, m_flags			(testSpec.flags)
1068ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski{
1078ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	DE_ASSERT(m_topology == vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP);
1088ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	DE_ASSERT(!isMultiDraw()     || isIndirect());
1098ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	DE_ASSERT(!isFirstInstance() || (isIndirect() && isInstanced()));
1108ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1118ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	// Requirements
1128ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	{
1138ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		if (!de::contains(m_context.getDeviceExtensions().begin(), m_context.getDeviceExtensions().end(), std::string("VK_KHR_shader_draw_parameters")))
1148ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			TCU_THROW(NotSupportedError, "Missing extension: VK_KHR_shader_draw_parameters");
1158ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1168ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		if (isMultiDraw() && !m_context.getDeviceFeatures().multiDrawIndirect)
1178ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			TCU_THROW(NotSupportedError, "Missing feature: multiDrawIndirect");
1188ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1198ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		if (isFirstInstance() && !m_context.getDeviceFeatures().drawIndirectFirstInstance)
1208ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			TCU_THROW(NotSupportedError, "Missing feature: drawIndirectFirstInstance");
1218ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	}
1228ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1238ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	// Vertex data
1248ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	{
1258ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		int refIndex = NDX_FIRST_VERTEX - OFFSET_FIRST_INDEX;
1268ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1278ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_data.push_back(VertexElementData(tcu::Vec4( 1.0f, -1.0f, 1.0f, 1.0f), tcu::Vec4(1.0f), -1));
1288ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_data.push_back(VertexElementData(tcu::Vec4(-1.0f,  1.0f, 1.0f, 1.0f), tcu::Vec4(1.0f), -1));
1298ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1308ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		if (!isIndexed())
1318ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			refIndex = 0;
1328ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1338ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,	-0.3f, 1.0f, 1.0f), tcu::Vec4(1.0f), refIndex++));
1348ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,	 0.3f, 1.0f, 1.0f), tcu::Vec4(1.0f), refIndex++));
1358ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_data.push_back(VertexElementData(tcu::Vec4( 0.3f,	-0.3f, 1.0f, 1.0f), tcu::Vec4(1.0f), refIndex++));
1368ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_data.push_back(VertexElementData(tcu::Vec4( 0.3f,	 0.3f, 1.0f, 1.0f), tcu::Vec4(1.0f), refIndex++));
1378ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1388ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_data.push_back(VertexElementData(tcu::Vec4(-1.0f,  1.0f, 1.0f, 1.0f), tcu::Vec4(1.0f), -1));
1398ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_data.push_back(VertexElementData(tcu::Vec4( 1.0f, -1.0f, 1.0f, 1.0f), tcu::Vec4(1.0f), -1));
1408ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_data.push_back(VertexElementData(tcu::Vec4(-1.0f, -1.0f, 1.0f, 1.0f), tcu::Vec4(1.0f), -1));
1418ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1428ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		if (!isIndexed())
1438ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			refIndex = 0;
1448ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1458ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,	-0.3f, 1.0f, 1.0f), tcu::Vec4(1.0f), refIndex++));
1468ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_data.push_back(VertexElementData(tcu::Vec4(-0.3f,	 0.3f, 1.0f, 1.0f), tcu::Vec4(1.0f), refIndex++));
1478ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_data.push_back(VertexElementData(tcu::Vec4( 0.3f,	-0.3f, 1.0f, 1.0f), tcu::Vec4(1.0f), refIndex++));
1488ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_data.push_back(VertexElementData(tcu::Vec4( 0.3f,	 0.3f, 1.0f, 1.0f), tcu::Vec4(1.0f), refIndex++));
1498ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1508ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_data.push_back(VertexElementData(tcu::Vec4(-1.0f,  1.0f, 1.0f, 1.0f), tcu::Vec4(1.0f), -1));
1518ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_data.push_back(VertexElementData(tcu::Vec4( 1.0f, -1.0f, 1.0f, 1.0f), tcu::Vec4(1.0f), -1));
1528ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1538ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		// Make sure constants are up to date
1548ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		DE_ASSERT(m_data.size() == NDX_SECOND_VERTEX + NUM_VERTICES + 2);
1558ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		DE_ASSERT(NDX_SECOND_VERTEX - NDX_FIRST_VERTEX - NUM_VERTICES == 3);
1568ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	}
1578ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1588ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	if (isIndirect())
1598ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	{
1608ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		const std::size_t	indirectBufferSize	= MAX_INDIRECT_DRAW_COUNT * 32;	// space for COUNT commands plus some gratuitous padding
1618ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski							m_indirectBuffer	= Buffer::createAndAlloc(m_vk, m_context.getDevice(), BufferCreateInfo(indirectBufferSize, vk::VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT),
1628ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski												  m_context.getDefaultAllocator(), vk::MemoryRequirement::HostVisible);
1638ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1648ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		deMemset(m_indirectBuffer->getBoundMemory().getHostPtr(), 0, indirectBufferSize);
1658ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		vk::flushMappedMemoryRange(m_vk, m_context.getDevice(), m_indirectBuffer->getBoundMemory().getMemory(), m_indirectBuffer->getBoundMemory().getOffset(), VK_WHOLE_SIZE);
1668ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	}
1678ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1688ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	if (isIndexed())
1698ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	{
1708ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		DE_ASSERT(NDX_FIRST_INDEX + NUM_VERTICES <= NDX_SECOND_INDEX);
1718ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		const std::size_t	indexBufferSize	= sizeof(deUint32) * (NDX_SECOND_INDEX + NUM_VERTICES);
1728ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski							m_indexBuffer	= Buffer::createAndAlloc(m_vk, m_context.getDevice(), BufferCreateInfo(indexBufferSize, vk::VK_BUFFER_USAGE_INDEX_BUFFER_BIT),
1738ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski																	 m_context.getDefaultAllocator(), vk::MemoryRequirement::HostVisible);
1748ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		deUint32*			indices			= static_cast<deUint32*>(m_indexBuffer->getBoundMemory().getHostPtr());
1758ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1768ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		deMemset(indices, 0, indexBufferSize);
1778ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1788ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		for (int i = 0; i < NUM_VERTICES; i++)
1798ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		{
1808ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			indices[NDX_FIRST_INDEX  + i] = static_cast<deUint32>(NDX_FIRST_VERTEX  + i) - OFFSET_FIRST_INDEX;
1818ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			indices[NDX_SECOND_INDEX + i] = static_cast<deUint32>(NDX_SECOND_VERTEX + i) - OFFSET_SECOND_INDEX;
1828ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		}
1838ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1848ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		vk::flushMappedMemoryRange(m_vk, m_context.getDevice(), m_indexBuffer->getBoundMemory().getMemory(), m_indexBuffer->getBoundMemory().getOffset(), VK_WHOLE_SIZE);
1858ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	}
1868ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1878ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	initialize();
1888ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski}
1898ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1908ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskitemplate<typename T, std::size_t N>
1918ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskivoid DrawTest::setIndirectCommand (const T (&pCmdData)[N])
1928ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski{
1938ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	DE_ASSERT(N != 0 && N <= MAX_INDIRECT_DRAW_COUNT);
1948ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1958ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	const std::size_t dataSize = N * sizeof(T);
1968ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
1978ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	deMemcpy(m_indirectBuffer->getBoundMemory().getHostPtr(), pCmdData, dataSize);
1988ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	vk::flushMappedMemoryRange(m_vk, m_context.getDevice(), m_indirectBuffer->getBoundMemory().getMemory(), m_indirectBuffer->getBoundMemory().getOffset(), VK_WHOLE_SIZE);
1998ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski}
2008ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
2018ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski//! This function must be kept in sync with the shader.
2028ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskivoid DrawTest::drawReferenceImage (const tcu::PixelBufferAccess& refImage) const
2038ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski{
2048ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	using tcu::Vec2;
2058ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	using tcu::Vec4;
2068ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	using tcu::IVec4;
2078ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
2088ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	const Vec2	perInstanceOffset[]	= { Vec2(0.0f, 0.0f), Vec2(-0.3f,  0.0f), Vec2(0.0f, 0.3f) };
2098ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	const Vec2	perDrawOffset[]		= { Vec2(0.0f, 0.0f), Vec2(-0.3f, -0.3f), Vec2(0.3f, 0.3f) };
2108ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	const Vec4	allColors[]			= { Vec4(1.0f), Vec4(0.0f, 0.0f, 1.0f, 1.0f), Vec4(0.0f, 1.0f, 0.0f, 1.0f) };
2118ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	const int	numInstances		= isInstanced() ? MAX_INSTANCE_COUNT		: 1;
2128ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	const int	numIndirectDraws	= isMultiDraw() ? MAX_INDIRECT_DRAW_COUNT	: 1;
2138ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	const int	rectWidth			= static_cast<int>(WIDTH  * 0.6f / 2.0f);
2148ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	const int	rectHeight			= static_cast<int>(HEIGHT * 0.6f / 2.0f);
2158ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
2168ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	DE_ASSERT(DE_LENGTH_OF_ARRAY(perInstanceOffset) >= numInstances);
2178ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	DE_ASSERT(DE_LENGTH_OF_ARRAY(allColors) >= numInstances && DE_LENGTH_OF_ARRAY(allColors) >= numIndirectDraws);
2188ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	DE_ASSERT(DE_LENGTH_OF_ARRAY(perDrawOffset) >= numIndirectDraws);
2198ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
2208ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	tcu::clear(refImage, tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
2218ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
2228ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	for (int drawNdx     = 0; drawNdx     < numIndirectDraws; ++drawNdx)
2238ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	for (int instanceNdx = 0; instanceNdx < numInstances;     ++instanceNdx)
2248ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	{
2258ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		const Vec2	offset	= perInstanceOffset[instanceNdx] + perDrawOffset[drawNdx];
2268ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		const Vec4&	color	= allColors[isMultiDraw() ? drawNdx : instanceNdx];
2278ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		int			x		= static_cast<int>(WIDTH  * (1.0f - 0.3f + offset.x()) / 2.0f);
2288ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		int			y		= static_cast<int>(HEIGHT * (1.0f - 0.3f + offset.y()) / 2.0f);
2298ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
2308ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		tcu::clear(tcu::getSubregion(refImage, x, y, rectWidth, rectHeight), color);
2318ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	}
2328ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski}
2338ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
2348ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskitcu::TestStatus DrawTest::iterate (void)
2358ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski{
2368ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	// Draw
2378ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	{
2388ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		beginRenderPass();
2398ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
2408ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		const vk::VkDeviceSize	vertexBufferOffset	= 0;
2418ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		const vk::VkBuffer		vertexBuffer		= m_vertexBuffer->object();
2428ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
2438ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_vk.cmdBindVertexBuffers	(*m_cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
2448ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_vk.cmdBindPipeline		(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
2458ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
2468ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		if (isIndexed())
2478ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			m_vk.cmdBindIndexBuffer(*m_cmdBuffer, m_indexBuffer->object(), 0ull, vk::VK_INDEX_TYPE_UINT32);
2488ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
2498ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		const deUint32			numInstances		= isInstanced() ? MAX_INSTANCE_COUNT : 1;
2508ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
2518ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		if (isIndirect())
2528ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		{
2538ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			if (isIndexed())
2548ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			{
2558ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski				const vk::VkDrawIndexedIndirectCommand commands[] =
2568ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski				{
2578ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski					// indexCount, instanceCount, firstIndex, vertexOffset, firstInstance
2588ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski					{ NUM_VERTICES,	numInstances,	NDX_FIRST_INDEX,	OFFSET_FIRST_INDEX,		(isFirstInstance() ? 2u : 0u) },
2598ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski					{ NUM_VERTICES,	numInstances,	NDX_SECOND_INDEX,	OFFSET_SECOND_INDEX,	(isFirstInstance() ? 1u : 0u) },
2608ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski					{ NUM_VERTICES,	numInstances,	NDX_FIRST_INDEX,	OFFSET_FIRST_INDEX,		(isFirstInstance() ? 3u : 0u) },
2618ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski				};
2628ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski				setIndirectCommand(commands);
2638ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			}
2648ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			else
2658ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			{
2668ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski				const vk::VkDrawIndirectCommand commands[] =
2678ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski				{
2688ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski					// vertexCount, instanceCount, firstVertex, firstInstance
2698ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski					{ NUM_VERTICES,	numInstances,	NDX_FIRST_VERTEX,	(isFirstInstance() ? 2u : 0u) },
2708ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski					{ NUM_VERTICES,	numInstances,	NDX_SECOND_VERTEX,	(isFirstInstance() ? 1u : 0u) },
2718ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski					{ NUM_VERTICES,	numInstances,	NDX_FIRST_VERTEX,	(isFirstInstance() ? 3u : 0u) },
2728ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski				};
2738ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski				setIndirectCommand(commands);
2748ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			}
2758ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		}
2768ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
2778ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		if (isIndirect())
2788ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		{
2798ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			const deUint32 numIndirectDraws = isMultiDraw() ? MAX_INDIRECT_DRAW_COUNT : 1;
2808ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
2818ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			if (isIndexed())
2828ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski				m_vk.cmdDrawIndexedIndirect(*m_cmdBuffer, m_indirectBuffer->object(), 0ull, numIndirectDraws, sizeof(vk::VkDrawIndexedIndirectCommand));
2838ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			else
2848ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski				m_vk.cmdDrawIndirect(*m_cmdBuffer, m_indirectBuffer->object(), 0ull, numIndirectDraws, sizeof(vk::VkDrawIndirectCommand));
2858ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		}
2868ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		else
2878ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		{
2888ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			const deUint32 firstInstance = 2;
2898ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
2908ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			if (isIndexed())
2918ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski				m_vk.cmdDrawIndexed(*m_cmdBuffer, NUM_VERTICES, numInstances, NDX_FIRST_INDEX, OFFSET_FIRST_INDEX, firstInstance);
2928ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			else
2938ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski				m_vk.cmdDraw(*m_cmdBuffer, NUM_VERTICES, numInstances, NDX_FIRST_VERTEX, firstInstance);
2948ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		}
2958ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
2968ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_vk.cmdEndRenderPass(*m_cmdBuffer);
2978ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		m_vk.endCommandBuffer(*m_cmdBuffer);
2988ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	}
2998ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
3008ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	// Submit
3018ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	{
3028ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		const vk::VkQueue		queue		= m_context.getUniversalQueue();
3038ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		const vk::VkSubmitInfo	submitInfo	=
3048ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		{
3058ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,			// VkStructureType			sType;
3068ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			DE_NULL,									// const void*				pNext;
3078ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			0,											// deUint32					waitSemaphoreCount;
3088ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			DE_NULL,									// const VkSemaphore*		pWaitSemaphores;
3098ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			(const vk::VkPipelineStageFlags*)DE_NULL,
3108ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			1,											// deUint32					commandBufferCount;
3118ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			&m_cmdBuffer.get(),							// const VkCommandBuffer*	pCommandBuffers;
3128ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			0,											// deUint32					signalSemaphoreCount;
3138ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			DE_NULL										// const VkSemaphore*		pSignalSemaphores;
3148ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		};
3158ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		VK_CHECK(m_vk.queueSubmit(queue, 1, &submitInfo, DE_NULL));
3168ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		VK_CHECK(m_vk.queueWaitIdle(queue));
3178ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	}
3188ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
3198ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	// Validate
3208ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	{
3218ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		tcu::TextureLevel referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), static_cast<int>(0.5f + WIDTH), static_cast<int>(0.5f + HEIGHT));
3228ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
3238ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		drawReferenceImage(referenceFrame.getAccess());
3248ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
3258ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		const vk::VkOffset3D				zeroOffset		= { 0, 0, 0 };
3268ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		const tcu::ConstPixelBufferAccess	renderedFrame	= m_colorTargetImage->readSurface(m_context.getUniversalQueue(), m_context.getDefaultAllocator(),
3278ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski															  vk::VK_IMAGE_LAYOUT_GENERAL, zeroOffset, WIDTH, HEIGHT, vk::VK_IMAGE_ASPECT_COLOR_BIT);
3288ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
3298ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		if (!tcu::fuzzyCompare(m_context.getTestContext().getLog(), "Result", "Image comparison result", referenceFrame.getAccess(), renderedFrame, 0.05f, tcu::COMPARE_LOG_RESULT))
3308ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			return tcu::TestStatus::fail("Rendered image is incorrect");
3318ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		else
3328ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski			return tcu::TestStatus::pass("OK");
3338ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	}
3348ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski}
3358ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
3368ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskivoid addDrawCase (tcu::TestCaseGroup* group, const DrawTest::TestSpec testSpec, const TestFlags flags)
3378ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski{
3388ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	std::ostringstream name;
3398ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	name << "draw";
3408ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
3418ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	if (flags & TEST_FLAG_INDEXED)			name << "_indexed";
3428ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	if (flags & TEST_FLAG_INDIRECT)			name << "_indirect";
3438ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	if (flags & TEST_FLAG_INSTANCED)		name << "_instanced";
3448ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	if (flags & TEST_FLAG_FIRST_INSTANCE)	name << "_first_instance";
3458ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
3468ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	group->addChild(new InstanceFactory<DrawTest>(group->getTestContext(), name.str(), "", addFlags(testSpec, flags)));
3478ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski}
3488ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
3498ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski}	// anonymous
3508ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
3518ba59662bff835d72077feb906ace49c17a09a52Maciej JesionowskiShaderDrawParametersTests::ShaderDrawParametersTests (tcu::TestContext &testCtx)
3528ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	: TestCaseGroup	(testCtx, "shader_draw_parameters", "VK_KHR_shader_draw_parameters")
3538ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski{
3548ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski}
3558ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
3568ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowskivoid ShaderDrawParametersTests::init (void)
3578ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski{
3588ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	{
3598ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		DrawTest::TestSpec testSpec;
3608ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		testSpec.shaders[glu::SHADERTYPE_VERTEX]	= "vulkan/draw/VertexFetchShaderDrawParameters.vert";
3618ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		testSpec.shaders[glu::SHADERTYPE_FRAGMENT]	= "vulkan/draw/VertexFetch.frag";
3628ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		testSpec.topology							= vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3638ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		testSpec.flags								= 0;
3648ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
3658ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(getTestContext(), "base_vertex", ""));
3668ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addDrawCase(group.get(), testSpec, 0);
3678ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addDrawCase(group.get(), testSpec, TEST_FLAG_INDEXED);
3688ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addDrawCase(group.get(), testSpec, TEST_FLAG_INDIRECT);
3698ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addDrawCase(group.get(), testSpec, TEST_FLAG_INDEXED | TEST_FLAG_INDIRECT);
3708ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addChild(group.release());
3718ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	}
3728ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	{
3738ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		DrawTest::TestSpec testSpec;
3748ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		testSpec.shaders[glu::SHADERTYPE_VERTEX]	= "vulkan/draw/VertexFetchShaderDrawParameters.vert";
3758ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		testSpec.shaders[glu::SHADERTYPE_FRAGMENT]	= "vulkan/draw/VertexFetch.frag";
3768ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		testSpec.topology							= vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3778ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		testSpec.flags								= TEST_FLAG_INSTANCED;
3788ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
3798ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(getTestContext(), "base_instance", ""));
3808ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addDrawCase(group.get(), testSpec, 0);
3818ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addDrawCase(group.get(), testSpec, TEST_FLAG_INDEXED);
3828ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addDrawCase(group.get(), testSpec, TEST_FLAG_INDIRECT);
3838ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addDrawCase(group.get(), testSpec, TEST_FLAG_INDIRECT | TEST_FLAG_FIRST_INSTANCE);
3848ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addDrawCase(group.get(), testSpec, TEST_FLAG_INDEXED  | TEST_FLAG_INDIRECT);
3858ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addDrawCase(group.get(), testSpec, TEST_FLAG_INDEXED  | TEST_FLAG_INDIRECT | TEST_FLAG_FIRST_INSTANCE);
3868ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addChild(group.release());
3878ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	}
3888ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	{
3898ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		DrawTest::TestSpec testSpec;
3908ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		testSpec.shaders[glu::SHADERTYPE_VERTEX]	= "vulkan/draw/VertexFetchShaderDrawParametersDrawIndex.vert";
3918ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		testSpec.shaders[glu::SHADERTYPE_FRAGMENT]	= "vulkan/draw/VertexFetch.frag";
3928ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		testSpec.topology							= vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
3938ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		testSpec.flags								= TEST_FLAG_INDIRECT | TEST_FLAG_MULTIDRAW;
3948ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
3958ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		de::MovePtr<tcu::TestCaseGroup> group(new tcu::TestCaseGroup(getTestContext(), "draw_index", ""));
3968ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addDrawCase(group.get(), testSpec, 0);
3978ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addDrawCase(group.get(), testSpec, TEST_FLAG_INSTANCED);
3988ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addDrawCase(group.get(), testSpec, TEST_FLAG_INDEXED);
3998ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addDrawCase(group.get(), testSpec, TEST_FLAG_INDEXED | TEST_FLAG_INSTANCED);
4008ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski		addChild(group.release());
4018ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski	}
4028ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski}
4038ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski
4048ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski}	// DrawTests
4058ba59662bff835d72077feb906ace49c17a09a52Maciej Jesionowski}	// vkt
406