1378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman/*------------------------------------------------------------------------- 2378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman * Vulkan Conformance Tests 3378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman * ------------------------ 4378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman * 5378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman * Copyright (c) 2016 Google Inc. 6378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman * 7978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 8978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License. 9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at 10378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman * 11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 12378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman * 13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software 14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and 17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License. 18378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman * 19378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman *//*! 20378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman * \file 21378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman * \brief Platform Synchronization tests 22378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman *//*--------------------------------------------------------------------*/ 23378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 247aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski#include "vktSynchronizationSmokeTests.hpp" 25378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 26378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vktTestCaseUtil.hpp" 27378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 28378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkPlatform.hpp" 29378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkStrUtil.hpp" 30378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkRef.hpp" 31378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkRefUtil.hpp" 32378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkDeviceUtil.hpp" 33378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 34378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "tcuTestLog.hpp" 35378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "tcuFormatUtil.hpp" 36378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 37378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "deUniquePtr.hpp" 38378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "deThread.hpp" 39378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkMemUtil.hpp" 40378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkQueryUtil.hpp" 41378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkPrograms.hpp" 42378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman#include "vkTypeUtil.hpp" 43378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 443241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos#include <limits> 453241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos 46378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmannamespace vkt 47378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 487aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowskinamespace synchronization 497aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski{ 50378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 51378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanusing namespace vk; 52378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanusing namespace tcu; 53378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 54378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmannamespace 55378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 56378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 57378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanusing std::vector; 58378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanusing std::string; 59378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanusing tcu::TestLog; 60378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanusing de::UniquePtr; 61378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanusing de::MovePtr; 62378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 63378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstatic const deUint64 DEFAULT_TIMEOUT = 2ull*1000*1000*1000; //!< 2 seconds in nanoseconds 64378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 65378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanvoid buildShaders (SourceCollections& shaderCollection) 66378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 67378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman shaderCollection.glslSources.add("glslvert") << 68378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman glu::VertexSource( 69378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman "#version 310 es\n" 70378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman "precision mediump float;\n" 71378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman "layout (location = 0) in vec4 vertexPosition;\n" 72378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman "void main()\n" 73378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman "{\n" 74378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman " gl_Position = vertexPosition;\n" 75378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman "}\n"); 76378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 77378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman shaderCollection.glslSources.add("glslfrag") << 78378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman glu::FragmentSource( 79378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman "#version 310 es\n" 80378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman "precision mediump float;\n" 81378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman "layout (location = 0) out vec4 outputColor;\n" 82378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman "void main()\n" 83378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman "{\n" 84378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman " outputColor = vec4(1.0, 0.0, 0.0, 1.0);\n" 85378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman "}\n"); 86378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} 87378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 88271157f1dfdc1129586f47e8064874d107f3edaeDae KimMove<VkDevice> createTestDevice (const InstanceInterface& vki, VkPhysicalDevice physicalDevice, deUint32 *outQueueFamilyIndex) 89378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 90378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkDeviceQueueCreateInfo queueInfo; 91378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkDeviceCreateInfo deviceInfo; 92378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman size_t queueNdx; 93226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski const deUint32 queueCount = 2u; 94226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski const float queuePriority[queueCount] = { 1.0f, 1.0f }; 95378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 96378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const vector<VkQueueFamilyProperties> queueProps = getPhysicalDeviceQueueFamilyProperties(vki, physicalDevice); 97378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const VkPhysicalDeviceFeatures physicalDeviceFeatures = getPhysicalDeviceFeatures(vki, physicalDevice); 98378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 99378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman for (queueNdx = 0; queueNdx < queueProps.size(); queueNdx++) 100378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 101271157f1dfdc1129586f47e8064874d107f3edaeDae Kim if ((queueProps[queueNdx].queueFlags & VK_QUEUE_GRAPHICS_BIT) == VK_QUEUE_GRAPHICS_BIT && (queueProps[queueNdx].queueCount >= queueCount)) 102378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman break; 103378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 104378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 105271157f1dfdc1129586f47e8064874d107f3edaeDae Kim if (queueNdx >= queueProps.size()) 106271157f1dfdc1129586f47e8064874d107f3edaeDae Kim { 107271157f1dfdc1129586f47e8064874d107f3edaeDae Kim // No queue family index found 108271157f1dfdc1129586f47e8064874d107f3edaeDae Kim std::ostringstream msg; 109271157f1dfdc1129586f47e8064874d107f3edaeDae Kim msg << "Cannot create device with " << queueCount << " graphics queues"; 110271157f1dfdc1129586f47e8064874d107f3edaeDae Kim 111271157f1dfdc1129586f47e8064874d107f3edaeDae Kim throw tcu::NotSupportedError(msg.str()); 112271157f1dfdc1129586f47e8064874d107f3edaeDae Kim } 113271157f1dfdc1129586f47e8064874d107f3edaeDae Kim 114378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deMemset(&queueInfo, 0, sizeof(queueInfo)); 115378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deMemset(&deviceInfo, 0, sizeof(deviceInfo)); 116378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 117ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&queueInfo, 0xcd, sizeof(queueInfo)); 118378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman queueInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; 119378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman queueInfo.pNext = DE_NULL; 120378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman queueInfo.flags = (VkDeviceQueueCreateFlags)0u; 121378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman queueInfo.queueFamilyIndex = (deUint32)queueNdx; 122271157f1dfdc1129586f47e8064874d107f3edaeDae Kim queueInfo.queueCount = queueCount; 123226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski queueInfo.pQueuePriorities = queuePriority; 124378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 125ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&deviceInfo, 0xcd, sizeof(deviceInfo)); 126378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deviceInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; 127378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deviceInfo.pNext = DE_NULL; 1287aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski deviceInfo.flags = (VkDeviceCreateFlags)0u; 129378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deviceInfo.queueCreateInfoCount = 1u; 130378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deviceInfo.pQueueCreateInfos = &queueInfo; 131378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deviceInfo.enabledExtensionCount = 0u; 132378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deviceInfo.ppEnabledExtensionNames = DE_NULL; 133378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deviceInfo.enabledLayerCount = 0u; 134378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deviceInfo.ppEnabledLayerNames = DE_NULL; 135378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deviceInfo.pEnabledFeatures = &physicalDeviceFeatures; 136378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 137271157f1dfdc1129586f47e8064874d107f3edaeDae Kim *outQueueFamilyIndex = queueInfo.queueFamilyIndex; 138271157f1dfdc1129586f47e8064874d107f3edaeDae Kim 139378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman return createDevice(vki, physicalDevice, &deviceInfo); 140378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}; 141378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 142378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct BufferParameters 143378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 144378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const void* memory; 145378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkDeviceSize size; 146378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkBufferUsageFlags usage; 147378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkSharingMode sharingMode; 148378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 queueFamilyCount; 149378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const deUint32* queueFamilyIndex; 150378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkAccessFlags inputBarrierFlags; 151378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}; 152378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 153378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct Buffer 154378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 155378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman MovePtr<Allocation> allocation; 156653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos vector<VkMemoryBarrier> memoryBarrier; 157378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vk::Move<VkBuffer> buffer; 158378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}; 159378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 160f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulosvoid createVulkanBuffer (const DeviceInterface& vkd, VkDevice device, Allocator& allocator, const BufferParameters& bufferParameters, Buffer& buffer, MemoryRequirement visibility) 161378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 162f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VkBufferCreateInfo bufferCreateParams; 163378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 164ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&bufferCreateParams, 0xcd, sizeof(bufferCreateParams)); 165378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferCreateParams.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; 166378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferCreateParams.pNext = DE_NULL; 167378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferCreateParams.flags = 0; 168378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferCreateParams.size = bufferParameters.size; 169378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferCreateParams.usage = bufferParameters.usage; 170378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferCreateParams.sharingMode = bufferParameters.sharingMode; 171378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferCreateParams.queueFamilyIndexCount = bufferParameters.queueFamilyCount; 172378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferCreateParams.pQueueFamilyIndices = bufferParameters.queueFamilyIndex; 173378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 174f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos buffer.buffer = createBuffer(vkd, device, &bufferCreateParams); 175f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos buffer.allocation = allocator.allocate(getBufferMemoryRequirements(vkd, device, *buffer.buffer), visibility); 176378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 177f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VK_CHECK(vkd.bindBufferMemory(device, *buffer.buffer, buffer.allocation->getMemory(), buffer.allocation->getOffset())); 178378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 179f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos // If caller provides a host memory buffer for the allocation, then go 180f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos // ahead and copy the provided data into the allocation and update the 181f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos // barrier list with the associated access 182f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos if (bufferParameters.memory != DE_NULL) 183378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 184f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VkMemoryBarrier barrier; 185f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VkMappedMemoryRange range; 186f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos 187f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos deMemset(&range, 0xcd, sizeof(range)); 188f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos range.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; 189f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos range.pNext = DE_NULL; 190f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos range.memory = buffer.allocation->getMemory(); 191f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos range.offset = buffer.allocation->getOffset(); 192f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos range.size = bufferParameters.size; 193f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos 194f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos deMemcpy(buffer.allocation->getHostPtr(), bufferParameters.memory, (size_t)bufferParameters.size); 195f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VK_CHECK(vkd.flushMappedMemoryRanges(device, 1, &range)); 196f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos 197f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos deMemset(&barrier, 0xcd, sizeof(barrier)); 198f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; 199f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos barrier.pNext = DE_NULL; 200f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT; 201f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos barrier.dstAccessMask = bufferParameters.inputBarrierFlags; 202f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos 203f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos buffer.memoryBarrier.push_back(barrier); 204378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 205378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} 206378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 207378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct ImageParameters 208378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 209378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkImageType imageType; 210378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkFormat format; 211378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkExtent3D extent3D; 212378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 mipLevels; 213378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkSampleCountFlagBits samples; 214378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkImageTiling tiling; 215378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkBufferUsageFlags usage; 216378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkSharingMode sharingMode; 217378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 queueFamilyCount; 218378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const deUint32* queueFamilyNdxList; 219378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkImageLayout initialLayout; 220378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkImageLayout finalLayout; 221378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkAccessFlags barrierInputMask; 222378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}; 223378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 224378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct Image 225378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 226378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vk::Move<VkImage> image; 227378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vk::Move<VkImageView> imageView; 228378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman MovePtr<Allocation> allocation; 229378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vector<VkImageMemoryBarrier> imageMemoryBarrier; 230378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}; 231378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 232f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulosvoid createVulkanImage (const DeviceInterface& vkd, VkDevice device, Allocator& allocator, const ImageParameters& imageParameters, Image& image, MemoryRequirement visibility) 233378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 234f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VkComponentMapping componentMap; 235f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VkImageSubresourceRange subresourceRange; 236f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VkImageViewCreateInfo imageViewCreateInfo; 237f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VkImageCreateInfo imageCreateParams; 238f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VkImageMemoryBarrier imageBarrier; 239378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 240ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&imageCreateParams, 0xcd, sizeof(imageCreateParams)); 241378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageCreateParams.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; 242378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageCreateParams.pNext = DE_NULL; 243378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageCreateParams.flags = 0; 244378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageCreateParams.imageType = imageParameters.imageType; 245378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageCreateParams.format = imageParameters.format; 246378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageCreateParams.extent = imageParameters.extent3D; 247378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageCreateParams.mipLevels = imageParameters.mipLevels; 248378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageCreateParams.arrayLayers = 1; 249378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageCreateParams.samples = imageParameters.samples; 250378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageCreateParams.tiling = imageParameters.tiling; 251378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageCreateParams.usage = imageParameters.usage; 252378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageCreateParams.sharingMode = imageParameters.sharingMode; 253378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageCreateParams.queueFamilyIndexCount = imageParameters.queueFamilyCount; 254378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageCreateParams.pQueueFamilyIndices = imageParameters.queueFamilyNdxList; 255378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageCreateParams.initialLayout = imageParameters.initialLayout; 256378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 257f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos image.image = createImage(vkd, device, &imageCreateParams); 258f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos image.allocation = allocator.allocate(getImageMemoryRequirements(vkd, device, *image.image), visibility); 259f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos 260f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VK_CHECK(vkd.bindImageMemory(device, *image.image, image.allocation->getMemory(), image.allocation->getOffset())); 261f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos 262f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos componentMap.r = VK_COMPONENT_SWIZZLE_R; 263f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos componentMap.g = VK_COMPONENT_SWIZZLE_G; 264f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos componentMap.b = VK_COMPONENT_SWIZZLE_B; 265f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos componentMap.a = VK_COMPONENT_SWIZZLE_A; 266f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos 267f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 268f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos subresourceRange.baseMipLevel = 0; 269f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos subresourceRange.levelCount = imageParameters.mipLevels; 270f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos subresourceRange.baseArrayLayer = 0; 271f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos subresourceRange.layerCount = 1; 272f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos 273f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos deMemset(&imageViewCreateInfo, 0xcd, sizeof(imageViewCreateInfo)); 274f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageViewCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; 275f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageViewCreateInfo.pNext = DE_NULL; 276f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageViewCreateInfo.flags = 0; 277f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageViewCreateInfo.image = image.image.get(); 278f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageViewCreateInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; 279f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageViewCreateInfo.format = imageParameters.format; 280f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageViewCreateInfo.components = componentMap; 281f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageViewCreateInfo.subresourceRange = subresourceRange; 282f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos 283f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos image.imageView = createImageView(vkd, device, &imageViewCreateInfo); 284f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos 285f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos deMemset(&imageBarrier, 0xcd, sizeof(imageBarrier)); 286f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; 287f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageBarrier.pNext = DE_NULL; 288f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageBarrier.srcAccessMask = 0; 289f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageBarrier.dstAccessMask = imageParameters.barrierInputMask; 290f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageBarrier.oldLayout = imageParameters.initialLayout; 291f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageBarrier.newLayout = imageParameters.finalLayout; 292f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageBarrier.srcQueueFamilyIndex = imageParameters.queueFamilyNdxList[0]; 293f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageBarrier.dstQueueFamilyIndex = imageParameters.queueFamilyNdxList[imageParameters.queueFamilyCount-1]; 294f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageBarrier.image = image.image.get(); 295f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos imageBarrier.subresourceRange = subresourceRange; 296f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos 297f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos image.imageMemoryBarrier.push_back(imageBarrier); 298378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} 299378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 300378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct RenderPassParameters 301378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 302378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkFormat colorFormat; 303378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkSampleCountFlagBits colorSamples; 304378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}; 305378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 306f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulosvoid createColorOnlyRenderPass (const DeviceInterface& vkd, VkDevice device, const RenderPassParameters& renderPassParameters, vk::Move<VkRenderPass>& renderPass) 307378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 308378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkAttachmentDescription colorAttachmentDesc; 309378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkAttachmentReference colorAttachmentRef; 310378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkAttachmentReference stencilAttachmentRef; 311378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkSubpassDescription subpassDesc; 312378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkRenderPassCreateInfo renderPassParams; 313378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkRenderPass newRenderPass; 314378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 315378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman colorAttachmentDesc.flags = 0; 316378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman colorAttachmentDesc.format = renderPassParameters.colorFormat; 317378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman colorAttachmentDesc.samples = renderPassParameters.colorSamples; 318378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman colorAttachmentDesc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; 319378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman colorAttachmentDesc.storeOp = VK_ATTACHMENT_STORE_OP_STORE; 320378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman colorAttachmentDesc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; 321378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman colorAttachmentDesc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; 322378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman colorAttachmentDesc.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; 323378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman colorAttachmentDesc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; 324378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 325378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman colorAttachmentRef.attachment = 0; 326378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; 327378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 3286cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos stencilAttachmentRef.attachment = VK_ATTACHMENT_UNUSED; 329378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman stencilAttachmentRef.layout = VK_IMAGE_LAYOUT_UNDEFINED; 330378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 331378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman subpassDesc.flags = 0; 332378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman subpassDesc.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; 333378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman subpassDesc.inputAttachmentCount = 0; 334378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman subpassDesc.pInputAttachments = DE_NULL; 335378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman subpassDesc.colorAttachmentCount = 1; 336378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman subpassDesc.pColorAttachments = &colorAttachmentRef; 337378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman subpassDesc.pResolveAttachments = DE_NULL; 338378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman subpassDesc.pDepthStencilAttachment = &stencilAttachmentRef; 339378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman subpassDesc.preserveAttachmentCount = 0; 340378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman subpassDesc.pPreserveAttachments = DE_NULL; 341378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 342ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&renderPassParams, 0xcd, sizeof(renderPassParams)); 343378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassParams.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; 344378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassParams.pNext = DE_NULL; 345378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassParams.flags = 0; 346378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassParams.attachmentCount = 1; 347378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassParams.pAttachments = &colorAttachmentDesc; 348378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassParams.subpassCount = 1; 349378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassParams.pSubpasses = &subpassDesc; 350378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassParams.dependencyCount = 0; 351378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassParams.pDependencies = DE_NULL; 352378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 353f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos renderPass = createRenderPass(vkd, device, &renderPassParams); 354378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} 355378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 356378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct ShaderDescParams 357378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 358f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VkShaderModule shaderModule; 359378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkShaderStageFlagBits stage; 360378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}; 361378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 362378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct VertexDesc 363378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 364378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 location; 365378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkFormat format; 366378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 stride; 367378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 offset; 368378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}; 369378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 370378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanvoid createVertexInfo (const vector<VertexDesc>& vertexDesc, vector<VkVertexInputBindingDescription>& bindingList, vector<VkVertexInputAttributeDescription>& attrList, VkPipelineVertexInputStateCreateInfo& vertexInputState) 371378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 372378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman for (vector<VertexDesc>::const_iterator vertDescIter = vertexDesc.begin(); vertDescIter != vertexDesc.end(); vertDescIter++) 373378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 374378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 bindingId = 0; 375378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkVertexInputBindingDescription bindingDesc; 376378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkVertexInputAttributeDescription attrDesc; 377378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 378378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bindingDesc.binding = bindingId; 379378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bindingDesc.stride = vertDescIter->stride; 380378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bindingDesc.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; 381378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bindingList.push_back(bindingDesc); 382378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 383378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman attrDesc.location = vertDescIter->location; 384378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman attrDesc.binding = bindingId; 385378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman attrDesc.format = vertDescIter->format; 386378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman attrDesc.offset = vertDescIter->offset; 387378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman attrList.push_back(attrDesc); 388378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 389378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bindingId++; 390378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 391378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 392ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&vertexInputState, 0xcd, sizeof(vertexInputState)); 3937aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski vertexInputState.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; 3947aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski vertexInputState.pNext = DE_NULL; 3957aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski vertexInputState.flags = 0u; 396378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vertexInputState.vertexBindingDescriptionCount = (deUint32)bindingList.size(); 397378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vertexInputState.pVertexBindingDescriptions = &bindingList[0]; 398378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vertexInputState.vertexAttributeDescriptionCount = (deUint32)attrList.size(); 399378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vertexInputState.pVertexAttributeDescriptions = &attrList[0]; 400378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} 401378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 402f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulosvoid createCommandBuffer (const DeviceInterface& deviceInterface, const VkDevice device, const deUint32 queueFamilyNdx, vk::Move<VkCommandBuffer>* commandBufferRef, vk::Move<VkCommandPool>* commandPoolRef) 403378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 404ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman vk::Move<VkCommandPool> commandPool; 405378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkCommandBufferAllocateInfo commandBufferInfo; 406378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkCommandBuffer commandBuffer; 407378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 408da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi commandPool = createCommandPool(deviceInterface, device, 0u, queueFamilyNdx); 409378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 410ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&commandBufferInfo, 0xcd, sizeof(commandBufferInfo)); 411378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman commandBufferInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; 412378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman commandBufferInfo.pNext = DE_NULL; 413ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman commandBufferInfo.commandPool = commandPool.get(); 414378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman commandBufferInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; 415378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman commandBufferInfo.commandBufferCount = 1; 416378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 417378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VK_CHECK(deviceInterface.allocateCommandBuffers(device, &commandBufferInfo, &commandBuffer)); 418ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman *commandBufferRef = vk::Move<VkCommandBuffer>(vk::check<VkCommandBuffer>(commandBuffer), Deleter<VkCommandBuffer>(deviceInterface, device, commandPool.get())); 419ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman *commandPoolRef = commandPool; 420378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} 421378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 422378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanvoid createFences (const DeviceInterface& deviceInterface, VkDevice device, bool signaled, deUint32 numFences, VkFence* fence) 423378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 424378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkFenceCreateInfo fenceState; 425378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkFenceCreateFlags signalFlag = signaled ? VK_FENCE_CREATE_SIGNALED_BIT : 0; 426378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 427ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&fenceState, 0xcd, sizeof(fenceState)); 428378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman fenceState.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; 429378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman fenceState.pNext = DE_NULL; 430378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman fenceState.flags = signalFlag; 431378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 432378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman for (deUint32 ndx = 0; ndx < numFences; ndx++) 433378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VK_CHECK(deviceInterface.createFence(device, &fenceState, DE_NULL, &fence[ndx])); 434378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} 435378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 436378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanvoid destroyFences (const DeviceInterface& deviceInterface, VkDevice device, deUint32 numFences, VkFence* fence) 437378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 438378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman for (deUint32 ndx = 0; ndx < numFences; ndx++) 439378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deviceInterface.destroyFence(device, fence[ndx], DE_NULL); 440378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} 441378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 442378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct RenderInfo 443378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 444378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deInt32 width; 445378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deInt32 height; 446378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 vertexBufferSize; 447378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkBuffer vertexBuffer; 448378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkImage image; 449378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkCommandBuffer commandBuffer; 450378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkRenderPass renderPass; 451378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkFramebuffer framebuffer; 4526222af852976871f07c00b792cae50eb458d0703Pyry Haulos VkPipeline pipeline; 453378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 mipLevels; 454378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const deUint32* queueFamilyNdxList; 455378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 queueFamilyNdxCount; 456378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bool waitEvent; 457378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkEvent event; 458378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vector<VkImageMemoryBarrier>* barriers; 459378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}; 460378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 461f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulosvoid recordRenderPass (const DeviceInterface& deviceInterface, const RenderInfo& renderInfo) 462378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 463378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const VkDeviceSize bindingOffset = 0; 464378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const VkClearValue clearValue = makeClearValueColorF32(0.0, 0.0, 1.0, 1.0); 465378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkRenderPassBeginInfo renderPassBeginState; 466378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkImageMemoryBarrier renderBarrier; 467378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 468ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&renderPassBeginState, 0xcd, sizeof(renderPassBeginState)); 469378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassBeginState.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; 470378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassBeginState.pNext = DE_NULL; 471378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassBeginState.renderPass = renderInfo.renderPass; 472378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassBeginState.framebuffer = renderInfo.framebuffer; 473378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassBeginState.renderArea.offset.x = 0; 474378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassBeginState.renderArea.offset.y = 0; 475378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassBeginState.renderArea.extent.width = renderInfo.width; 476378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassBeginState.renderArea.extent.height = renderInfo.height; 477378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassBeginState.clearValueCount = 1; 478378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassBeginState.pClearValues = &clearValue; 479378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 480378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman if (renderInfo.waitEvent) 481f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman deviceInterface.cmdWaitEvents(renderInfo.commandBuffer, 1, &renderInfo.event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, DE_NULL, 0, DE_NULL, 0, DE_NULL); 4820e54da35ac023351bb8b3bd4f55d0c98d812ef8dPeter Quayle deviceInterface.cmdBeginRenderPass(renderInfo.commandBuffer, &renderPassBeginState, VK_SUBPASS_CONTENTS_INLINE); 4836222af852976871f07c00b792cae50eb458d0703Pyry Haulos deviceInterface.cmdBindPipeline(renderInfo.commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, renderInfo.pipeline); 484378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deviceInterface.cmdBindVertexBuffers(renderInfo.commandBuffer, 0u, 1u, &renderInfo.vertexBuffer, &bindingOffset); 485378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deviceInterface.cmdDraw(renderInfo.commandBuffer, renderInfo.vertexBufferSize, 1, 0, 0); 486226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski deviceInterface.cmdEndRenderPass(renderInfo.commandBuffer); 487378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 488ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&renderBarrier, 0xcd, sizeof(renderBarrier)); 489378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; 490378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderBarrier.pNext = DE_NULL; 491378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderBarrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; 492378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderBarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; 493378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderBarrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; 494378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderBarrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; 495378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderBarrier.srcQueueFamilyIndex = renderInfo.queueFamilyNdxList[0]; 496378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderBarrier.dstQueueFamilyIndex = renderInfo.queueFamilyNdxList[renderInfo.queueFamilyNdxCount-1]; 497378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderBarrier.image = renderInfo.image; 498378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderBarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 499378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderBarrier.subresourceRange.baseMipLevel = 0; 500378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderBarrier.subresourceRange.levelCount = renderInfo.mipLevels; 501378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderBarrier.subresourceRange.baseArrayLayer = 0; 502378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderBarrier.subresourceRange.layerCount = 1; 503378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderInfo.barriers->push_back(renderBarrier); 504378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} 505378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 506378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct TransferInfo 507378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 508378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkCommandBuffer commandBuffer; 509378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 width; 510378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 height; 511378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkImage image; 512378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkBuffer buffer; 513378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkDeviceSize size; 514378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 mipLevel; 515378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkOffset3D imageOffset; 516378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vector<VkBufferMemoryBarrier>* barriers; 517378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}; 518378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 519f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulosvoid copyToCPU (const DeviceInterface& vkd, TransferInfo* transferInfo) 520378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 521f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VkBufferImageCopy copyState; 522378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 523378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman copyState.bufferOffset = 0; 524378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman copyState.bufferRowLength = transferInfo->width; 525378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman copyState.bufferImageHeight = transferInfo->height; 526378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman copyState.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; 527378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman copyState.imageSubresource.mipLevel = transferInfo->mipLevel; 528378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman copyState.imageSubresource.baseArrayLayer = 0; 529378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman copyState.imageSubresource.layerCount = 1; 530378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman copyState.imageOffset = transferInfo->imageOffset; 531378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman copyState.imageExtent.width = (deInt32)(transferInfo->width); 532378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman copyState.imageExtent.height = (deInt32)(transferInfo->height); 533378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman copyState.imageExtent.depth = 1; 534378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 535f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos vkd.cmdCopyImageToBuffer(transferInfo->commandBuffer, transferInfo->image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, transferInfo->buffer, 1, ©State); 536378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 537378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 538378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkBufferMemoryBarrier bufferBarrier; 539ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&bufferBarrier, 0xcd, sizeof(bufferBarrier)); 540378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferBarrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER; 541378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferBarrier.pNext = DE_NULL; 542378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferBarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; 543378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferBarrier.dstAccessMask = VK_ACCESS_HOST_READ_BIT; 544378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; 545378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; 546378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferBarrier.buffer = transferInfo->buffer; 547378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferBarrier.offset = 0; 548378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferBarrier.size = transferInfo->size; 549378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman transferInfo->barriers->push_back(bufferBarrier); 550378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 551378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} 552378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 553378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstruct TestContext 554378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 555f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos const DeviceInterface& vkd; 556f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos const VkDevice device; 557f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos const deUint32 queueFamilyIndex; 558f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos const BinaryCollection& binaryCollection; 559f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos Allocator& allocator; 560f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos 561378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const tcu::Vec4* vertices; 562378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 numVertices; 563378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::IVec2 renderDimension; 564378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkFence fences[2]; 565378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkDeviceSize renderSize; 566378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman MovePtr<Allocation> renderReadBuffer; 567378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman MovePtr<Allocation> vertexBufferAllocation; 568378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vk::Move<VkBuffer> vertexBuffer; 569378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vk::Move<VkBuffer> renderBuffer; 570378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bool waitEvent; 571378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkEvent event; 572378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vk::Move<VkImage> image; 573378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vk::Move<VkImageView> imageView; 574f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos vk::Move<VkFramebuffer> framebuffer; 575ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman vk::Move<VkCommandPool> commandPool; 576f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos vk::Move<VkCommandBuffer> cmdBuffer; 577ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman vk::Move<VkRenderPass> renderPass; 5786222af852976871f07c00b792cae50eb458d0703Pyry Haulos vk::Move<VkPipelineCache> pipelineCache; 5796222af852976871f07c00b792cae50eb458d0703Pyry Haulos vk::Move<VkPipeline> pipeline; 580378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman MovePtr<Allocation> imageAllocation; 581378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 582f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos TestContext (const DeviceInterface& vkd_, 583f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos const VkDevice device_, 584f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos deUint32 queueFamilyIndex_, 585f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos const BinaryCollection& binaryCollection_, 586f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos Allocator& allocator_) 587f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos : vkd (vkd_) 588f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos , device (device_) 589f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos , queueFamilyIndex (queueFamilyIndex_) 590f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos , binaryCollection (binaryCollection_) 591f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos , allocator (allocator_) 592f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos , numVertices (0) 593f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman , waitEvent (false) 594378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 595f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos createFences(vkd, device, false, DE_LENGTH_OF_ARRAY(fences), fences); 596378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 597378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 598378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman ~TestContext() 599378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 600f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos destroyFences(vkd, device, DE_LENGTH_OF_ARRAY(fences), fences); 601378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 602378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman}; 603378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 604378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanvoid generateWork (TestContext& testContext) 605378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 606f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos const DeviceInterface& deviceInterface = testContext.vkd; 607f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos const deUint32 queueFamilyNdx = testContext.queueFamilyIndex; 608f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos 609f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos // \note VkShaderModule is consumed by vkCreate*Pipelines() so it can be deleted 610f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos // as pipeline has been constructed. 611f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos const vk::Unique<VkShaderModule> vertShaderModule (createShaderModule(deviceInterface, 612f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos testContext.device, 613f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos testContext.binaryCollection.get("glslvert"), 614f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos (VkShaderModuleCreateFlags)0)); 615f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos 616f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos const vk::Unique<VkShaderModule> fragShaderModule (createShaderModule(deviceInterface, 617f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos testContext.device, 618f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos testContext.binaryCollection.get("glslfrag"), 619f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos (VkShaderModuleCreateFlags)0)); 620f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos const VkPipelineShaderStageCreateInfo shaderStageParams[] = 621f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos { 622f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos { 623f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 624f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos DE_NULL, 625f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos (VkPipelineShaderStageCreateFlags)0, 626f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VK_SHADER_STAGE_VERTEX_BIT, 627f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos *vertShaderModule, 628f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos "main", 629f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos (const VkSpecializationInfo*)DE_NULL, 630f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos }, 631f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos { 632f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, 633f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos DE_NULL, 634f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos (VkPipelineShaderStageCreateFlags)0, 635f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos VK_SHADER_STAGE_FRAGMENT_BIT, 636f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos *fragShaderModule, 637f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos "main", 638f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos (const VkSpecializationInfo*)DE_NULL, 639f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos } 640f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos }; 641f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos 642ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman vk::Move<VkPipelineLayout> layout; 643378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vector<ShaderDescParams> shaderDescParams; 644378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VertexDesc vertexDesc; 645378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vector<VertexDesc> vertexDescList; 646378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vector<VkVertexInputAttributeDescription> attrList; 647378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vector<VkBufferMemoryBarrier> bufferMemoryBarrier; 648378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 memoryBarrierNdx; 649378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 bufferMemoryBarrierNdx; 650378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deUint32 imageMemoryBarrierNdx; 651378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vector<VkVertexInputBindingDescription> bindingList; 652378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkPipelineVertexInputStateCreateInfo vertexInputState; 653378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkPipelineInputAssemblyStateCreateInfo inputAssemblyState; 654378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkPipelineDepthStencilStateCreateInfo depthStencilState; 655378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkPipelineColorBlendAttachmentState blendAttachment; 656378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkPipelineColorBlendStateCreateInfo blendState; 657378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkPipelineLayoutCreateInfo pipelineLayoutState; 658378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkGraphicsPipelineCreateInfo pipelineState; 659378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkPipelineCacheCreateInfo cacheState; 660378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkViewport viewport; 661378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkPipelineViewportStateCreateInfo viewportInfo; 662378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkRect2D scissor; 663378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman BufferParameters bufferParameters; 664378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman Buffer buffer; 665378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman RenderInfo renderInfo; 666378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman ImageParameters imageParameters; 667378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman Image image; 668378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkPipelineRasterizationStateCreateInfo rasterState; 669378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkPipelineMultisampleStateCreateInfo multisampleState; 670378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkFramebufferCreateInfo fbState; 671378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkCommandBufferBeginInfo commandBufRecordState; 672378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkCommandBufferInheritanceInfo inheritanceInfo; 673378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman RenderPassParameters renderPassParameters; 674378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman TransferInfo transferInfo; 675378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vector<void*> barrierList; 676378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkExtent3D extent; 677378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vector<VkMemoryBarrier> memoryBarriers; 678378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vector<VkBufferMemoryBarrier> bufferBarriers; 679378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vector<VkImageMemoryBarrier> imageBarriers; 680378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 681378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman memoryBarrierNdx = 0; 682378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferMemoryBarrierNdx = 0; 683378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageMemoryBarrierNdx = 0; 684378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman buffer.memoryBarrier.resize(memoryBarrierNdx); 685378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferMemoryBarrier.resize(bufferMemoryBarrierNdx); 686378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman image.imageMemoryBarrier.resize(imageMemoryBarrierNdx); 687378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 688378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman memoryBarriers.resize(0); 689378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferBarriers.resize(0); 690378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageBarriers.resize(0); 691378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 692378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferParameters.memory = testContext.vertices; 693378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferParameters.size = testContext.numVertices * sizeof(tcu::Vec4); 694378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferParameters.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; 695378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferParameters.sharingMode = VK_SHARING_MODE_EXCLUSIVE; 696378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferParameters.queueFamilyCount = 1; 697378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferParameters.queueFamilyIndex = &queueFamilyNdx; 698378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferParameters.inputBarrierFlags = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT; 699f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos createVulkanBuffer(deviceInterface, testContext.device, testContext.allocator, bufferParameters, buffer, MemoryRequirement::HostVisible); 700378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman testContext.vertexBufferAllocation = buffer.allocation; 701378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman testContext.vertexBuffer = buffer.buffer; 702378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 703378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferParameters.memory = DE_NULL; 704378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferParameters.size = testContext.renderSize; 705378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferParameters.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT; 706378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferParameters.sharingMode = VK_SHARING_MODE_EXCLUSIVE; 707378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferParameters.queueFamilyCount = 1; 708378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferParameters.queueFamilyIndex = &queueFamilyNdx; 709378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferParameters.inputBarrierFlags = 0; 710f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos createVulkanBuffer(deviceInterface, testContext.device, testContext.allocator, bufferParameters, buffer, MemoryRequirement::HostVisible); 711378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman testContext.renderReadBuffer = buffer.allocation; 712378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman testContext.renderBuffer = buffer.buffer; 713378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 714378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman extent.width = testContext.renderDimension.x(); 715378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman extent.height = testContext.renderDimension.y(); 716378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman extent.depth = 1; 717378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 718653ad0e8a4209754304cbd5b5ceb4fdc7b29c01aPyry Haulos imageParameters.imageType = VK_IMAGE_TYPE_2D; 719378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageParameters.format = VK_FORMAT_R8G8B8A8_UNORM; 720378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageParameters.extent3D = extent; 721378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageParameters.mipLevels = 1; 722378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageParameters.samples = VK_SAMPLE_COUNT_1_BIT; 723378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageParameters.tiling = VK_IMAGE_TILING_OPTIMAL; 724378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageParameters.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSFER_SRC_BIT; 725378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageParameters.sharingMode = VK_SHARING_MODE_EXCLUSIVE; 726378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageParameters.queueFamilyCount = 1; 727378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageParameters.queueFamilyNdxList = &queueFamilyNdx; 728378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageParameters.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; 729378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageParameters.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; 730378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageParameters.barrierInputMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; 731f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos createVulkanImage(deviceInterface, testContext.device, testContext.allocator, imageParameters, image, MemoryRequirement::Any); 732378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman testContext.imageAllocation = image.allocation; 733378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman testContext.image = image.image; 734378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 735159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos for (size_t ndx = 0; ndx < image.imageMemoryBarrier.size(); ++ndx) 736159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos imageBarriers.push_back(image.imageMemoryBarrier[ndx]); 737159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos 738378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassParameters.colorFormat = VK_FORMAT_R8G8B8A8_UNORM; 739378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderPassParameters.colorSamples = VK_SAMPLE_COUNT_1_BIT; 740f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos createColorOnlyRenderPass(deviceInterface, testContext.device, renderPassParameters, testContext.renderPass); 741378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 742378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vertexDesc.location = 0; 743378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vertexDesc.format = VK_FORMAT_R32G32B32A32_SFLOAT; 744378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vertexDesc.stride = sizeof(tcu::Vec4); 745378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vertexDesc.offset = 0; 746378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman vertexDescList.push_back(vertexDesc); 747378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 748378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman createVertexInfo(vertexDescList, bindingList, attrList, vertexInputState); 749378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 750ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&inputAssemblyState, 0xcd, sizeof(inputAssemblyState)); 751378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman inputAssemblyState.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; 752378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman inputAssemblyState.pNext = DE_NULL; 7537aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski inputAssemblyState.flags = 0u; 754378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman inputAssemblyState.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; 755f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman inputAssemblyState.primitiveRestartEnable = false; 756378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 757378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman viewport.x = 0; 758378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman viewport.y = 0; 759378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman viewport.width = (float)testContext.renderDimension.x(); 760378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman viewport.height = (float)testContext.renderDimension.y(); 761378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman viewport.minDepth = 0; 762378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman viewport.maxDepth = 1; 763378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 764378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman scissor.offset.x = 0; 765378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman scissor.offset.y = 0; 766378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman scissor.extent.width = testContext.renderDimension.x(); 767378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman scissor.extent.height = testContext.renderDimension.y(); 768378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 769ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&viewportInfo, 0xcd, sizeof(viewportInfo)); 770378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman viewportInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; 771378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman viewportInfo.pNext = DE_NULL; 772378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman viewportInfo.flags = 0; 773378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman viewportInfo.viewportCount = 1; 774378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman viewportInfo.pViewports = &viewport; 775378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman viewportInfo.scissorCount = 1; 776378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman viewportInfo.pScissors = &scissor; 777378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 778ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&rasterState, 0xcd, sizeof(rasterState)); 779378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman rasterState.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; 780378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman rasterState.pNext = DE_NULL; 781378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman rasterState.flags = 0; 782378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman rasterState.depthClampEnable = VK_TRUE; 783378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman rasterState.rasterizerDiscardEnable = VK_FALSE; 784378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman rasterState.polygonMode = VK_POLYGON_MODE_FILL; 785378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman rasterState.cullMode = VK_CULL_MODE_NONE; 786378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman rasterState.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; 787378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman rasterState.depthBiasEnable = VK_FALSE; 788378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman rasterState.lineWidth = 1; 789378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 790ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&multisampleState, 0xcd, sizeof(multisampleState)); 791378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman multisampleState.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; 792378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman multisampleState.pNext = DE_NULL; 793378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman multisampleState.flags = 0; 794378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman multisampleState.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; 795378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman multisampleState.sampleShadingEnable = VK_FALSE; 796378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman multisampleState.pSampleMask = DE_NULL; 797378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman multisampleState.alphaToCoverageEnable = VK_FALSE; 798378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman multisampleState.alphaToOneEnable = VK_FALSE; 799378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 800ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&depthStencilState, 0xcd, sizeof(depthStencilState)); 801378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman depthStencilState.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; 802378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman depthStencilState.pNext = DE_NULL; 803378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman depthStencilState.flags = 0; 804378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman depthStencilState.depthTestEnable = VK_FALSE; 805378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman depthStencilState.depthWriteEnable = VK_FALSE; 806226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski depthStencilState.depthCompareOp = VK_COMPARE_OP_ALWAYS; 807378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman depthStencilState.depthBoundsTestEnable = VK_FALSE; 808378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman depthStencilState.stencilTestEnable = VK_FALSE; 809159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos depthStencilState.front.failOp = VK_STENCIL_OP_KEEP; 810159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos depthStencilState.front.passOp = VK_STENCIL_OP_KEEP; 811159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos depthStencilState.front.depthFailOp = VK_STENCIL_OP_KEEP; 812226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski depthStencilState.front.compareOp = VK_COMPARE_OP_ALWAYS; 813226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski depthStencilState.front.compareMask = 0u; 814226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski depthStencilState.front.writeMask = 0u; 815226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski depthStencilState.front.reference = 0u; 816159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos depthStencilState.back = depthStencilState.front; 817378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 818ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&blendAttachment, 0xcd, sizeof(blendAttachment)); 819378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman blendAttachment.blendEnable = VK_FALSE; 820159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos blendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_ZERO; 821159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos blendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; 822159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos blendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ZERO; 823159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos blendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; 824159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos blendAttachment.colorBlendOp = VK_BLEND_OP_ADD; 825159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos blendAttachment.alphaBlendOp = VK_BLEND_OP_ADD; 8267aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski blendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; 827378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 828ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&blendState, 0xcd, sizeof(blendState)); 829378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman blendState.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; 830378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman blendState.pNext = DE_NULL; 831378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman blendState.flags = 0; 832378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman blendState.logicOpEnable = VK_FALSE; 833159fc09e140bcc251b442f8d7ead67e5af2204d8Pyry Haulos blendState.logicOp = VK_LOGIC_OP_COPY; 834378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman blendState.attachmentCount = 1; 835378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman blendState.pAttachments = &blendAttachment; 836378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 837ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&pipelineLayoutState, 0xcd, sizeof(pipelineLayoutState)); 838378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineLayoutState.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; 839378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineLayoutState.pNext = DE_NULL; 840378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineLayoutState.flags = 0; 841378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineLayoutState.setLayoutCount = 0; 842378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineLayoutState.pSetLayouts = DE_NULL; 843378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineLayoutState.pushConstantRangeCount = 0; 844378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineLayoutState.pPushConstantRanges = DE_NULL; 845ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman layout = createPipelineLayout(deviceInterface, testContext.device, &pipelineLayoutState, DE_NULL); 846378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 847ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&pipelineState, 0xcd, sizeof(pipelineState)); 848378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineState.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; 849378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineState.pNext = DE_NULL; 850378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineState.flags = 0; 851f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos pipelineState.stageCount = DE_LENGTH_OF_ARRAY(shaderStageParams); 852f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos pipelineState.pStages = &shaderStageParams[0]; 853378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineState.pVertexInputState = &vertexInputState; 854378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineState.pInputAssemblyState = &inputAssemblyState; 855378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineState.pTessellationState = DE_NULL; 856378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineState.pViewportState = &viewportInfo; 857378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineState.pRasterizationState = &rasterState; 858378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineState.pMultisampleState = &multisampleState; 859378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineState.pDepthStencilState = &depthStencilState; 860378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineState.pColorBlendState = &blendState; 86186a8ae9e0d61bbfe1f1e273fdbb026369bdb5f29Pyry Haulos pipelineState.pDynamicState = (const VkPipelineDynamicStateCreateInfo*)DE_NULL; 862ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman pipelineState.layout = layout.get(); 863ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman pipelineState.renderPass = testContext.renderPass.get(); 864378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineState.subpass = 0; 865378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineState.basePipelineHandle = DE_NULL; 866378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman pipelineState.basePipelineIndex = 0; 867378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 868ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&cacheState, 0xcd, sizeof(cacheState)); 869378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman cacheState.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; 870378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman cacheState.pNext = DE_NULL; 871378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman cacheState.flags = 0; 872378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman cacheState.initialDataSize = 0; 873378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman cacheState.pInitialData = DE_NULL; 874378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 8756222af852976871f07c00b792cae50eb458d0703Pyry Haulos testContext.pipelineCache = createPipelineCache(deviceInterface, testContext.device, &cacheState); 8766222af852976871f07c00b792cae50eb458d0703Pyry Haulos testContext.pipeline = createGraphicsPipeline(deviceInterface, testContext.device, testContext.pipelineCache.get(), &pipelineState); 877378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 878ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&fbState, 0xcd, sizeof(fbState)); 879378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman fbState.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; 880378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman fbState.pNext = DE_NULL; 881378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman fbState.flags = 0; 882ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman fbState.renderPass = testContext.renderPass.get(); 883378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman fbState.attachmentCount = 1; 884378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman fbState.pAttachments = &image.imageView.get(); 885378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman fbState.width = (deUint32)testContext.renderDimension.x(); 886378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman fbState.height = (deUint32)testContext.renderDimension.y(); 887378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman fbState.layers = 1; 888f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos 889f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos testContext.framebuffer = createFramebuffer(deviceInterface, testContext.device, &fbState); 890f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos testContext.imageView = image.imageView; 891378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 892ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&inheritanceInfo, 0xcd, sizeof(inheritanceInfo)); 893378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman inheritanceInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO; 894378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman inheritanceInfo.pNext = DE_NULL; 895ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman inheritanceInfo.renderPass = testContext.renderPass.get(); 896378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman inheritanceInfo.subpass = 0; 897f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos inheritanceInfo.framebuffer = *testContext.framebuffer; 898378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman inheritanceInfo.occlusionQueryEnable = VK_FALSE; 8997aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski inheritanceInfo.queryFlags = 0u; 9007aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski inheritanceInfo.pipelineStatistics = 0u; 901378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 902ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman deMemset(&commandBufRecordState, 0xcd, sizeof(commandBufRecordState)); 903378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman commandBufRecordState.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; 904378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman commandBufRecordState.pNext = DE_NULL; 905378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman commandBufRecordState.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; 906378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman commandBufRecordState.pInheritanceInfo = &inheritanceInfo; 907378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VK_CHECK(deviceInterface.beginCommandBuffer(testContext.cmdBuffer.get(), &commandBufRecordState)); 908378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 909378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deviceInterface.cmdPipelineBarrier( testContext.cmdBuffer.get(), 910378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VK_PIPELINE_STAGE_HOST_BIT, 911378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 912f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman false, 913f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos (deUint32)memoryBarriers.size(), (memoryBarriers.empty() ? DE_NULL : &memoryBarriers[0]), 914f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos (deUint32)bufferBarriers.size(), (bufferBarriers.empty() ? DE_NULL : &bufferBarriers[0]), 915f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos (deUint32)imageBarriers.size(), (imageBarriers.empty() ? DE_NULL : &imageBarriers[0])); 916378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 917378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman memoryBarriers.resize(0); 918378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferBarriers.resize(0); 919378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageBarriers.resize(0); 920378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 921378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderInfo.width = testContext.renderDimension.x(); 922378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderInfo.height = testContext.renderDimension.y(); 923378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderInfo.vertexBufferSize = testContext.numVertices; 924378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderInfo.vertexBuffer = testContext.vertexBuffer.get(); 925378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderInfo.image = testContext.image.get(); 926378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderInfo.commandBuffer = testContext.cmdBuffer.get(); 927ac2dfbbebc7080c6a06dba3aeeb741c5077c6a68David Sodman renderInfo.renderPass = testContext.renderPass.get(); 928f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos renderInfo.framebuffer = *testContext.framebuffer; 9296222af852976871f07c00b792cae50eb458d0703Pyry Haulos renderInfo.pipeline = *testContext.pipeline; 930378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderInfo.mipLevels = 1; 931378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderInfo.queueFamilyNdxList = &queueFamilyNdx; 932378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderInfo.queueFamilyNdxCount = 1; 933378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderInfo.waitEvent = testContext.waitEvent; 934378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderInfo.event = testContext.event; 935378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman renderInfo.barriers = &imageBarriers; 936f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos recordRenderPass(deviceInterface, renderInfo); 937378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 938378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deviceInterface.cmdPipelineBarrier( renderInfo.commandBuffer, 939378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, 940378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VK_PIPELINE_STAGE_TRANSFER_BIT, 941f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman false, 942f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos (deUint32)memoryBarriers.size(), (memoryBarriers.empty() ? DE_NULL : &memoryBarriers[0]), 943f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos (deUint32)bufferBarriers.size(), (bufferBarriers.empty() ? DE_NULL : &bufferBarriers[0]), 944f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos (deUint32)imageBarriers.size(), (imageBarriers.empty() ? DE_NULL : &imageBarriers[0])); 945378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 946378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman memoryBarriers.resize(0); 947378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferBarriers.resize(0); 948378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageBarriers.resize(0); 949378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 950378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman transferInfo.commandBuffer = renderInfo.commandBuffer; 951378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman transferInfo.width = testContext.renderDimension.x(); 952378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman transferInfo.height = testContext.renderDimension.y(); 953378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman transferInfo.image = renderInfo.image; 954378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman transferInfo.buffer = testContext.renderBuffer.get(); 955378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman transferInfo.size = testContext.renderSize; 956378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman transferInfo.mipLevel = 0; 957378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman transferInfo.imageOffset.x = 0; 958378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman transferInfo.imageOffset.y = 0; 959378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman transferInfo.imageOffset.z = 0; 960378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman transferInfo.barriers = &bufferBarriers; 961f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos copyToCPU(deviceInterface, &transferInfo); 962378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 963378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman deviceInterface.cmdPipelineBarrier( transferInfo.commandBuffer, 964378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VK_PIPELINE_STAGE_TRANSFER_BIT, 965378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VK_PIPELINE_STAGE_HOST_BIT, 966f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman false, 967f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos (deUint32)memoryBarriers.size(), (memoryBarriers.empty() ? DE_NULL : &memoryBarriers[0]), 968f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos (deUint32)bufferBarriers.size(), (bufferBarriers.empty() ? DE_NULL : &bufferBarriers[0]), 969f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos (deUint32)imageBarriers.size(), (imageBarriers.empty() ? DE_NULL : &imageBarriers[0])); 970378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 971378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman memoryBarriers.resize(0); 972378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman bufferBarriers.resize(0); 973378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman imageBarriers.resize(0); 974378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 975378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VK_CHECK(deviceInterface.endCommandBuffer(transferInfo.commandBuffer)); 976378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} 977378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 978378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmanstatic void initSubmitInfo (VkSubmitInfo* submitInfo, deUint32 submitInfoCount) 979378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 980378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman for (deUint32 ndx = 0; ndx < submitInfoCount; ndx++) 981378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 982378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman submitInfo[ndx].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; 983378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman submitInfo[ndx].pNext = DE_NULL; 984378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman submitInfo[ndx].waitSemaphoreCount = 0; 985378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman submitInfo[ndx].pWaitSemaphores = DE_NULL; 986378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman submitInfo[ndx].pWaitDstStageMask = DE_NULL; 987378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman submitInfo[ndx].commandBufferCount = 1; 988378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman submitInfo[ndx].signalSemaphoreCount = 0; 989378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman submitInfo[ndx].pSignalSemaphores = DE_NULL; 990378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 991378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} 992378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 993378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmantcu::TestStatus testFences (Context& context) 994378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 995378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman TestLog& log = context.getTestContext().getLog(); 996378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const DeviceInterface& deviceInterface = context.getDeviceInterface(); 997378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const VkQueue queue = context.getUniversalQueue(); 998378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const deUint32 queueFamilyIdx = context.getUniversalQueueFamilyIndex(); 999271157f1dfdc1129586f47e8064874d107f3edaeDae Kim VkDevice device = context.getDevice(); 10003241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos VkResult waitStatus; 1001378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkResult fenceStatus; 1002f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos TestContext testContext (deviceInterface, device, queueFamilyIdx, context.getBinaryCollection(), context.getDefaultAllocator()); 1003378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkSubmitInfo submitInfo; 1004378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkMappedMemoryRange range; 1005378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman void* resultImage; 1006378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1007378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const tcu::Vec4 vertices[] = 1008378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 1009378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::Vec4( 0.5f, 0.5f, 0.0f, 1.0f), 1010378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::Vec4(-0.5f, 0.5f, 0.0f, 1.0f), 1011378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::Vec4( 0.0f, -0.5f, 0.0f, 1.0f) 1012378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman }; 1013378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1014378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman testContext.vertices = vertices; 1015378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman testContext.numVertices = DE_LENGTH_OF_ARRAY(vertices); 1016378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman testContext.renderDimension = tcu::IVec2(256, 256); 1017378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman testContext.renderSize = sizeof(deUint32) * testContext.renderDimension.x() * testContext.renderDimension.y(); 1018378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1019f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos createCommandBuffer(deviceInterface, device, queueFamilyIdx, &testContext.cmdBuffer, &testContext.commandPool); 1020378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman generateWork(testContext); 1021378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1022378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman initSubmitInfo(&submitInfo, 1); 1023378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman submitInfo.pCommandBuffers = &testContext.cmdBuffer.get(); 1024378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1025271157f1dfdc1129586f47e8064874d107f3edaeDae Kim // Default status is unsignaled 1026271157f1dfdc1129586f47e8064874d107f3edaeDae Kim fenceStatus = deviceInterface.getFenceStatus(device, testContext.fences[0]); 1027378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman if (fenceStatus != VK_NOT_READY) 1028378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 1029271157f1dfdc1129586f47e8064874d107f3edaeDae Kim log << TestLog::Message << "testSynchronizationPrimitives fence 0 should be reset but status is " << getResultName(fenceStatus) << TestLog::EndMessage; 1030378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman return tcu::TestStatus::fail("Fence in incorrect state"); 1031378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 1032271157f1dfdc1129586f47e8064874d107f3edaeDae Kim fenceStatus = deviceInterface.getFenceStatus(device, testContext.fences[1]); 1033271157f1dfdc1129586f47e8064874d107f3edaeDae Kim if (fenceStatus != VK_NOT_READY) 1034271157f1dfdc1129586f47e8064874d107f3edaeDae Kim { 1035271157f1dfdc1129586f47e8064874d107f3edaeDae Kim log << TestLog::Message << "testSynchronizationPrimitives fence 1 should be reset but status is " << getResultName(fenceStatus) << TestLog::EndMessage; 1036271157f1dfdc1129586f47e8064874d107f3edaeDae Kim return tcu::TestStatus::fail("Fence in incorrect state"); 1037271157f1dfdc1129586f47e8064874d107f3edaeDae Kim } 1038271157f1dfdc1129586f47e8064874d107f3edaeDae Kim 1039271157f1dfdc1129586f47e8064874d107f3edaeDae Kim VK_CHECK(deviceInterface.queueSubmit(queue, 1, &submitInfo, testContext.fences[0])); 1040378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 10413241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos // Wait with timeout = 0 1042f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman waitStatus = deviceInterface.waitForFences(device, 1, &testContext.fences[0], true, 0u); 10433241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos if (waitStatus != VK_SUCCESS && waitStatus != VK_TIMEOUT) 1044378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 10453241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos // Will most likely end with VK_TIMEOUT 10463241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos log << TestLog::Message << "testSynchPrimitives failed to wait for a single fence" << TestLog::EndMessage; 10473241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos return tcu::TestStatus::fail("Failed to wait for a single fence"); 1048378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 1049378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 10503241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos // Wait with a reasonable timeout 1051f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman waitStatus = deviceInterface.waitForFences(device, 1, &testContext.fences[0], true, DEFAULT_TIMEOUT); 10523241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos if (waitStatus != VK_SUCCESS && waitStatus != VK_TIMEOUT) 10533241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos { 10543241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos // \note Wait can end with a timeout if DEFAULT_TIMEOUT is not sufficient 10553241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos log << TestLog::Message << "testSynchPrimitives failed to wait for a single fence" << TestLog::EndMessage; 10563241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos return tcu::TestStatus::fail("Failed to wait for a single fence"); 10573241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos } 1058378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 10593241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos // Wait for work on fences[0] to actually complete 1060f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman waitStatus = deviceInterface.waitForFences(device, 1, &testContext.fences[0], true, std::numeric_limits<deUint64>::max()); 10613241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos if (waitStatus != VK_SUCCESS) 1062378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 10633241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos log << TestLog::Message << "testSynchPrimitives failed to wait for a fence" << TestLog::EndMessage; 10643241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos return tcu::TestStatus::fail("failed to wait for a fence"); 1065378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 1066378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 10673241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos // Wait until timeout on a fence that has not been submitted 1068f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman waitStatus = deviceInterface.waitForFences(device, 1, &testContext.fences[1], true, 1); 10693241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos if (waitStatus != VK_TIMEOUT) 1070378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 10713241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos log << TestLog::Message << "testSyncPrimitives failed to timeout on wait for single fence" << TestLog::EndMessage; 10723241ee1a924df7b5c25b865fe05a278db90e2f26Pyry Haulos return tcu::TestStatus::fail("failed to timeout on wait for single fence"); 1073378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 1074378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1075271157f1dfdc1129586f47e8064874d107f3edaeDae Kim // Check that the fence is signaled after the wait 1076271157f1dfdc1129586f47e8064874d107f3edaeDae Kim fenceStatus = deviceInterface.getFenceStatus(device, testContext.fences[0]); 1077378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman if (fenceStatus != VK_SUCCESS) 1078378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 1079271157f1dfdc1129586f47e8064874d107f3edaeDae Kim log << TestLog::Message << "testSynchronizationPrimitives fence should be signaled but status is " << getResultName(fenceStatus) << TestLog::EndMessage; 1080378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman return tcu::TestStatus::fail("Fence in incorrect state"); 1081378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 1082378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1083378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; 1084378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.pNext = DE_NULL; 1085378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.memory = testContext.renderReadBuffer->getMemory(); 1086378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.offset = 0; 1087378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.size = testContext.renderSize; 1088271157f1dfdc1129586f47e8064874d107f3edaeDae Kim VK_CHECK(deviceInterface.invalidateMappedMemoryRanges(device, 1, &range)); 1089378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman resultImage = testContext.renderReadBuffer->getHostPtr(); 1090378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1091378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman log << TestLog::Image( "result", 1092378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman "result", 1093378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::ConstPixelBufferAccess(tcu::TextureFormat( 1094378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), 1095378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman testContext.renderDimension.x(), 1096378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman testContext.renderDimension.y(), 1097378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1, 1098378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman resultImage)); 1099378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1100271157f1dfdc1129586f47e8064874d107f3edaeDae Kim return TestStatus::pass("synchronization-fences passed"); 1101378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} 1102378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1103378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmantcu::TestStatus testSemaphores (Context& context) 1104378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 1105378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman TestLog& log = context.getTestContext().getLog(); 1106378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const InstanceInterface& instanceInterface = context.getInstanceInterface(); 1107378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const VkPhysicalDevice physicalDevice = context.getPhysicalDevice(); 1108271157f1dfdc1129586f47e8064874d107f3edaeDae Kim deUint32 queueFamilyIdx; 1109271157f1dfdc1129586f47e8064874d107f3edaeDae Kim vk::Move<VkDevice> device = createTestDevice(instanceInterface, physicalDevice, &queueFamilyIdx); 1110f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos const DeviceDriver deviceInterface (instanceInterface, *device); 1111f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos SimpleAllocator allocator (deviceInterface, 1112f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos *device, 1113f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos getPhysicalDeviceMemoryProperties(instanceInterface, physicalDevice)); 1114da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi const VkQueue queue[2] = 1115da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi { 1116da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi getDeviceQueue(deviceInterface, *device, queueFamilyIdx, 0), 1117da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi getDeviceQueue(deviceInterface, *device, queueFamilyIdx, 1) 1118da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi }; 1119378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkResult testStatus; 1120f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos TestContext testContext1 (deviceInterface, device.get(), queueFamilyIdx, context.getBinaryCollection(), allocator); 1121f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos TestContext testContext2 (deviceInterface, device.get(), queueFamilyIdx, context.getBinaryCollection(), allocator); 1122da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi Unique<VkSemaphore> semaphore (createSemaphore(deviceInterface, *device)); 1123378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkSubmitInfo submitInfo[2]; 1124378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkMappedMemoryRange range; 1125378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman void* resultImage; 1126226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski const VkPipelineStageFlags waitDstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; 1127378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1128378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const tcu::Vec4 vertices1[] = 1129378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 1130378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::Vec4( 0.5f, 0.5f, 0.0f, 1.0f), 1131378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::Vec4(-0.5f, 0.5f, 0.0f, 1.0f), 1132378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::Vec4( 0.0f, -0.5f, 0.0f, 1.0f) 1133378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman }; 1134378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1135378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const tcu::Vec4 vertices2[] = 1136378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 1137378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::Vec4(-0.5f, -0.5f, 0.0f, 1.0f), 1138378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::Vec4(+0.5f, -0.5f, 0.0f, 1.0f), 1139378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::Vec4( 0.0f, +0.5f, 0.0f, 1.0f) 1140378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman }; 1141378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1142271157f1dfdc1129586f47e8064874d107f3edaeDae Kim testContext1.vertices = vertices1; 1143271157f1dfdc1129586f47e8064874d107f3edaeDae Kim testContext1.numVertices = DE_LENGTH_OF_ARRAY(vertices1); 1144271157f1dfdc1129586f47e8064874d107f3edaeDae Kim testContext1.renderDimension = tcu::IVec2(256, 256); 1145271157f1dfdc1129586f47e8064874d107f3edaeDae Kim testContext1.renderSize = sizeof(deUint32) * testContext1.renderDimension.x() * testContext1.renderDimension.y(); 1146378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1147271157f1dfdc1129586f47e8064874d107f3edaeDae Kim testContext2.vertices = vertices2; 1148271157f1dfdc1129586f47e8064874d107f3edaeDae Kim testContext2.numVertices = DE_LENGTH_OF_ARRAY(vertices2); 1149271157f1dfdc1129586f47e8064874d107f3edaeDae Kim testContext2.renderDimension = tcu::IVec2(256, 256); 1150271157f1dfdc1129586f47e8064874d107f3edaeDae Kim testContext2.renderSize = sizeof(deUint32) * testContext2.renderDimension.x() * testContext2.renderDimension.y(); 1151378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1152f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos createCommandBuffer(deviceInterface, device.get(), queueFamilyIdx, &testContext1.cmdBuffer, &testContext1.commandPool); 1153378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman generateWork(testContext1); 1154378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1155f0657d9d775dd0744462849e59842be8b0b56c48Pyry Haulos createCommandBuffer(deviceInterface, device.get(), queueFamilyIdx, &testContext2.cmdBuffer, &testContext2.commandPool); 1156378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman generateWork(testContext2); 1157378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1158378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman initSubmitInfo(submitInfo, DE_LENGTH_OF_ARRAY(submitInfo)); 1159378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1160378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman // The difference between the two submit infos is that each will use a unique cmd buffer, 1161378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman // and one will signal a semaphore but not wait on a semaphore, the other will wait on the 1162378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman // semaphore but not signal a semaphore 1163271157f1dfdc1129586f47e8064874d107f3edaeDae Kim submitInfo[0].pCommandBuffers = &testContext1.cmdBuffer.get(); 1164271157f1dfdc1129586f47e8064874d107f3edaeDae Kim submitInfo[1].pCommandBuffers = &testContext2.cmdBuffer.get(); 1165378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1166271157f1dfdc1129586f47e8064874d107f3edaeDae Kim submitInfo[0].signalSemaphoreCount = 1; 1167271157f1dfdc1129586f47e8064874d107f3edaeDae Kim submitInfo[0].pSignalSemaphores = &semaphore.get(); 1168271157f1dfdc1129586f47e8064874d107f3edaeDae Kim submitInfo[1].waitSemaphoreCount = 1; 1169271157f1dfdc1129586f47e8064874d107f3edaeDae Kim submitInfo[1].pWaitSemaphores = &semaphore.get(); 1170226a0db84fb22264e27c52ed54d55592baf1693aMaciej Jesionowski submitInfo[1].pWaitDstStageMask = &waitDstStageMask; 1171378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1172378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VK_CHECK(deviceInterface.queueSubmit(queue[0], 1, &submitInfo[0], testContext1.fences[0])); 1173378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 11746e70e1764f44364869c497a32671faddf8152293Ilya Zaytsev testStatus = deviceInterface.waitForFences(device.get(), 1, &testContext1.fences[0], true, std::numeric_limits<deUint64>::max()); 1175378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman if (testStatus != VK_SUCCESS) 1176378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 1177378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman log << TestLog::Message << "testSynchPrimitives failed to wait for a set fence" << TestLog::EndMessage; 1178378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman return tcu::TestStatus::fail("failed to wait for a set fence"); 1179378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 1180378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1181378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; 1182378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.pNext = DE_NULL; 1183378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.memory = testContext1.renderReadBuffer->getMemory(); 1184378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.offset = 0; 1185378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.size = testContext1.renderSize; 1186378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VK_CHECK(deviceInterface.invalidateMappedMemoryRanges(device.get(), 1, &range)); 1187378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman resultImage = testContext1.renderReadBuffer->getHostPtr(); 1188378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1189378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman log << TestLog::Image( "result", 1190378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman "result", 1191378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::ConstPixelBufferAccess(tcu::TextureFormat( 1192378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), 1193378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman testContext1.renderDimension.x(), 1194378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman testContext1.renderDimension.y(), 1195378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1, 1196378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman resultImage)); 1197378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1198378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VK_CHECK(deviceInterface.queueSubmit(queue[1], 1, &submitInfo[1], testContext2.fences[0])); 1199378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 12006e70e1764f44364869c497a32671faddf8152293Ilya Zaytsev testStatus = deviceInterface.waitForFences(device.get(), 1, &testContext2.fences[0], true, std::numeric_limits<deUint64>::max()); 1201378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman if (testStatus != VK_SUCCESS) 1202378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 1203378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman log << TestLog::Message << "testSynchPrimitives failed to wait for a set fence" << TestLog::EndMessage; 1204378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman return tcu::TestStatus::fail("failed to wait for a set fence"); 1205378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 1206378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1207378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; 1208378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.pNext = DE_NULL; 1209378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.memory = testContext2.renderReadBuffer->getMemory(); 1210378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.offset = 0; 1211378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.size = testContext2.renderSize; 1212378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VK_CHECK(deviceInterface.invalidateMappedMemoryRanges(device.get(), 1, &range)); 1213378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman resultImage = testContext2.renderReadBuffer->getHostPtr(); 1214378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1215378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman log << TestLog::Image( "result", 1216378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman "result", 1217378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::ConstPixelBufferAccess(tcu::TextureFormat( 1218378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), 1219378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman testContext2.renderDimension.x(), 1220378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman testContext2.renderDimension.y(), 1221378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1, 1222378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman resultImage)); 1223378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1224378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman return tcu::TestStatus::pass("synchronization-semaphores passed"); 1225378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} 1226378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1227378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodmantcu::TestStatus testEvents (Context& context) 1228378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 1229378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman TestLog& log = context.getTestContext().getLog(); 1230f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman const DeviceInterface& deviceInterface = context.getDeviceInterface(); 1231f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman VkDevice device = context.getDevice(); 1232f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman const deUint32 queueFamilyIdx = context.getUniversalQueueFamilyIndex(); 1233f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman Allocator& allocator = context.getDefaultAllocator(); 1234f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman VkQueue queue = context.getUniversalQueue(); 1235378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkResult testStatus; 1236378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkResult eventStatus; 1237f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman TestContext testContext (deviceInterface, device, queueFamilyIdx, context.getBinaryCollection(), allocator); 1238da03200a87f51bed33b3c3030ecbb6df06ff4f60Mika Isojärvi Unique<VkEvent> event (createEvent(deviceInterface, device)); 1239f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman VkSubmitInfo submitInfo; 1240378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman VkMappedMemoryRange range; 1241378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman void* resultImage; 1242378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1243378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman const tcu::Vec4 vertices1[] = 1244378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 1245378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::Vec4( 0.5f, 0.5f, 0.0f, 1.0f), 1246378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::Vec4(-0.5f, 0.5f, 0.0f, 1.0f), 1247378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::Vec4( 0.0f, -0.5f, 0.0f, 1.0f) 1248378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman }; 1249378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1250f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman testContext.vertices = vertices1; 1251f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman testContext.numVertices = DE_LENGTH_OF_ARRAY(vertices1); 1252f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman testContext.renderDimension = tcu::IVec2(256, 256); 1253f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman testContext.waitEvent = true; 1254f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman testContext.event = event.get(); 1255f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman testContext.renderSize = sizeof(deUint32) * testContext.renderDimension.x() * testContext.renderDimension.y(); 1256378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1257f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman createCommandBuffer(deviceInterface, device, queueFamilyIdx, &testContext.cmdBuffer, &testContext.commandPool); 1258f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman generateWork(testContext); 1259378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1260f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman initSubmitInfo(&submitInfo, 1); 1261f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman submitInfo.pCommandBuffers = &testContext.cmdBuffer.get(); 1262378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1263f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman // 6.3 An event is initially in the unsignaled state 1264f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman eventStatus = deviceInterface.getEventStatus(device, event.get()); 1265378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman if (eventStatus != VK_EVENT_RESET) 1266378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 1267271157f1dfdc1129586f47e8064874d107f3edaeDae Kim log << TestLog::Message << "testSynchronizationPrimitives event should be reset but status is " << getResultName(eventStatus) << TestLog::EndMessage; 1268378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman return tcu::TestStatus::fail("Event in incorrect status"); 1269378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 1270378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1271f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman // The recorded command buffer should wait at the top of the graphics pipe for an event signaled by the host and so should not 1272f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman // make forward progress as long as the event is not signaled 1273f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman VK_CHECK(deviceInterface.queueSubmit(queue, 1, &submitInfo, testContext.fences[0])); 1274378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 12750e54da35ac023351bb8b3bd4f55d0c98d812ef8dPeter Quayle testStatus = deviceInterface.waitForFences(device, 1, &testContext.fences[0], true, 10000000); 1276f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman if (testStatus != VK_TIMEOUT) 1277378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 1278f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman log << TestLog::Message << "testSynchronizationPrimitives failed to wait for set event from host." << TestLog::EndMessage; 1279f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman return tcu::TestStatus::fail("failed to wait for event set from host"); 1280378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 1281378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1282f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman // Should allow the recorded command buffer to finally make progress 1283f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman VK_CHECK(deviceInterface.setEvent(device, event.get())); 1284f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman eventStatus = deviceInterface.getEventStatus(device, event.get()); 1285f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman if (eventStatus != VK_EVENT_SET) 1286f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman { 1287f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman log << TestLog::Message << "testEvents failed to transition event to signaled state via setEvent call from host" << TestLog::EndMessage; 1288f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman return tcu::TestStatus::fail("failed to signal event from host"); 1289f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman } 1290378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1291f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman testStatus = deviceInterface.waitForFences(device, 1, &testContext.fences[0], true, ~(0ull)); 1292378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman if (testStatus != VK_SUCCESS) 1293378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman { 1294f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman log << TestLog::Message << "testSynchronizationPrimitives failed to proceed after set event from host." << TestLog::EndMessage; 1295f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman return tcu::TestStatus::fail("failed to proceed after event set from host"); 1296378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman } 1297378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1298378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; 1299378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.pNext = DE_NULL; 1300f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman range.memory = testContext.renderReadBuffer->getMemory(); 1301378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman range.offset = 0; 1302f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman range.size = testContext.renderSize; 1303f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman VK_CHECK(deviceInterface.invalidateMappedMemoryRanges(device, 1, &range)); 1304f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman resultImage = testContext.renderReadBuffer->getHostPtr(); 1305378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1306378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman log << TestLog::Image( "result", 1307378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman "result", 1308378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::ConstPixelBufferAccess(tcu::TextureFormat( 1309378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), 1310f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman testContext.renderDimension.x(), 1311f093f4b9e448947e887868ffc0d23b45c31ee9b0David Sodman testContext.renderDimension.y(), 1312378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1, 1313378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman resultImage)); 1314378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1315378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman return tcu::TestStatus::pass("synchronization-events passed"); 1316378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} 1317378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1318378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} // anonymous 1319378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 13207aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowskitcu::TestCaseGroup* createSmokeTests (tcu::TestContext& textCtx) 1321378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman{ 13227aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski de::MovePtr<tcu::TestCaseGroup> synchTests (new tcu::TestCaseGroup(textCtx, "smoke", "Synchronization smoke tests")); 1323378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1324378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman addFunctionCaseWithPrograms(synchTests.get(), "fences", "", buildShaders, testFences); 1325378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman addFunctionCaseWithPrograms(synchTests.get(), "semaphores", "", buildShaders, testSemaphores); 1326378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman addFunctionCaseWithPrograms(synchTests.get(), "events", "", buildShaders, testEvents); 1327378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 1328378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman return synchTests.release(); 1329378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman} 1330378ef852bb3b711863ac31f9ded5874e0e98ab5bDavid Sodman 13317aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski} // synchronization 13327aa88a4dca6854ae703a357361a55c7be60823abMaciej Jesionowski} // vkt 1333