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