1fbdc982ce9e1fec5d00064e33238956574c4db05scygan/*------------------------------------------------------------------------
26677da425e555d9f2dce2a47f1b866c0e80f74d1Pyry Haulos * Vulkan Conformance Tests
36677da425e555d9f2dce2a47f1b866c0e80f74d1Pyry Haulos * ------------------------
46677da425e555d9f2dce2a47f1b866c0e80f74d1Pyry Haulos *
56677da425e555d9f2dce2a47f1b866c0e80f74d1Pyry Haulos * Copyright (c) 2015 The Khronos Group Inc.
66677da425e555d9f2dce2a47f1b866c0e80f74d1Pyry Haulos * Copyright (c) 2015 Intel Corporation
76677da425e555d9f2dce2a47f1b866c0e80f74d1Pyry Haulos *
8d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
9d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * you may not use this file except in compliance with the License.
10d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * You may obtain a copy of the License at
116677da425e555d9f2dce2a47f1b866c0e80f74d1Pyry Haulos *
12d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
136677da425e555d9f2dce2a47f1b866c0e80f74d1Pyry Haulos *
14d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * Unless required by applicable law or agreed to in writing, software
15d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
16d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * See the License for the specific language governing permissions and
18d471a12fca5d3077a4ca28eebf83685f4208c3b6Pyry Haulos * limitations under the License.
196677da425e555d9f2dce2a47f1b866c0e80f74d1Pyry Haulos *
206677da425e555d9f2dce2a47f1b866c0e80f74d1Pyry Haulos *//*!
216677da425e555d9f2dce2a47f1b866c0e80f74d1Pyry Haulos * \file
226677da425e555d9f2dce2a47f1b866c0e80f74d1Pyry Haulos * \brief Draw Indexed Tests
236677da425e555d9f2dce2a47f1b866c0e80f74d1Pyry Haulos *//*--------------------------------------------------------------------*/
24fbdc982ce9e1fec5d00064e33238956574c4db05scygan
25fbdc982ce9e1fec5d00064e33238956574c4db05scygan#include "vktDrawIndexedTest.hpp"
26fbdc982ce9e1fec5d00064e33238956574c4db05scygan
27fbdc982ce9e1fec5d00064e33238956574c4db05scygan#include "vktTestCaseUtil.hpp"
28fbdc982ce9e1fec5d00064e33238956574c4db05scygan#include "vktDrawTestCaseUtil.hpp"
29fbdc982ce9e1fec5d00064e33238956574c4db05scygan
30fbdc982ce9e1fec5d00064e33238956574c4db05scygan#include "vktDrawBaseClass.hpp"
31fbdc982ce9e1fec5d00064e33238956574c4db05scygan
32fbdc982ce9e1fec5d00064e33238956574c4db05scygan#include "tcuTestLog.hpp"
33fbdc982ce9e1fec5d00064e33238956574c4db05scygan#include "tcuResource.hpp"
34fbdc982ce9e1fec5d00064e33238956574c4db05scygan#include "tcuImageCompare.hpp"
35fbdc982ce9e1fec5d00064e33238956574c4db05scygan#include "tcuTextureUtil.hpp"
36f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan#include "tcuRGBA.hpp"
37fbdc982ce9e1fec5d00064e33238956574c4db05scygan
38fbdc982ce9e1fec5d00064e33238956574c4db05scygan#include "vkDefs.hpp"
39fbdc982ce9e1fec5d00064e33238956574c4db05scygan
4039714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cyganenum
4139714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan{
4239714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	VERTEX_OFFSET = 13
4339714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan};
4439714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan
45fbdc982ce9e1fec5d00064e33238956574c4db05scygannamespace vkt
46fbdc982ce9e1fec5d00064e33238956574c4db05scygan{
47fbdc982ce9e1fec5d00064e33238956574c4db05scygannamespace Draw
48fbdc982ce9e1fec5d00064e33238956574c4db05scygan{
49fbdc982ce9e1fec5d00064e33238956574c4db05scygannamespace
50fbdc982ce9e1fec5d00064e33238956574c4db05scygan{
51fbdc982ce9e1fec5d00064e33238956574c4db05scyganclass DrawIndexed : public DrawTestsBaseClass
52fbdc982ce9e1fec5d00064e33238956574c4db05scygan{
53fbdc982ce9e1fec5d00064e33238956574c4db05scyganpublic:
5439714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	typedef		TestSpecBase	TestSpec;
5539714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan
5639714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan								DrawIndexed				(Context &context, TestSpec testSpec);
57fbdc982ce9e1fec5d00064e33238956574c4db05scygan	virtual		tcu::TestStatus iterate					(void);
5839714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cyganprotected:
5939714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	std::vector<deUint32>		m_indexes;
6039714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	de::SharedPtr<Buffer>		m_indexBuffer;
61fbdc982ce9e1fec5d00064e33238956574c4db05scygan};
62fbdc982ce9e1fec5d00064e33238956574c4db05scygan
63fbdc982ce9e1fec5d00064e33238956574c4db05scyganclass DrawInstancedIndexed : public DrawIndexed
64fbdc982ce9e1fec5d00064e33238956574c4db05scygan{
65fbdc982ce9e1fec5d00064e33238956574c4db05scyganpublic:
6639714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan								DrawInstancedIndexed	(Context &context, TestSpec testSpec);
67fbdc982ce9e1fec5d00064e33238956574c4db05scygan	virtual		tcu::TestStatus	iterate					(void);
68fbdc982ce9e1fec5d00064e33238956574c4db05scygan};
69fbdc982ce9e1fec5d00064e33238956574c4db05scygan
7039714d40c5e5b37a11b290a677cd471c0abea100Slawomir CyganDrawIndexed::DrawIndexed (Context &context, TestSpec testSpec)
7139714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	: DrawTestsBaseClass(context, testSpec.shaders[glu::SHADERTYPE_VERTEX], testSpec.shaders[glu::SHADERTYPE_FRAGMENT], testSpec.topology)
72fbdc982ce9e1fec5d00064e33238956574c4db05scygan{
73fbdc982ce9e1fec5d00064e33238956574c4db05scygan	switch (m_topology)
74fbdc982ce9e1fec5d00064e33238956574c4db05scygan	{
75fbdc982ce9e1fec5d00064e33238956574c4db05scygan		case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
76fbdc982ce9e1fec5d00064e33238956574c4db05scygan			m_indexes.push_back(0);
77fbdc982ce9e1fec5d00064e33238956574c4db05scygan			m_indexes.push_back(0);
78fbdc982ce9e1fec5d00064e33238956574c4db05scygan			m_indexes.push_back(2);
79fbdc982ce9e1fec5d00064e33238956574c4db05scygan			m_indexes.push_back(0);
80fbdc982ce9e1fec5d00064e33238956574c4db05scygan			m_indexes.push_back(6);
81fbdc982ce9e1fec5d00064e33238956574c4db05scygan			m_indexes.push_back(6);
82fbdc982ce9e1fec5d00064e33238956574c4db05scygan			m_indexes.push_back(0);
83fbdc982ce9e1fec5d00064e33238956574c4db05scygan			m_indexes.push_back(7);
84fbdc982ce9e1fec5d00064e33238956574c4db05scygan			break;
85fbdc982ce9e1fec5d00064e33238956574c4db05scygan		case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
86fbdc982ce9e1fec5d00064e33238956574c4db05scygan			m_indexes.push_back(0);
87fbdc982ce9e1fec5d00064e33238956574c4db05scygan			m_indexes.push_back(0);
88fbdc982ce9e1fec5d00064e33238956574c4db05scygan			m_indexes.push_back(2);
89fbdc982ce9e1fec5d00064e33238956574c4db05scygan			m_indexes.push_back(0);
90fbdc982ce9e1fec5d00064e33238956574c4db05scygan			m_indexes.push_back(6);
91fbdc982ce9e1fec5d00064e33238956574c4db05scygan			m_indexes.push_back(5);
92fbdc982ce9e1fec5d00064e33238956574c4db05scygan			m_indexes.push_back(0);
93fbdc982ce9e1fec5d00064e33238956574c4db05scygan			m_indexes.push_back(7);
94fbdc982ce9e1fec5d00064e33238956574c4db05scygan			break;
95fbdc982ce9e1fec5d00064e33238956574c4db05scygan
96f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		case vk::VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
97f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		case vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
98f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		case vk::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
99f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
100f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		case vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
101f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		case vk::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
102f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
103f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
104f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		case vk::VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
105f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		case vk::VK_PRIMITIVE_TOPOLOGY_LAST:
106f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan			DE_FATAL("Topology not implemented");
107f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan			break;
108fbdc982ce9e1fec5d00064e33238956574c4db05scygan		default:
109f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan			DE_FATAL("Unknown topology");
110f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan			break;
111fbdc982ce9e1fec5d00064e33238956574c4db05scygan	}
11239714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan
11339714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	for (int unusedIdx = 0; unusedIdx < VERTEX_OFFSET; unusedIdx++)
11439714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	{
11539714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan		m_data.push_back(VertexElementData(tcu::Vec4(-1.0f, 1.0f, 1.0f, 1.0f), tcu::RGBA::blue().toVec(), -1));
11639714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	}
11739714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan
11839714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	int vertexIndex = VERTEX_OFFSET;
11939714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan
12039714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	m_data.push_back(VertexElementData(tcu::Vec4(	-0.3f,	 0.3f,	1.0f,	1.0f), tcu::RGBA::blue().toVec(), vertexIndex++));
12139714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	m_data.push_back(VertexElementData(tcu::Vec4(	-1.0f,	 1.0f,	1.0f,	1.0f), tcu::RGBA::blue().toVec(), vertexIndex++));
12239714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	m_data.push_back(VertexElementData(tcu::Vec4(	-0.3f,	-0.3f,	1.0f,	1.0f), tcu::RGBA::blue().toVec(), vertexIndex++));
12339714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	m_data.push_back(VertexElementData(tcu::Vec4(	 1.0f,	-1.0f,	1.0f,	1.0f), tcu::RGBA::blue().toVec(), vertexIndex++));
12439714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	m_data.push_back(VertexElementData(tcu::Vec4(	-0.3f,	-0.3f,	1.0f,	1.0f), tcu::RGBA::blue().toVec(), vertexIndex++));
12539714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	m_data.push_back(VertexElementData(tcu::Vec4(	 0.3f,	 0.3f,	1.0f,	1.0f), tcu::RGBA::blue().toVec(), vertexIndex++));
12639714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	m_data.push_back(VertexElementData(tcu::Vec4(	 0.3f,	-0.3f,	1.0f,	1.0f), tcu::RGBA::blue().toVec(), vertexIndex++));
12739714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	m_data.push_back(VertexElementData(tcu::Vec4(	 0.3f,	 0.3f,	1.0f,	1.0f), tcu::RGBA::blue().toVec(), vertexIndex++));
12839714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan
12939714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	m_data.push_back(VertexElementData(tcu::Vec4(	-1.0f,	 1.0f,	1.0f,	1.0f), tcu::RGBA::blue().toVec(), -1));
13039714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan
131f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan	initialize();
132fbdc982ce9e1fec5d00064e33238956574c4db05scygan};
133fbdc982ce9e1fec5d00064e33238956574c4db05scygan
134fbdc982ce9e1fec5d00064e33238956574c4db05scygantcu::TestStatus DrawIndexed::iterate (void)
135fbdc982ce9e1fec5d00064e33238956574c4db05scygan{
136fbdc982ce9e1fec5d00064e33238956574c4db05scygan	tcu::TestLog &log			= m_context.getTestContext().getLog();
137fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const vk::VkQueue queue		= m_context.getUniversalQueue();
138fbdc982ce9e1fec5d00064e33238956574c4db05scygan
139fbdc982ce9e1fec5d00064e33238956574c4db05scygan	beginRenderPass();
140fbdc982ce9e1fec5d00064e33238956574c4db05scygan
141fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const vk::VkDeviceSize dataSize = m_indexes.size() * sizeof(deUint32);
142f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan	m_indexBuffer = Buffer::createAndAlloc(	m_vk, m_context.getDevice(),
143f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan											BufferCreateInfo(dataSize,
144f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan															 vk::VK_BUFFER_USAGE_INDEX_BUFFER_BIT),
145f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan											m_context.getDefaultAllocator(),
146f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan											vk::MemoryRequirement::HostVisible);
147f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan
148f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan	deUint8* ptr = reinterpret_cast<deUint8*>(m_indexBuffer->getBoundMemory().getHostPtr());
149fbdc982ce9e1fec5d00064e33238956574c4db05scygan
150d3cfb7f158cb03f3734b7f9f24c5b3f97e18939dPyry Haulos	deMemcpy(ptr, &m_indexes[0], static_cast<size_t>(dataSize));
151fbdc982ce9e1fec5d00064e33238956574c4db05scygan
152fbdc982ce9e1fec5d00064e33238956574c4db05scygan	vk::flushMappedMemoryRange(m_vk, m_context.getDevice(),
153f1250e939bb2fe84e4d01d4235682df0321bf3b8Pyry Haulos							   m_indexBuffer->getBoundMemory().getMemory(),
154f1250e939bb2fe84e4d01d4235682df0321bf3b8Pyry Haulos							   m_indexBuffer->getBoundMemory().getOffset(),
155fbdc982ce9e1fec5d00064e33238956574c4db05scygan							   dataSize);
156fbdc982ce9e1fec5d00064e33238956574c4db05scygan
157fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const vk::VkDeviceSize vertexBufferOffset = 0;
158fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const vk::VkBuffer vertexBuffer = m_vertexBuffer->object();
159fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const vk::VkBuffer indexBuffer = m_indexBuffer->object();
160f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan
161fbdc982ce9e1fec5d00064e33238956574c4db05scygan	m_vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
162fbdc982ce9e1fec5d00064e33238956574c4db05scygan	m_vk.cmdBindIndexBuffer(*m_cmdBuffer, indexBuffer, 0, vk::VK_INDEX_TYPE_UINT32);
163fbdc982ce9e1fec5d00064e33238956574c4db05scygan
164fbdc982ce9e1fec5d00064e33238956574c4db05scygan	m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
165fbdc982ce9e1fec5d00064e33238956574c4db05scygan
16639714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	m_vk.cmdDrawIndexed(*m_cmdBuffer, 6, 1, 2, VERTEX_OFFSET, 0);
167fbdc982ce9e1fec5d00064e33238956574c4db05scygan
168fbdc982ce9e1fec5d00064e33238956574c4db05scygan	m_vk.cmdEndRenderPass(*m_cmdBuffer);
169fbdc982ce9e1fec5d00064e33238956574c4db05scygan	m_vk.endCommandBuffer(*m_cmdBuffer);
170fbdc982ce9e1fec5d00064e33238956574c4db05scygan
171fbdc982ce9e1fec5d00064e33238956574c4db05scygan	vk::VkSubmitInfo submitInfo =
172fbdc982ce9e1fec5d00064e33238956574c4db05scygan	{
173fbdc982ce9e1fec5d00064e33238956574c4db05scygan		vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,	// VkStructureType			sType;
174fbdc982ce9e1fec5d00064e33238956574c4db05scygan		DE_NULL,							// const void*				pNext;
175f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		0,										// deUint32					waitSemaphoreCount;
176f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		DE_NULL,								// const VkSemaphore*		pWaitSemaphores;
177689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		(const vk::VkPipelineStageFlags*)DE_NULL,
178f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		1,										// deUint32					commandBufferCount;
179fbdc982ce9e1fec5d00064e33238956574c4db05scygan		&m_cmdBuffer.get(),					// const VkCommandBuffer*	pCommandBuffers;
180f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		0,										// deUint32					signalSemaphoreCount;
181fbdc982ce9e1fec5d00064e33238956574c4db05scygan		DE_NULL								// const VkSemaphore*		pSignalSemaphores;
182fbdc982ce9e1fec5d00064e33238956574c4db05scygan	};
183fbdc982ce9e1fec5d00064e33238956574c4db05scygan
184fbdc982ce9e1fec5d00064e33238956574c4db05scygan	VK_CHECK(m_vk.queueSubmit(queue, 1, &submitInfo, DE_NULL));
185fbdc982ce9e1fec5d00064e33238956574c4db05scygan
186fbdc982ce9e1fec5d00064e33238956574c4db05scygan	VK_CHECK(m_vk.queueWaitIdle(queue));
187fbdc982ce9e1fec5d00064e33238956574c4db05scygan
188fbdc982ce9e1fec5d00064e33238956574c4db05scygan	// Validation
189fbdc982ce9e1fec5d00064e33238956574c4db05scygan	tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
190fbdc982ce9e1fec5d00064e33238956574c4db05scygan								  referenceFrame.allocLevel(0);
191fbdc982ce9e1fec5d00064e33238956574c4db05scygan
192fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const deInt32 frameWidth	= referenceFrame.getWidth();
193fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const deInt32 frameHeight	= referenceFrame.getHeight();
194fbdc982ce9e1fec5d00064e33238956574c4db05scygan
195fbdc982ce9e1fec5d00064e33238956574c4db05scygan	tcu::clear(referenceFrame.getLevel(0), tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
196fbdc982ce9e1fec5d00064e33238956574c4db05scygan
197f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan	ReferenceImageCoordinates refCoords;
198f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan
199fbdc982ce9e1fec5d00064e33238956574c4db05scygan	for (int y = 0; y < frameHeight; y++)
200fbdc982ce9e1fec5d00064e33238956574c4db05scygan	{
201fbdc982ce9e1fec5d00064e33238956574c4db05scygan		const float yCoord = (float)(y / (0.5*frameHeight)) - 1.0f;
202fbdc982ce9e1fec5d00064e33238956574c4db05scygan
203fbdc982ce9e1fec5d00064e33238956574c4db05scygan		for (int x = 0; x < frameWidth; x++)
204fbdc982ce9e1fec5d00064e33238956574c4db05scygan		{
205fbdc982ce9e1fec5d00064e33238956574c4db05scygan			const float xCoord = (float)(x / (0.5*frameWidth)) - 1.0f;
206fbdc982ce9e1fec5d00064e33238956574c4db05scygan
207f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan			if ((yCoord >= refCoords.bottom &&
208f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan				 yCoord <= refCoords.top	&&
209f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan				 xCoord >= refCoords.left	&&
210f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan				 xCoord <= refCoords.right))
211fbdc982ce9e1fec5d00064e33238956574c4db05scygan				referenceFrame.getLevel(0).setPixel(tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f), x, y);
212fbdc982ce9e1fec5d00064e33238956574c4db05scygan		}
213fbdc982ce9e1fec5d00064e33238956574c4db05scygan	}
214fbdc982ce9e1fec5d00064e33238956574c4db05scygan
215fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const vk::VkOffset3D zeroOffset = { 0, 0, 0 };
216fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const tcu::ConstPixelBufferAccess renderedFrame = m_colorTargetImage->readSurface(queue, m_context.getDefaultAllocator(),
217fbdc982ce9e1fec5d00064e33238956574c4db05scygan		vk::VK_IMAGE_LAYOUT_GENERAL, zeroOffset, WIDTH, HEIGHT, vk::VK_IMAGE_ASPECT_COLOR_BIT);
218fbdc982ce9e1fec5d00064e33238956574c4db05scygan
219fbdc982ce9e1fec5d00064e33238956574c4db05scygan	qpTestResult res = QP_TEST_RESULT_PASS;
220fbdc982ce9e1fec5d00064e33238956574c4db05scygan
221fbdc982ce9e1fec5d00064e33238956574c4db05scygan	if (!tcu::fuzzyCompare(log, "Result", "Image comparison result",
222fbdc982ce9e1fec5d00064e33238956574c4db05scygan		referenceFrame.getLevel(0), renderedFrame, 0.05f,
223fbdc982ce9e1fec5d00064e33238956574c4db05scygan		tcu::COMPARE_LOG_RESULT)) {
224fbdc982ce9e1fec5d00064e33238956574c4db05scygan		res = QP_TEST_RESULT_FAIL;
225fbdc982ce9e1fec5d00064e33238956574c4db05scygan	}
226fbdc982ce9e1fec5d00064e33238956574c4db05scygan
227fbdc982ce9e1fec5d00064e33238956574c4db05scygan	return tcu::TestStatus(res, qpGetTestResultName(res));
228fbdc982ce9e1fec5d00064e33238956574c4db05scygan};
229fbdc982ce9e1fec5d00064e33238956574c4db05scygan
23039714d40c5e5b37a11b290a677cd471c0abea100Slawomir CyganDrawInstancedIndexed::DrawInstancedIndexed (Context &context, TestSpec testSpec)
23139714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	: DrawIndexed	(context, testSpec)
232fbdc982ce9e1fec5d00064e33238956574c4db05scygan{
233fbdc982ce9e1fec5d00064e33238956574c4db05scygan}
234fbdc982ce9e1fec5d00064e33238956574c4db05scygan
235fbdc982ce9e1fec5d00064e33238956574c4db05scygantcu::TestStatus DrawInstancedIndexed::iterate (void)
236fbdc982ce9e1fec5d00064e33238956574c4db05scygan{
237fbdc982ce9e1fec5d00064e33238956574c4db05scygan	tcu::TestLog &log		= m_context.getTestContext().getLog();
238fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const vk::VkQueue queue = m_context.getUniversalQueue();
239fbdc982ce9e1fec5d00064e33238956574c4db05scygan
240fbdc982ce9e1fec5d00064e33238956574c4db05scygan	beginRenderPass();
241fbdc982ce9e1fec5d00064e33238956574c4db05scygan
242fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const vk::VkDeviceSize dataSize = m_indexes.size() * sizeof(deUint32);
243f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan	m_indexBuffer = Buffer::createAndAlloc(	m_vk, m_context.getDevice(),
244f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan											BufferCreateInfo(dataSize,
245f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan															 vk::VK_BUFFER_USAGE_INDEX_BUFFER_BIT),
246f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan											m_context.getDefaultAllocator(),
247f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan											vk::MemoryRequirement::HostVisible);
248fbdc982ce9e1fec5d00064e33238956574c4db05scygan
249f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan	deUint8* ptr = reinterpret_cast<deUint8*>(m_indexBuffer->getBoundMemory().getHostPtr());
250fbdc982ce9e1fec5d00064e33238956574c4db05scygan
251d3cfb7f158cb03f3734b7f9f24c5b3f97e18939dPyry Haulos	deMemcpy(ptr, &m_indexes[0], static_cast<size_t>(dataSize));
252fbdc982ce9e1fec5d00064e33238956574c4db05scygan	vk::flushMappedMemoryRange(m_vk, m_context.getDevice(),
253f1250e939bb2fe84e4d01d4235682df0321bf3b8Pyry Haulos							   m_indexBuffer->getBoundMemory().getMemory(),
254f1250e939bb2fe84e4d01d4235682df0321bf3b8Pyry Haulos							   m_indexBuffer->getBoundMemory().getOffset(),
255fbdc982ce9e1fec5d00064e33238956574c4db05scygan							   dataSize);
256fbdc982ce9e1fec5d00064e33238956574c4db05scygan
257fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const vk::VkDeviceSize vertexBufferOffset = 0;
258fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const vk::VkBuffer vertexBuffer = m_vertexBuffer->object();
259fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const vk::VkBuffer indexBuffer = m_indexBuffer->object();
260f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan
261fbdc982ce9e1fec5d00064e33238956574c4db05scygan	m_vk.cmdBindVertexBuffers(*m_cmdBuffer, 0, 1, &vertexBuffer, &vertexBufferOffset);
262fbdc982ce9e1fec5d00064e33238956574c4db05scygan	m_vk.cmdBindIndexBuffer(*m_cmdBuffer, indexBuffer, 0, vk::VK_INDEX_TYPE_UINT32);
263fbdc982ce9e1fec5d00064e33238956574c4db05scygan	m_vk.cmdBindPipeline(*m_cmdBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline);
264fbdc982ce9e1fec5d00064e33238956574c4db05scygan
265fbdc982ce9e1fec5d00064e33238956574c4db05scygan	switch (m_topology)
266fbdc982ce9e1fec5d00064e33238956574c4db05scygan	{
267fbdc982ce9e1fec5d00064e33238956574c4db05scygan		case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
26839714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan			m_vk.cmdDrawIndexed(*m_cmdBuffer, 6, 4, 2, VERTEX_OFFSET, 2);
269fbdc982ce9e1fec5d00064e33238956574c4db05scygan			break;
270fbdc982ce9e1fec5d00064e33238956574c4db05scygan		case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
27139714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan			m_vk.cmdDrawIndexed(*m_cmdBuffer, 4, 4, 2, VERTEX_OFFSET, 2);
272fbdc982ce9e1fec5d00064e33238956574c4db05scygan			break;
273f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		case vk::VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
274f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		case vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
275f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		case vk::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
276fbdc982ce9e1fec5d00064e33238956574c4db05scygan		case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
277fbdc982ce9e1fec5d00064e33238956574c4db05scygan		case vk::VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
278fbdc982ce9e1fec5d00064e33238956574c4db05scygan		case vk::VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
279fbdc982ce9e1fec5d00064e33238956574c4db05scygan		case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
280fbdc982ce9e1fec5d00064e33238956574c4db05scygan		case vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
281fbdc982ce9e1fec5d00064e33238956574c4db05scygan		case vk::VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
282fbdc982ce9e1fec5d00064e33238956574c4db05scygan		case vk::VK_PRIMITIVE_TOPOLOGY_LAST:
283f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan			DE_FATAL("Topology not implemented");
284fbdc982ce9e1fec5d00064e33238956574c4db05scygan			break;
285fbdc982ce9e1fec5d00064e33238956574c4db05scygan		default:
286f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan			DE_FATAL("Unknown topology");
287fbdc982ce9e1fec5d00064e33238956574c4db05scygan			break;
288fbdc982ce9e1fec5d00064e33238956574c4db05scygan	}
289fbdc982ce9e1fec5d00064e33238956574c4db05scygan
290fbdc982ce9e1fec5d00064e33238956574c4db05scygan	m_vk.cmdEndRenderPass(*m_cmdBuffer);
291fbdc982ce9e1fec5d00064e33238956574c4db05scygan	m_vk.endCommandBuffer(*m_cmdBuffer);
292fbdc982ce9e1fec5d00064e33238956574c4db05scygan
293fbdc982ce9e1fec5d00064e33238956574c4db05scygan	vk::VkSubmitInfo submitInfo =
294fbdc982ce9e1fec5d00064e33238956574c4db05scygan	{
295fbdc982ce9e1fec5d00064e33238956574c4db05scygan		vk::VK_STRUCTURE_TYPE_SUBMIT_INFO,	// VkStructureType			sType;
296fbdc982ce9e1fec5d00064e33238956574c4db05scygan		DE_NULL,							// const void*				pNext;
297f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		0,										// deUint32					waitSemaphoreCount;
298f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		DE_NULL,								// const VkSemaphore*		pWaitSemaphores;
299689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos		(const vk::VkPipelineStageFlags*)DE_NULL,
300f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		1,										// deUint32					commandBufferCount;
301fbdc982ce9e1fec5d00064e33238956574c4db05scygan		&m_cmdBuffer.get(),					// const VkCommandBuffer*	pCommandBuffers;
302f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan		0,										// deUint32					signalSemaphoreCount;
303fbdc982ce9e1fec5d00064e33238956574c4db05scygan		DE_NULL								// const VkSemaphore*		pSignalSemaphores;
304fbdc982ce9e1fec5d00064e33238956574c4db05scygan	};
305fbdc982ce9e1fec5d00064e33238956574c4db05scygan	VK_CHECK(m_vk.queueSubmit(queue, 1, &submitInfo, DE_NULL));
306fbdc982ce9e1fec5d00064e33238956574c4db05scygan
307fbdc982ce9e1fec5d00064e33238956574c4db05scygan	VK_CHECK(m_vk.queueWaitIdle(queue));
308fbdc982ce9e1fec5d00064e33238956574c4db05scygan
309fbdc982ce9e1fec5d00064e33238956574c4db05scygan	// Validation
310fbdc982ce9e1fec5d00064e33238956574c4db05scygan	VK_CHECK(m_vk.queueWaitIdle(queue));
311fbdc982ce9e1fec5d00064e33238956574c4db05scygan
312fbdc982ce9e1fec5d00064e33238956574c4db05scygan	tcu::Texture2D referenceFrame(vk::mapVkFormat(m_colorAttachmentFormat), (int)(0.5 + WIDTH), (int)(0.5 + HEIGHT));
313fbdc982ce9e1fec5d00064e33238956574c4db05scygan	referenceFrame.allocLevel(0);
314fbdc982ce9e1fec5d00064e33238956574c4db05scygan
315fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const deInt32 frameWidth = referenceFrame.getWidth();
316fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const deInt32 frameHeight = referenceFrame.getHeight();
317fbdc982ce9e1fec5d00064e33238956574c4db05scygan
318fbdc982ce9e1fec5d00064e33238956574c4db05scygan	tcu::clear(referenceFrame.getLevel(0), tcu::Vec4(0.0f, 0.0f, 0.0f, 1.0f));
319fbdc982ce9e1fec5d00064e33238956574c4db05scygan
320f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan	ReferenceImageInstancedCoordinates refInstancedCoords;
321f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan
322fbdc982ce9e1fec5d00064e33238956574c4db05scygan	for (int y = 0; y < frameHeight; y++)
323fbdc982ce9e1fec5d00064e33238956574c4db05scygan	{
324fbdc982ce9e1fec5d00064e33238956574c4db05scygan		const float yCoord = (float)(y / (0.5*frameHeight)) - 1.0f;
325fbdc982ce9e1fec5d00064e33238956574c4db05scygan
326fbdc982ce9e1fec5d00064e33238956574c4db05scygan		for (int x = 0; x < frameWidth; x++)
327fbdc982ce9e1fec5d00064e33238956574c4db05scygan		{
328fbdc982ce9e1fec5d00064e33238956574c4db05scygan			const float xCoord = (float)(x / (0.5*frameWidth)) - 1.0f;
329fbdc982ce9e1fec5d00064e33238956574c4db05scygan
330f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan			if ((yCoord >= refInstancedCoords.bottom	&&
331f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan				 yCoord <= refInstancedCoords.top		&&
332f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan				 xCoord >= refInstancedCoords.left		&&
333f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan				 xCoord <= refInstancedCoords.right))
334fbdc982ce9e1fec5d00064e33238956574c4db05scygan				referenceFrame.getLevel(0).setPixel(tcu::Vec4(0.0f, 0.0f, 1.0f, 1.0f), x, y);
335fbdc982ce9e1fec5d00064e33238956574c4db05scygan		}
336fbdc982ce9e1fec5d00064e33238956574c4db05scygan	}
337fbdc982ce9e1fec5d00064e33238956574c4db05scygan
338fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const vk::VkOffset3D zeroOffset = { 0, 0, 0 };
339fbdc982ce9e1fec5d00064e33238956574c4db05scygan	const tcu::ConstPixelBufferAccess renderedFrame = m_colorTargetImage->readSurface(queue, m_context.getDefaultAllocator(),
340fbdc982ce9e1fec5d00064e33238956574c4db05scygan		vk::VK_IMAGE_LAYOUT_GENERAL, zeroOffset, WIDTH, HEIGHT, vk::VK_IMAGE_ASPECT_COLOR_BIT);
341fbdc982ce9e1fec5d00064e33238956574c4db05scygan
342fbdc982ce9e1fec5d00064e33238956574c4db05scygan	qpTestResult res = QP_TEST_RESULT_PASS;
343fbdc982ce9e1fec5d00064e33238956574c4db05scygan
344fbdc982ce9e1fec5d00064e33238956574c4db05scygan	if (!tcu::fuzzyCompare(log, "Result", "Image comparison result",
345fbdc982ce9e1fec5d00064e33238956574c4db05scygan		referenceFrame.getLevel(0), renderedFrame, 0.05f,
346fbdc982ce9e1fec5d00064e33238956574c4db05scygan		tcu::COMPARE_LOG_RESULT)) {
347fbdc982ce9e1fec5d00064e33238956574c4db05scygan		res = QP_TEST_RESULT_FAIL;
348fbdc982ce9e1fec5d00064e33238956574c4db05scygan	}
349fbdc982ce9e1fec5d00064e33238956574c4db05scygan
350fbdc982ce9e1fec5d00064e33238956574c4db05scygan	return tcu::TestStatus(res, qpGetTestResultName(res));
351fbdc982ce9e1fec5d00064e33238956574c4db05scygan
352fbdc982ce9e1fec5d00064e33238956574c4db05scygan}
353fbdc982ce9e1fec5d00064e33238956574c4db05scygan
354fbdc982ce9e1fec5d00064e33238956574c4db05scygan}	// anonymous
355fbdc982ce9e1fec5d00064e33238956574c4db05scygan
356fbdc982ce9e1fec5d00064e33238956574c4db05scyganDrawIndexedTests::DrawIndexedTests (tcu::TestContext &testCtx)
357fbdc982ce9e1fec5d00064e33238956574c4db05scygan	: TestCaseGroup	(testCtx, "indexed_draw", "drawing indexed geometry")
358fbdc982ce9e1fec5d00064e33238956574c4db05scygan{
359fbdc982ce9e1fec5d00064e33238956574c4db05scygan	/* Left blank on purpose */
360fbdc982ce9e1fec5d00064e33238956574c4db05scygan}
361fbdc982ce9e1fec5d00064e33238956574c4db05scygan
362fbdc982ce9e1fec5d00064e33238956574c4db05scyganDrawIndexedTests::~DrawIndexedTests (void) {}
363fbdc982ce9e1fec5d00064e33238956574c4db05scygan
364fbdc982ce9e1fec5d00064e33238956574c4db05scyganvoid DrawIndexedTests::init (void)
365fbdc982ce9e1fec5d00064e33238956574c4db05scygan{
36639714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	{
36739714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan		DrawIndexed::TestSpec testSpec;
36839714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan		testSpec.shaders[glu::SHADERTYPE_VERTEX] = "vulkan/draw/VertexFetch.vert";
36939714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan		testSpec.shaders[glu::SHADERTYPE_FRAGMENT] = "vulkan/draw/VertexFetch.frag";
37039714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan
37139714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan		testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
37239714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan		addChild(new InstanceFactory<DrawIndexed>(m_testCtx, "draw_indexed_triangle_list", "Draws indexed triangle list", testSpec));
37339714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan		testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
37439714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan		addChild(new InstanceFactory<DrawIndexed>(m_testCtx, "draw_indexed_triangle_strip", "Draws indexed triangle strip", testSpec));
37539714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	}
37639714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	{
37739714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan		DrawInstancedIndexed::TestSpec testSpec;
37839714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan		testSpec.shaders[glu::SHADERTYPE_VERTEX] = "vulkan/draw/VertexFetchInstancedFirstInstance.vert";
37939714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan		testSpec.shaders[glu::SHADERTYPE_FRAGMENT] = "vulkan/draw/VertexFetch.frag";
38039714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan
38139714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan		testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
38239714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan		addChild(new InstanceFactory<DrawInstancedIndexed>(m_testCtx, "draw_instanced_indexed_triangle_list", "Draws indexed triangle list", testSpec));
38339714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan		testSpec.topology = vk::VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
38439714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan		addChild(new InstanceFactory<DrawInstancedIndexed>(m_testCtx, "draw_instanced_indexed_triangle_strip", "Draws indexed triangle strip", testSpec));
38539714d40c5e5b37a11b290a677cd471c0abea100Slawomir Cygan	}
386fbdc982ce9e1fec5d00064e33238956574c4db05scygan}
387fbdc982ce9e1fec5d00064e33238956574c4db05scygan
388fbdc982ce9e1fec5d00064e33238956574c4db05scygan}	// DrawTests
389f8d853935f32ee0ca8b1b8c49add166e411f86f9scygan}	// vkt
390