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