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