1d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa/*------------------------------------------------------------------------
2d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa * Vulkan Conformance Tests
3d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa * ------------------------
4d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa *
5d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa * Copyright (c) 2016 The Khronos Group Inc.
6d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa * Copyright (c) 2016 The Android Open Source Project
7d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa *
8d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa * Licensed under the Apache License, Version 2.0 (the "License");
9d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa * you may not use this file except in compliance with the License.
10d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa * You may obtain a copy of the License at
11d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa *
12d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa *      http://www.apache.org/licenses/LICENSE-2.0
13d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa *
14d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa * Unless required by applicable law or agreed to in writing, software
15d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa * distributed under the License is distributed on an "AS IS" BASIS,
16d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa * See the License for the specific language governing permissions and
18d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa * limitations under the License.
19d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa *
20d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa *//*!
21d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa * \file
22d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa * \brief Input Geometry Shader Tests
23d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa *//*--------------------------------------------------------------------*/
24d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
25d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa#include "vktGeometryInputGeometryShaderTests.hpp"
26d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa#include "vktGeometryBasicClass.hpp"
27d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa#include "vktGeometryTestsUtil.hpp"
28d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
29d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa#include "vkDefs.hpp"
30d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa#include "vktTestCase.hpp"
31d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa#include "vktTestCaseUtil.hpp"
32d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa#include "vkImageUtil.hpp"
33d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa#include "vkTypeUtil.hpp"
34d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa#include "vkPrograms.hpp"
35d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa#include "vkBuilderUtil.hpp"
36d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
37d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa#include "vkRefUtil.hpp"
38d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa#include "vkQueryUtil.hpp"
39d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa#include "vkMemUtil.hpp"
40d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
41d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa#include <string>
42d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
43d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwausing namespace vk;
44d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
45d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwanamespace vkt
46d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa{
47d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwanamespace geometry
48d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa{
49d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwanamespace
50d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa{
51d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwausing tcu::Vec4;
52d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwausing tcu::TestStatus;
53d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwausing tcu::TestContext;
54d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwausing tcu::TestCaseGroup;
55d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwausing de::MovePtr;
56d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwausing std::string;
57d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwausing std::vector;
58d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
59d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwaclass GeometryInputTestInstance : public GeometryExpanderRenderTestInstance
60d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa{
61d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwapublic:
62d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			GeometryInputTestInstance	(Context&					context,
63d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa										 const VkPrimitiveTopology	primitiveType,
64d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa										 const char*				name);
65d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
66d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			GeometryInputTestInstance	(Context&					context,
67d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa										 const VkPrimitiveTopology	primitiveType,
68d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa										 const char*				name,
69d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa										 const int					numDrawVertices);
70d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
71d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	void	genVertexAttribData			(void);
72d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa};
73d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
74d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz SarwaGeometryInputTestInstance::GeometryInputTestInstance	(Context&						context,
75d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa														 const VkPrimitiveTopology		primitiveType,
76d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa														 const char*					name)
77d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	: GeometryExpanderRenderTestInstance	(context, primitiveType, name)
78d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa{
79d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	genVertexAttribData();
80d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa}
81d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
82d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz SarwaGeometryInputTestInstance::GeometryInputTestInstance	(Context&					context,
83d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa														 const VkPrimitiveTopology	primitiveType,
84d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa														 const char*				name,
85d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa														 const int					numDrawVertices)
86d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	: GeometryExpanderRenderTestInstance	(context, primitiveType, name)
87d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa{
88d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	genVertexAttribData();
89d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	m_numDrawVertices = numDrawVertices;
90d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa}
91d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
92d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwavoid GeometryInputTestInstance::genVertexAttribData (void)
93d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa{
94d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	// Create 1 X 2 grid in triangle strip adjacent - order
95d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	const float	scale	= 0.3f;
96d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	const Vec4	offset	(-0.5f, -0.2f, 0.0f, 1.0f);
97d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	m_numDrawVertices	= 12;
98d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
99d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	m_vertexPosData.resize(m_numDrawVertices);
100d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	m_vertexPosData[ 0] = Vec4( 0,  0, 0.0f, 0.0f) * scale + offset;
101d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	m_vertexPosData[ 1] = Vec4(-1, -1, 0.0f, 0.0f) * scale + offset;
102d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	m_vertexPosData[ 2] = Vec4( 0, -1, 0.0f, 0.0f) * scale + offset;
103d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	m_vertexPosData[ 3] = Vec4( 1,  1, 0.0f, 0.0f) * scale + offset;
104d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	m_vertexPosData[ 4] = Vec4( 1,  0, 0.0f, 0.0f) * scale + offset;
105d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	m_vertexPosData[ 5] = Vec4( 0, -2, 0.0f, 0.0f) * scale + offset;
106d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	m_vertexPosData[ 6] = Vec4( 1, -1, 0.0f, 0.0f) * scale + offset;
107d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	m_vertexPosData[ 7] = Vec4( 2,  1, 0.0f, 0.0f) * scale + offset;
108d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	m_vertexPosData[ 8] = Vec4( 2,  0, 0.0f, 0.0f) * scale + offset;
109d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	m_vertexPosData[ 9] = Vec4( 1, -2, 0.0f, 0.0f) * scale + offset;
110d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	m_vertexPosData[10] = Vec4( 2, -1, 0.0f, 0.0f) * scale + offset;
111d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	m_vertexPosData[11] = Vec4( 3,  0, 0.0f, 0.0f) * scale + offset;
112d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
113d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	// Red and white
114d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	m_vertexAttrData.resize(m_numDrawVertices);
115d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	for (int i = 0; i < m_numDrawVertices; ++i)
116d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		m_vertexAttrData[i] = (i % 2 == 0) ? Vec4(1, 1, 1, 1) : Vec4(1, 0, 0, 1);
117d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa}
118d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
119d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwaclass GeometryExpanderRenderTest : public TestCase
120d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa{
121d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwapublic:
122d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa							GeometryExpanderRenderTest	(TestContext&				testCtx,
123d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa														 const PrimitiveTestSpec&	inputPrimitives);
124d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
125d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	void					initPrograms				(SourceCollections&			sourceCollections) const;
126d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	virtual TestInstance*	createInstance				(Context&					context) const;
127d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
128d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwaprotected:
129d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	string					shaderGeometry				(bool						pointSize) const;
130d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	const VkPrimitiveTopology	m_primitiveType;
131d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	const VkPrimitiveTopology	m_outputType;
132d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa};
133d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
134d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz SarwaGeometryExpanderRenderTest::GeometryExpanderRenderTest (TestContext& testCtx, const PrimitiveTestSpec& inputPrimitives)
135d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	: TestCase			(testCtx, inputPrimitives.name, inputPrimitives.name)
136d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	, m_primitiveType	(inputPrimitives.primitiveType)
137d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	, m_outputType		(inputPrimitives.outputType)
138d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa{
139d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
140d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa}
141d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
142d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwavoid GeometryExpanderRenderTest::initPrograms (SourceCollections& sourceCollections) const
143d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa{
144d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	{
145d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		std::ostringstream src;
146d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		src	<< "#version 310 es\n"
147d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			<<"layout(location = 0) in highp vec4 a_position;\n"
148d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			<<"layout(location = 1) in highp vec4 a_color;\n"
149d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			<<"layout(location = 0) out highp vec4 v_geom_FragColor;\n"
150d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			<<"void main (void)\n"
151d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			<<"{\n"
152d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			<<"	gl_Position = a_position;\n"
153d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			<<"	v_geom_FragColor = a_color;\n"
154d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			<<"}\n";
155d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		sourceCollections.glslSources.add("vertex") << glu::VertexSource(src.str());
156d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	}
157d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
158d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	{
159d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		sourceCollections.glslSources.add("geometry") << glu::GeometrySource(shaderGeometry(false));
160d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		if (m_outputType == VK_PRIMITIVE_TOPOLOGY_POINT_LIST)
161d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			sourceCollections.glslSources.add("geometry_pointsize") << glu::GeometrySource(shaderGeometry(true));
162d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	}
163d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
164d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	{
165d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		std::ostringstream src;
166d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		src	<< "#version 310 es\n"
167d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			<<"layout(location = 0) out highp vec4 fragColor;\n"
168d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			<<"layout(location = 0) in highp vec4 v_frag_FragColor;\n"
169d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			<<"void main (void)\n"
170d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			<<"{\n"
171d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			<<"	fragColor = v_frag_FragColor;\n"
172d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			<<"}\n";
173d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		sourceCollections.glslSources.add("fragment") << glu::FragmentSource(src.str());
174d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	}
175d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa}
176d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
177d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz SarwaTestInstance* GeometryExpanderRenderTest::createInstance (Context& context) const
178d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa{
179d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	return new GeometryInputTestInstance(context, m_primitiveType, getName());
180d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa}
181d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
182d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwastring GeometryExpanderRenderTest::shaderGeometry (bool pointSize) const
183d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa{
184d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	std::ostringstream src;
185d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	src	<< "#version 310 es\n"
186d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "#extension GL_EXT_geometry_shader : require\n";
187d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	if (pointSize)
188d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		src	<<"#extension GL_EXT_geometry_point_size : require\n";
189d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	src	<< "layout(" << inputTypeToGLString(m_primitiveType) << ") in;\n"
190d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "layout(" << outputTypeToGLString(m_outputType) << ", max_vertices = " << calcOutputVertices(m_primitiveType) << ") out;\n"
191d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "layout(location = 0) in highp vec4 v_geom_FragColor[];\n"
192d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "layout(location = 0) out highp vec4 v_frag_FragColor;\n"
193d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "\n"
194d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "void main (void)\n"
195d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "{\n"
196d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "	const highp vec4 offset0 = vec4(-0.07, -0.01, 0.0, 0.0);\n"
197d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "	const highp vec4 offset1 = vec4( 0.03, -0.03, 0.0, 0.0);\n"
198d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "	const highp vec4 offset2 = vec4(-0.01,  0.08, 0.0, 0.0);\n"
199d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "	highp vec4 yoffset = float(gl_PrimitiveIDIn) * vec4(0.02, 0.1, 0.0, 0.0);\n"
200d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "\n"
201d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "	for (highp int ndx = 0; ndx < gl_in.length(); ndx++)\n"
202d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "	{\n";
203d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		if (pointSize)
204d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			src	<< "		gl_PointSize = 1.0;\n";
205d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	src	<< "		gl_Position = gl_in[ndx].gl_Position + offset0 + yoffset;\n"
206d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "		v_frag_FragColor = v_geom_FragColor[ndx];\n"
207d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "		EmitVertex();\n"
208d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "\n";
209d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		if (pointSize)
210d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			src	<< "		gl_PointSize = 1.0;\n";
211d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	src	<< "		gl_Position = gl_in[ndx].gl_Position + offset1 + yoffset;\n"
212d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "		v_frag_FragColor = v_geom_FragColor[ndx];\n"
213d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "		EmitVertex();\n"
214d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "\n";
215d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		if (pointSize)
216d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			src	<< "		gl_PointSize = 1.0;\n";
217d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	src	<< "		gl_Position = gl_in[ndx].gl_Position + offset2 + yoffset;\n"
218d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "		v_frag_FragColor = v_geom_FragColor[ndx];\n"
219d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "		EmitVertex();\n"
220d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "		EndPrimitive();\n"
221d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "	}\n"
222d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		<< "}\n";
223d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	return src.str();
224d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa}
225d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
226d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwaclass TriangleStripAdjacencyVertexCountTest : public GeometryExpanderRenderTest
227d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa{
228d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwapublic:
229d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa							TriangleStripAdjacencyVertexCountTest	(TestContext& testCtx, const PrimitiveTestSpec& inputPrimitives, const int numInputVertices);
230d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	virtual TestInstance*	createInstance							(Context& context) const;
231d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwaprivate:
232d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	const int	m_numInputVertices;
233d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa};
234d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
235d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz SarwaTriangleStripAdjacencyVertexCountTest::TriangleStripAdjacencyVertexCountTest (TestContext& testCtx, const PrimitiveTestSpec& inputPrimitives, const int numInputVertices)
236d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	: GeometryExpanderRenderTest	(testCtx, inputPrimitives)
237d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	, m_numInputVertices			(numInputVertices)
238d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa{
239d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa}
240d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
241d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz SarwaTestInstance* TriangleStripAdjacencyVertexCountTest::createInstance (Context& context) const
242d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa{
243d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	return new GeometryInputTestInstance(context, m_primitiveType, getName(), m_numInputVertices);
244d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa}
245d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
246d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa} // anonymous
247d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
248d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz SarwaTestCaseGroup* createInputGeometryShaderTests (TestContext& testCtx)
249d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa{
250d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	MovePtr<TestCaseGroup> inputPrimitiveGroup		(new TestCaseGroup(testCtx, "input", "Different input primitives."));
251d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	MovePtr<TestCaseGroup> basicPrimitiveGroup		(new TestCaseGroup(testCtx, "basic_primitive", "Basic Primitive geometry tests"));
252d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	MovePtr<TestCaseGroup> triStripAdjacencyGroup	(new TestCaseGroup(testCtx, "triangle_strip_adjacency",	"Different triangle_strip_adjacency vertex counts."));
253d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	MovePtr<TestCaseGroup> conversionPrimitiveGroup	(new TestCaseGroup(testCtx, "conversion", "Different input and output primitives."));
254d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
255d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	const PrimitiveTestSpec inputPrimitives[] =
256d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	{
257d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		{ VK_PRIMITIVE_TOPOLOGY_POINT_LIST,						"points",					VK_PRIMITIVE_TOPOLOGY_POINT_LIST		},
258d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		{ VK_PRIMITIVE_TOPOLOGY_LINE_LIST,						"lines",					VK_PRIMITIVE_TOPOLOGY_LINE_STRIP		},
259d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		{ VK_PRIMITIVE_TOPOLOGY_LINE_STRIP,						"line_strip",				VK_PRIMITIVE_TOPOLOGY_LINE_STRIP		},
260d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		{ VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,					"triangles",				VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP	},
261d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		{ VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,					"triangle_strip",			VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP	},
262d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		{ VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN,					"triangle_fan",				VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP	},
263d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		{ VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY,		"lines_adjacency",			VK_PRIMITIVE_TOPOLOGY_LINE_STRIP		},
264d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		{ VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY,		"line_strip_adjacency",		VK_PRIMITIVE_TOPOLOGY_LINE_STRIP		},
265d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		{ VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY,	"triangles_adjacency",		VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP	}
266d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	};
267d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
268d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		// more basic types
269d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(inputPrimitives); ++ndx)
270d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			basicPrimitiveGroup->addChild(new GeometryExpanderRenderTest(testCtx, inputPrimitives[ndx]));
271d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
272d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		// triangle strip adjacency with different vertex counts
273d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		for (int vertexCount = 0; vertexCount <= 12; ++vertexCount)
274d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		{
275d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			const string name = "vertex_count_" + de::toString(vertexCount);
276d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			const PrimitiveTestSpec primitives = { VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY, name.c_str(), VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP };
277d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
278d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			triStripAdjacencyGroup->addChild(new TriangleStripAdjacencyVertexCountTest(testCtx, primitives, vertexCount));
279d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		}
280d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
281d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		// different type conversions
282d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		{
283d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			static const PrimitiveTestSpec conversionPrimitives[] =
284d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			{
285d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa				{ VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,	"triangles_to_points",	VK_PRIMITIVE_TOPOLOGY_POINT_LIST	},
286d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa				{ VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		"lines_to_points",		VK_PRIMITIVE_TOPOLOGY_POINT_LIST	},
287d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa				{ VK_PRIMITIVE_TOPOLOGY_POINT_LIST,		"points_to_lines",		VK_PRIMITIVE_TOPOLOGY_LINE_STRIP	},
288d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa				{ VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,	"triangles_to_lines",	VK_PRIMITIVE_TOPOLOGY_LINE_STRIP	},
289d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa				{ VK_PRIMITIVE_TOPOLOGY_POINT_LIST,		"points_to_triangles",	VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP},
290d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa				{ VK_PRIMITIVE_TOPOLOGY_LINE_LIST,		"lines_to_triangles",	VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP}
291d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			};
292d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
293d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa			for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(conversionPrimitives); ++ndx)
294d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa				conversionPrimitiveGroup->addChild(new GeometryExpanderRenderTest(testCtx, conversionPrimitives[ndx]));
295d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa		}
296d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
297d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	inputPrimitiveGroup->addChild(basicPrimitiveGroup.release());
298d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	inputPrimitiveGroup->addChild(triStripAdjacencyGroup.release());
299d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	inputPrimitiveGroup->addChild(conversionPrimitiveGroup.release());
300d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa	return inputPrimitiveGroup.release();
301d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa}
302d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa
303d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa} // geometry
304d5c8a7f813ed59d8c01ef9a8aa9a6087c3f946bfArkadiusz Sarwa} // vkt
305