vktRenderPassTests.cpp revision 18cca0001c3ce503dcc339c839ed85be639e11e5
1c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi/*------------------------------------------------------------------------- 2c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * Vulkan Conformance Tests 3c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * ------------------------ 4c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * 5c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * Copyright (c) 2015 Google Inc. 6c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * 7c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * Permission is hereby granted, free of charge, to any person obtaining a 8c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * copy of this software and/or associated documentation files (the 9c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * "Materials"), to deal in the Materials without restriction, including 10c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * without limitation the rights to use, copy, modify, merge, publish, 11c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * distribute, sublicense, and/or sell copies of the Materials, and to 12c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * permit persons to whom the Materials are furnished to do so, subject to 13c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * the following conditions: 14c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * 15c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * The above copyright notice(s) and this permission notice shall be 16c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * included in all copies or substantial portions of the Materials. 17c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * 18c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * The Materials are Confidential Information as defined by the 19c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * Khronos Membership Agreement until designated non-confidential by 20c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * Khronos, at which point this condition clause shall be removed. 21c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * 22c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 23c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 24c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 25c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 26c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 27c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 28c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. 29c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * 30c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *//*! 31c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * \file 32c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * \brief RenderPass tests 33c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *//*--------------------------------------------------------------------*/ 34c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 35c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vktRenderPassTests.hpp" 36c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 37c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vktTestCaseUtil.hpp" 38c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 39c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkDefs.hpp" 40c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkDeviceUtil.hpp" 41c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkImageUtil.hpp" 42c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkMemUtil.hpp" 43c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkPlatform.hpp" 44c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkPrograms.hpp" 45c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkQueryUtil.hpp" 46c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkRef.hpp" 47c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkRefUtil.hpp" 48c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkStrUtil.hpp" 49c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkTypeUtil.hpp" 50c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 51c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuTestLog.hpp" 52c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuResultCollector.hpp" 53c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuFormatUtil.hpp" 54c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuTextureUtil.hpp" 55c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuFloat.hpp" 56c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuMaybe.hpp" 57c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuVectorUtil.hpp" 58c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 59c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deUniquePtr.hpp" 60c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deSharedPtr.hpp" 61c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deStringUtil.hpp" 62c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deSTLUtil.hpp" 63c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deRandom.hpp" 64c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 65c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include <limits> 66c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 67c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing namespace vk; 68c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 69c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::Maybe; 70c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::nothing; 71c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::just; 72c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::TestLog; 73c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::Vec2; 74c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::IVec2; 75c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::UVec2; 76c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::IVec4; 77c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::UVec4; 78c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::Vec4; 79c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::BVec4; 80c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::ConstPixelBufferAccess; 81c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::PixelBufferAccess; 82c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 83c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing de::UniquePtr; 84c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 85c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing std::vector; 86c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing std::string; 87c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 88c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvinamespace vkt 89c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 90c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvinamespace 91c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 92c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvienum 93c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 94c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi STENCIL_VALUE = 84u, 95c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Limit integer values that are representable as floats 96c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi MAX_INTEGER_VALUE = ((1u<<22u)-1u) 97c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 98c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 99c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi// Utility functions using flattened structs 100c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkFence> createFence (const DeviceInterface& vk, VkDevice device, VkFenceCreateFlags flags) 101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 102c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkFenceCreateInfo pCreateInfo = 103c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, 105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi flags 108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 109955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createFence(vk, device, &pCreateInfo); 110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 11268e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkFramebuffer> createFramebuffer (const DeviceInterface& vk, 11368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDevice device, 11468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkFramebufferCreateFlags pCreateInfo_flags, 11568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkRenderPass pCreateInfo_renderPass, 11668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_attachmentCount, 11768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkImageView* pCreateInfo_pAttachments, 11868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_width, 11968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_height, 12068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_layers) 121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkFramebufferCreateInfo pCreateInfo = 123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, 125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 12668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_flags, 127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_renderPass, 128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_attachmentCount, 129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_pAttachments, 130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_width, 131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_height, 132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_layers, 133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 134955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createFramebuffer(vk, device, &pCreateInfo); 135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 13768e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkImage> createImage (const DeviceInterface& vk, 13868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDevice device, 13968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageCreateFlags pCreateInfo_flags, 14068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageType pCreateInfo_imageType, 14168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkFormat pCreateInfo_format, 14268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkExtent3D pCreateInfo_extent, 14368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_mipLevels, 14468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_arrayLayers, 14568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSampleCountFlagBits pCreateInfo_samples, 14668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageTiling pCreateInfo_tiling, 14768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageUsageFlags pCreateInfo_usage, 14868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSharingMode pCreateInfo_sharingMode, 14968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_queueFamilyCount, 15068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const deUint32* pCreateInfo_pQueueFamilyIndices, 15168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout pCreateInfo_initialLayout) 152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageCreateInfo pCreateInfo = 154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, 156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 15768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_flags, 158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_imageType, 159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_format, 160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_extent, 161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_mipLevels, 16268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_arrayLayers, 163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_samples, 164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_tiling, 165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_usage, 166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_sharingMode, 167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_queueFamilyCount, 168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_pQueueFamilyIndices, 169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_initialLayout 170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 171955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createImage(vk, device, &pCreateInfo); 172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid bindBufferMemory (const DeviceInterface& vk, VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memOffset) 175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.bindBufferMemory(device, buffer, mem, memOffset)); 177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid bindImageMemory (const DeviceInterface& vk, VkDevice device, VkImage image, VkDeviceMemory mem, VkDeviceSize memOffset) 180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.bindImageMemory(device, image, mem, memOffset)); 182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 184c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImageView> createImageView (const DeviceInterface& vk, 185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 18668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageViewCreateFlags pCreateInfo_flags, 187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImage pCreateInfo_image, 188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageViewType pCreateInfo_viewType, 189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkFormat pCreateInfo_format, 19068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkComponentMapping pCreateInfo_components, 19168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageSubresourceRange pCreateInfo_subresourceRange) 192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageViewCreateInfo pCreateInfo = 194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, 196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 19768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_flags, 198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_image, 199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_viewType, 200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_format, 20168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_components, 202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_subresourceRange, 203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 204955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createImageView(vk, device, &pCreateInfo); 205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 20768e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkBuffer> createBuffer (const DeviceInterface& vk, 20868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDevice device, 20968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkBufferCreateFlags pCreateInfo_flags, 21068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDeviceSize pCreateInfo_size, 21168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkBufferUsageFlags pCreateInfo_usage, 21268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSharingMode pCreateInfo_sharingMode, 21368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_queueFamilyCount, 21468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const deUint32* pCreateInfo_pQueueFamilyIndices) 215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBufferCreateInfo pCreateInfo = 217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, 219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 22068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_flags, 221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_size, 222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_usage, 223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_sharingMode, 224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_queueFamilyCount, 225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_pQueueFamilyIndices, 226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 227955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createBuffer(vk, device, &pCreateInfo); 228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 23068e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkCommandPool> createCommandPool (const DeviceInterface& vk, 23168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDevice device, 23268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandPoolCreateFlags pCreateInfo_flags, 23368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_queueFamilyIndex) 234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 23568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandPoolCreateInfo pCreateInfo = 236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 23768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, 238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_flags, 240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_queueFamilyIndex, 241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 242955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createCommandPool(vk, device, &pCreateInfo); 243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 24568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid cmdBeginRenderPass (const DeviceInterface& vk, 24668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer cmdBuffer, 24768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkRenderPass pRenderPassBegin_renderPass, 24868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkFramebuffer pRenderPassBegin_framebuffer, 24968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkRect2D pRenderPassBegin_renderArea, 25068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pRenderPassBegin_clearValueCount, 25168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkClearValue* pRenderPassBegin_pAttachmentClearValues, 25268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSubpassContents contents) 253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkRenderPassBeginInfo pRenderPassBegin = 255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, 257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pRenderPassBegin_renderPass, 259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pRenderPassBegin_framebuffer, 260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pRenderPassBegin_renderArea, 26168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pRenderPassBegin_clearValueCount, 262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pRenderPassBegin_pAttachmentClearValues, 263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdBeginRenderPass(cmdBuffer, &pRenderPassBegin, contents); 265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 26768e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkCommandBuffer> allocateCommandBuffer (const DeviceInterface& vk, 26868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDevice device, 26968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandPool pCreateInfo_commandPool, 27068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBufferLevel pCreateInfo_level) 271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 272955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos const VkCommandBufferAllocateInfo pAllocateInfo = 273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 27468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, 275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 27668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_commandPool, 277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_level, 27868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // bufferCount 279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 280955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return allocateCommandBuffer(vk, device, &pAllocateInfo); 281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 28368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid beginCommandBuffer (const DeviceInterface& vk, 28468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer cmdBuffer, 28568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBufferUsageFlags pBeginInfo_flags, 28668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkRenderPass pBeginInfo_renderPass, 28768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pBeginInfo_subpass, 28868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkFramebuffer pBeginInfo_framebuffer, 28968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkBool32 pBeginInfo_occlusionQueryEnable, 29068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkQueryControlFlags pBeginInfo_queryFlags, 29168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkQueryPipelineStatisticFlags pBeginInfo_pipelineStatistics) 292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 29368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandBufferBeginInfo pBeginInfo = 294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 29568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pBeginInfo_flags, 298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pBeginInfo_renderPass, 299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pBeginInfo_subpass, 300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pBeginInfo_framebuffer, 30168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pBeginInfo_occlusionQueryEnable, 30268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pBeginInfo_queryFlags, 30368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pBeginInfo_pipelineStatistics, 304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.beginCommandBuffer(cmdBuffer, &pBeginInfo)); 306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 30868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid endCommandBuffer (const DeviceInterface& vk, VkCommandBuffer cmdBuffer) 309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.endCommandBuffer(cmdBuffer)); 311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 31368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid queueSubmit (const DeviceInterface& vk, VkQueue queue, deUint32 cmdBufferCount, const VkCommandBuffer* pCmdBuffers, VkFence fence) 314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 31568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSubmitInfo submitInfo = 31668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 31768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_SUBMIT_INFO, 31868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, 31968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // waitSemaphoreCount 32068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (const VkSemaphore*)DE_NULL, // pWaitSemaphores 32168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos cmdBufferCount, // commandBufferCount 32268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCmdBuffers, 32368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // signalSemaphoreCount 32468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (const VkSemaphore*)DE_NULL, // pSignalSemaphores 32568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }; 32668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence)); 327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid waitForFences (const DeviceInterface& vk, VkDevice device, deUint32 fenceCount, const VkFence* pFences, VkBool32 waitAll, deUint64 timeout) 330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.waitForFences(device, fenceCount, pFences, waitAll, timeout)); 332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 334c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkImageAspectFlags getImageAspectFlags (VkFormat vkFormat) 335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(vkFormat); 337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST == 21); 339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (format.order) 341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::DS: 343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; 344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::D: 346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return VK_IMAGE_ASPECT_DEPTH_BIT; 347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::S: 349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return VK_IMAGE_ASPECT_STENCIL_BIT; 350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return VK_IMAGE_ASPECT_COLOR_BIT; 353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 35668e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkAccessFlags getAllMemoryReadFlags (void) 357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 35868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_ACCESS_TRANSFER_READ_BIT 35968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_UNIFORM_READ_BIT 36068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_HOST_READ_BIT 36168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_INDEX_READ_BIT 36268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_SHADER_READ_BIT 36368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT 36468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_INDIRECT_COMMAND_READ_BIT 36568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT 36668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT 36768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; 368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 37068e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkAccessFlags getAllMemoryWriteFlags (void) 371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 37268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_ACCESS_TRANSFER_WRITE_BIT 37368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_HOST_WRITE_BIT 37468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_SHADER_WRITE_BIT 37568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT 37668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; 377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 379c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkPipelineStageFlags getAllPipelineStageFlags (void) 380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 38168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT 382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_TRANSFER_BIT 383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT 384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT 385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT 386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_VERTEX_INPUT_BIT 387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT 388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 38968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT 390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT 392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; 394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass AttachmentReference 397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference (deUint32 attachment, 400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout layout) 401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_attachment (attachment) 402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_layout (layout) 403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getAttachment (void) const { return m_attachment; } 407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout getImageLayout (void) const { return m_layout; } 408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 m_attachment; 411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout m_layout; 412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass Subpass 415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Subpass (VkPipelineBindPoint pipelineBindPoint, 418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkSubpassDescriptionFlags flags, 419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& inputAttachments, 420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& colorAttachments, 421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& resolveAttachments, 422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference depthStencilAttachment, 423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& preserveAttachments) 424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_pipelineBindPoint (pipelineBindPoint) 425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_flags (flags) 426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_inputAttachments (inputAttachments) 427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_colorAttachments (colorAttachments) 428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_resolveAttachments (resolveAttachments) 429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_depthStencilAttachment (depthStencilAttachment) 430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_preserveAttachments (preserveAttachments) 431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineBindPoint getPipelineBindPoint (void) const { return m_pipelineBindPoint; } 435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkSubpassDescriptionFlags getFlags (void) const { return m_flags; } 436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& getInputAttachments (void) const { return m_inputAttachments; } 437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& getColorAttachments (void) const { return m_colorAttachments; } 438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& getResolveAttachments (void) const { return m_resolveAttachments; } 439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& getDepthStencilAttachment (void) const { return m_depthStencilAttachment; } 440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& getPreserveAttachments (void) const { return m_preserveAttachments; } 441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineBindPoint m_pipelineBindPoint; 444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkSubpassDescriptionFlags m_flags; 445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> m_inputAttachments; 447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> m_colorAttachments; 448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> m_resolveAttachments; 449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference m_depthStencilAttachment; 450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> m_preserveAttachments; 452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassDependency 455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi SubpassDependency (deUint32 srcPass, 458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 dstPass, 459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags srcStageMask, 461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags dstStageMask, 462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 46368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags outputMask, 46468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags inputMask, 465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 46668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDependencyFlags flags) 467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_srcPass (srcPass) 468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_dstPass (dstPass) 469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_srcStageMask (srcStageMask) 471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_dstStageMask (dstStageMask) 472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_outputMask (outputMask) 474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_inputMask (inputMask) 47568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos , m_flags (flags) 476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getSrcPass (void) const { return m_srcPass; } 480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getDstPass (void) const { return m_dstPass; } 481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags getSrcStageMask (void) const { return m_srcStageMask; } 483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags getDstStageMask (void) const { return m_dstStageMask; } 484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 48568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags getOutputMask (void) const { return m_outputMask; } 48668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags getInputMask (void) const { return m_inputMask; } 487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 48868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDependencyFlags getFlags (void) const { return m_flags; } 489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 m_srcPass; 492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 m_dstPass; 493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 494c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags m_srcStageMask; 495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags m_dstStageMask; 496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 49768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags m_outputMask; 49868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags m_inputMask; 49968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDependencyFlags m_flags; 500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass Attachment 503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment (VkFormat format, 50668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSampleCountFlagBits samples, 507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkAttachmentLoadOp loadOp, 509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkAttachmentStoreOp storeOp, 510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkAttachmentLoadOp stencilLoadOp, 512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkAttachmentStoreOp stencilStoreOp, 513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout initialLayout, 515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout finalLayout) 516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_format (format) 517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_samples (samples) 518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_loadOp (loadOp) 520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_storeOp (storeOp) 521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_stencilLoadOp (stencilLoadOp) 523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_stencilStoreOp (stencilStoreOp) 524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_initialLayout (initialLayout) 526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_finalLayout (finalLayout) 527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 529c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 53068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkFormat getFormat (void) const { return m_format; } 53168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSampleCountFlagBits getSamples (void) const { return m_samples; } 532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 53368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentLoadOp getLoadOp (void) const { return m_loadOp; } 53468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentStoreOp getStoreOp (void) const { return m_storeOp; } 535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 53768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentLoadOp getStencilLoadOp (void) const { return m_stencilLoadOp; } 53868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentStoreOp getStencilStoreOp (void) const { return m_stencilStoreOp; } 539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 54068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout getInitialLayout (void) const { return m_initialLayout; } 54168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout getFinalLayout (void) const { return m_finalLayout; } 542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 54468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkFormat m_format; 54568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSampleCountFlagBits m_samples; 546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 54768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentLoadOp m_loadOp; 54868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentStoreOp m_storeOp; 549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 55068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentLoadOp m_stencilLoadOp; 55168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentStoreOp m_stencilStoreOp; 552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 55368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout m_initialLayout; 55468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout m_finalLayout; 555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass RenderPass 558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RenderPass (const vector<Attachment>& attachments, 561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses, 562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassDependency>& dependencies) 563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_attachments (attachments) 564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_subpasses (subpasses) 565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_dependencies (dependencies) 566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment>& getAttachments (void) const { return m_attachments; } 570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& getSubpasses (void) const { return m_subpasses; } 571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassDependency>& getDependencies (void) const { return m_dependencies; } 572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment> m_attachments; 575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass> m_subpasses; 576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassDependency> m_dependencies; 577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistruct TestConfig 580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi enum RenderTypes 582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RENDERTYPES_NONE = 0, 584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RENDERTYPES_CLEAR = (1<<1), 585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RENDERTYPES_DRAW = (1<<2) 586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi enum CommandBufferTypes 589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi COMMANDBUFFERTYPES_INLINE = (1<<0), 591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi COMMANDBUFFERTYPES_SECONDARY = (1<<1) 592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi enum ImageMemory 595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi IMAGEMEMORY_STRICT = (1<<0), 597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi IMAGEMEMORY_LAZY = (1<<1) 598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig (const RenderPass& renderPass_, 601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RenderTypes renderTypes_, 602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi CommandBufferTypes commandBufferTypes_, 603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ImageMemory imageMemory_, 604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& targetSize_, 605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderPos_, 606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderSize_, 607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 seed_) 608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : renderPass (renderPass_) 609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , renderTypes (renderTypes_) 610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , commandBufferTypes (commandBufferTypes_) 611c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , imageMemory (imageMemory_) 612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , targetSize (targetSize_) 613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , renderPos (renderPos_) 614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , renderSize (renderSize_) 615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , seed (seed_) 616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RenderPass renderPass; 620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RenderTypes renderTypes; 621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi CommandBufferTypes commandBufferTypes; 622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ImageMemory imageMemory; 623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 targetSize; 624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 renderPos; 625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 renderSize; 626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 seed; 627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 629c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::RenderTypes operator| (TestConfig::RenderTypes a, TestConfig::RenderTypes b) 630c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return (TestConfig::RenderTypes)(((deUint32)a) | ((deUint32)b)); 632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 634c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::CommandBufferTypes operator| (TestConfig::CommandBufferTypes a, TestConfig::CommandBufferTypes b) 635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return (TestConfig::CommandBufferTypes)(((deUint32)a) | ((deUint32)b)); 637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 639c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::ImageMemory operator| (TestConfig::ImageMemory a, TestConfig::ImageMemory b) 640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return (TestConfig::ImageMemory)(((deUint32)a) | ((deUint32)b)); 642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid logRenderPassInfo (TestLog& log, 645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPass) 646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection section (log, "RenderPass", "RenderPass"); 648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection attachmentsSection (log, "Attachments", "Attachments"); 651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment>& attachments = renderPass.getAttachments(); 652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++) 654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection attachmentSection (log, "Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx)); 656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = attachments[attachmentNdx]; 657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Format: " << attachment.getFormat() << TestLog::EndMessage; 659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Samples: " << attachment.getSamples() << TestLog::EndMessage; 660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "LoadOp: " << attachment.getLoadOp() << TestLog::EndMessage; 662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "StoreOp: " << attachment.getStoreOp() << TestLog::EndMessage; 663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "StencilLoadOp: " << attachment.getStencilLoadOp() << TestLog::EndMessage; 665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "StencilStoreOp: " << attachment.getStencilStoreOp() << TestLog::EndMessage; 666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "InitialLayout: " << attachment.getInitialLayout() << TestLog::EndMessage; 668c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "FinalLayout: " << attachment.getFinalLayout() << TestLog::EndMessage; 669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection subpassesSection (log, "Subpasses", "Subpasses"); 674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses = renderPass.getSubpasses(); 675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++) 677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection subpassSection (log, "Subpass" + de::toString(subpassNdx), "Subpass " + de::toString(subpassNdx)); 679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = subpasses[subpassNdx]; 680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& inputAttachments = subpass.getInputAttachments(); 682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& colorAttachments = subpass.getColorAttachments(); 683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& resolveAttachments = subpass.getResolveAttachments(); 684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& preserveAttachments = subpass.getPreserveAttachments(); 685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!inputAttachments.empty()) 687c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection inputAttachmentsSection (log, "Inputs", "Inputs"); 689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t inputNdx = 0; inputNdx < inputAttachments.size(); inputNdx++) 691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection inputAttachmentSection (log, "Input" + de::toString(inputNdx), "Input " + de::toString(inputNdx)); 693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& inputAttachment = inputAttachments[inputNdx]; 694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Attachment: " << inputAttachment.getAttachment() << TestLog::EndMessage; 696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Layout: " << inputAttachment.getImageLayout() << TestLog::EndMessage; 697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection depthStencilAttachmentSection (log, "DepthStencil", "DepthStencil"); 703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& depthStencilAttachment = subpass.getDepthStencilAttachment(); 704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Attachment: " << depthStencilAttachment.getAttachment() << TestLog::EndMessage; 706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Layout: " << depthStencilAttachment.getImageLayout() << TestLog::EndMessage; 707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!colorAttachments.empty()) 710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection colorAttachmentsSection (log, "Colors", "Colors"); 712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t colorNdx = 0; colorNdx < colorAttachments.size(); colorNdx++) 714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection colorAttachmentSection (log, "Color" + de::toString(colorNdx), "Color " + de::toString(colorNdx)); 716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& colorAttachment = colorAttachments[colorNdx]; 717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Attachment: " << colorAttachment.getAttachment() << TestLog::EndMessage; 719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Layout: " << colorAttachment.getImageLayout() << TestLog::EndMessage; 720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!resolveAttachments.empty()) 724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection resolveAttachmentsSection (log, "Resolves", "Resolves"); 726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t resolveNdx = 0; resolveNdx < resolveAttachments.size(); resolveNdx++) 728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection resolveAttachmentSection (log, "Resolve" + de::toString(resolveNdx), "Resolve " + de::toString(resolveNdx)); 730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& resolveAttachment = resolveAttachments[resolveNdx]; 731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Attachment: " << resolveAttachment.getAttachment() << TestLog::EndMessage; 733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Layout: " << resolveAttachment.getImageLayout() << TestLog::EndMessage; 734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!preserveAttachments.empty()) 738c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection preserveAttachmentsSection (log, "Preserves", "Preserves"); 740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t preserveNdx = 0; preserveNdx < preserveAttachments.size(); preserveNdx++) 742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection preserveAttachmentSection (log, "Preserve" + de::toString(preserveNdx), "Preserve " + de::toString(preserveNdx)); 744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& preserveAttachment = preserveAttachments[preserveNdx]; 745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Attachment: " << preserveAttachment.getAttachment() << TestLog::EndMessage; 747c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Layout: " << preserveAttachment.getImageLayout() << TestLog::EndMessage; 748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 750c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!renderPass.getDependencies().empty()) 755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection dependenciesSection (log, "Dependencies", "Dependencies"); 757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 758c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t depNdx = 0; depNdx < renderPass.getDependencies().size(); depNdx++) 759c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection dependencySection (log, "Dependency" + de::toString(depNdx), "Dependency " + de::toString(depNdx)); 761c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassDependency& dep = renderPass.getDependencies()[depNdx]; 762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Source: " << dep.getSrcPass() << TestLog::EndMessage; 764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Destination: " << dep.getDstPass() << TestLog::EndMessage; 765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Source Stage Mask: " << dep.getSrcStageMask() << TestLog::EndMessage; 767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Destination Stage Mask: " << dep.getDstStageMask() << TestLog::EndMessage; 768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 769c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Input Mask: " << dep.getInputMask() << TestLog::EndMessage; 770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Output Mask: " << dep.getOutputMask() << TestLog::EndMessage; 77168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos log << TestLog::Message << "Dependency Flags: " << getDependencyFlagsStr(dep.getFlags()) << TestLog::EndMessage; 772c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 776c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string clearColorToString (VkFormat vkFormat, VkClearColorValue value) 777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(vkFormat); 779c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::BVec4 channelMask = tcu::getTextureFormatChannelMask(format); 781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 782c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi std::ostringstream stream; 783c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 784c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "("; 785c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (channelClass) 787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 788c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 789c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int i = 0; i < 4; i++) 790c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 791c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (i > 0) 792c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ", "; 793c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 794c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (channelMask[i]) 795c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << value.int32[i]; 796c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 797c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "Undef"; 798c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 799c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 800c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 801c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int i = 0; i < 4; i++) 803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (i > 0) 805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ", "; 806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (channelMask[i]) 808c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << value.uint32[i]; 809c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "Undef"; 811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 813c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int i = 0; i < 4; i++) 818c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 819c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (i > 0) 820c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ", "; 821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 822c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (channelMask[i]) 823c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << value.float32[i]; 824c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "Undef"; 826c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown channel class"); 831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 832c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 833c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ")"; 834c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return stream.str(); 836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string clearValueToString (VkFormat vkFormat, VkClearValue value) 839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(vkFormat); 841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order) || tcu::hasDepthComponent(format.order)) 843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi std::ostringstream stream; 845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "("; 847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order)) 849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "stencil: " << value.depthStencil.stencil; 850c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order) && tcu::hasDepthComponent(format.order)) 852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ", "; 853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order)) 855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "depth: " << value.depthStencil.depth; 856c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 857c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ")"; 858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 859c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return stream.str(); 860c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 861c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 862c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return clearColorToString(vkFormat, value.color); 863c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 865c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkClearColorValue randomColorClearValue (const Attachment& attachment, de::Random& rng) 866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clearNan = tcu::Float32::nan().asFloat(); 868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::BVec4 channelMask = tcu::getTextureFormatChannelMask(format); 871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkClearColorValue clearColor; 872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (channelClass) 874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 876c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::IVec4 valueMin = tcu::getFormatMinIntValue(format); 878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::IVec4 valueMax = tcu::getFormatMaxIntValue(format); 879c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 880c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int ndx = 0; ndx < 4; ndx++) 881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!channelMask[ndx]) 883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearColor.int32[ndx] = std::numeric_limits<deInt32>::min(); 884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearColor.uint32[ndx] = rng.getInt(valueMin[ndx], valueMax[ndx]); 886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec4 valueMax = tcu::getFormatMaxUintValue(format); 893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int ndx = 0; ndx < 4; ndx++) 895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!channelMask[ndx]) 897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearColor.uint32[ndx] = std::numeric_limits<deUint32>::max(); 898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearColor.uint32[ndx] = rng.getUint32() % valueMax[ndx]; 900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo formatInfo = tcu::getTextureFormatInfo(format); 909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int ndx = 0; ndx < 4; ndx++) 911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!channelMask[ndx]) 913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearColor.float32[ndx] = clearNan; 914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearColor.float32[ndx] = formatInfo.valueMin[ndx] + rng.getFloat() * (formatInfo.valueMax[ndx] - formatInfo.valueMin[ndx]); 916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 921c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown channel class"); 922c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 923c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 924c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return clearColor; 925c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 926c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 927c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkAttachmentDescription createAttachmentDescription (const Attachment& attachment) 928c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 929c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentDescription attachmentDescription = 930c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 93168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0, // flags 932c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 93368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachment.getFormat(), // format 93468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachment.getSamples(), // samples 935c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 93668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachment.getLoadOp(), // loadOp 93768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachment.getStoreOp(), // storeOp 938c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 93968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachment.getStencilLoadOp(), // stencilLoadOp 94068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachment.getStencilStoreOp(), // stencilStoreOp 941c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 94268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachment.getInitialLayout(), // initialLayout 94368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachment.getFinalLayout(), // finalLayout 944c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 945c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 946c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return attachmentDescription; 947c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 948c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 949c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkAttachmentReference createAttachmentReference (const AttachmentReference& referenceInfo) 950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentReference reference = 952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi referenceInfo.getAttachment(), // attachment; 954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi referenceInfo.getImageLayout() // layout; 955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 956c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 957c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return reference; 958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 959c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 960c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkSubpassDescription createSubpassDescription (const Subpass& subpass, 961c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkAttachmentReference>* attachmentReferenceLists) 962c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 96368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vector<VkAttachmentReference>& inputAttachmentReferences = attachmentReferenceLists[0]; 96468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vector<VkAttachmentReference>& colorAttachmentReferences = attachmentReferenceLists[1]; 96568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vector<VkAttachmentReference>& resolveAttachmentReferences = attachmentReferenceLists[2]; 96668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vector<VkAttachmentReference>& depthStencilAttachmentReferences = attachmentReferenceLists[3]; 96768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vector<VkAttachmentReference>& preserveAttachmentReferences = attachmentReferenceLists[4]; 968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++) 970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.push_back(createAttachmentReference(subpass.getColorAttachments()[attachmentNdx])); 971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getInputAttachments().size(); attachmentNdx++) 973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi inputAttachmentReferences.push_back(createAttachmentReference(subpass.getInputAttachments()[attachmentNdx])); 974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getResolveAttachments().size(); attachmentNdx++) 976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi resolveAttachmentReferences.push_back(createAttachmentReference(subpass.getResolveAttachments()[attachmentNdx])); 977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 97868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos depthStencilAttachmentReferences.push_back(createAttachmentReference(subpass.getDepthStencilAttachment())); 97968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getPreserveAttachments().size(); attachmentNdx++) 981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi preserveAttachmentReferences.push_back(createAttachmentReference(subpass.getPreserveAttachments()[attachmentNdx])); 982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(resolveAttachmentReferences.empty() || colorAttachmentReferences.size() == resolveAttachmentReferences.size()); 984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 98668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSubpassDescription subpassDescription = 987c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 988c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpass.getFlags(), // flags; 98968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos subpass.getPipelineBindPoint(), // pipelineBindPoint; 990c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 991c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (deUint32)inputAttachmentReferences.size(), // inputCount; 992c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi inputAttachmentReferences.empty() ? DE_NULL : &inputAttachmentReferences[0], // inputAttachments; 993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 994c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (deUint32)colorAttachmentReferences.size(), // colorCount; 995c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.empty() ? DE_NULL : &colorAttachmentReferences[0], // colorAttachments; 996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi resolveAttachmentReferences.empty() ? DE_NULL : &resolveAttachmentReferences[0], // resolveAttachments; 997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 99868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &depthStencilAttachmentReferences[0], // pDepthStencilAttachment; 999c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (deUint32)preserveAttachmentReferences.size(), // preserveCount; 1000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi preserveAttachmentReferences.empty() ? DE_NULL : &preserveAttachmentReferences[0] // preserveAttachments; 1001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 100368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return subpassDescription; 1004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1007c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkSubpassDependency createSubpassDependency (const SubpassDependency& dependencyInfo) 1008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkSubpassDependency dependency = 1010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dependencyInfo.getSrcPass(), // srcSubpass; 1012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dependencyInfo.getDstPass(), // destSubpass; 1013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dependencyInfo.getSrcStageMask(), // srcStageMask; 1015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dependencyInfo.getDstStageMask(), // destStageMask; 1016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dependencyInfo.getOutputMask(), // outputMask; 1018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dependencyInfo.getInputMask(), // inputMask; 1019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 102068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos dependencyInfo.getFlags() // dependencyFlags; 1021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1022c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return dependency; 1024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1026c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkRenderPass> createRenderPass (const DeviceInterface& vk, 1027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPassInfo) 1029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 103068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const size_t perSubpassAttachmentReferenceLists = 5; 1031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkAttachmentDescription> attachments; 1032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkSubpassDescription> subpasses; 1033c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkSubpassDependency> dependencies; 1034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<vector<VkAttachmentReference> > attachmentReferenceLists(renderPassInfo.getSubpasses().size() * perSubpassAttachmentReferenceLists); 1035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 1037c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachments.push_back(createAttachmentDescription(renderPassInfo.getAttachments()[attachmentNdx])); 1038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1039c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++) 1040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpasses.push_back(createSubpassDescription(renderPassInfo.getSubpasses()[subpassNdx], &(attachmentReferenceLists[subpassNdx * perSubpassAttachmentReferenceLists]))); 1041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t depNdx = 0; depNdx < renderPassInfo.getDependencies().size(); depNdx++) 1043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dependencies.push_back(createSubpassDependency(renderPassInfo.getDependencies()[depNdx])); 1044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 104668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkRenderPassCreateInfo createInfo = 104768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 104868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, 104968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, 105068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkRenderPassCreateFlags)0u, 105168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (deUint32)attachments.size(), 105268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (attachments.empty() ? DE_NULL : &attachments[0]), 105368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (deUint32)subpasses.size(), 105468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (subpasses.empty() ? DE_NULL : &subpasses[0]), 105568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (deUint32)dependencies.size(), 105668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (dependencies.empty() ? DE_NULL : &dependencies[0]) 105768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }; 105868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 105968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return createRenderPass(vk, device, &createInfo); 1060c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1063c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkFramebuffer> createFramebuffer (const DeviceInterface& vk, 1064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkRenderPass renderPass, 1066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 1067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<VkImageView>& attachments) 1068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 106968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return createFramebuffer(vk, device, 0u, renderPass, (deUint32)attachments.size(), attachments.empty() ? DE_NULL : &attachments[0], size.x(), size.y(), 1u); 1070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1071c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1072c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImage> createAttachmentImage (const DeviceInterface& vk, 1073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 queueIndex, 1075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 1076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkFormat format, 107768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSampleCountFlagBits samples, 1078c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageUsageFlags usageFlags, 1079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout layout) 1080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1081775c33feeee3a8a7cfe1a51447424d4160083fffscygan const VkExtent3D size_ = { (deInt32)size.x(), (deInt32)size.y(), 1 }; 1082775c33feeee3a8a7cfe1a51447424d4160083fffscygan VkImageUsageFlags targetUsageFlags = 0; 1083775c33feeee3a8a7cfe1a51447424d4160083fffscygan const tcu::TextureFormat textureFormat = mapVkFormat(format); 108494128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos 10859cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan if (tcu::hasDepthComponent(textureFormat.order) || tcu::hasStencilComponent(textureFormat.order)) 1086775c33feeee3a8a7cfe1a51447424d4160083fffscygan { 10879cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan targetUsageFlags |= vk::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; 1088775c33feeee3a8a7cfe1a51447424d4160083fffscygan } 108994128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos else 1090775c33feeee3a8a7cfe1a51447424d4160083fffscygan { 10919cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan targetUsageFlags |= vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 1092775c33feeee3a8a7cfe1a51447424d4160083fffscygan } 10939cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan 109468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return createImage(vk, device, 109568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkImageCreateFlags)0, 109668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_TYPE_2D, 109768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos format, 109868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos size_, 109968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u /* mipLevels */, 110068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u /* arraySize */, 110168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos samples, 110268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_TILING_OPTIMAL, 110368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos usageFlags | targetUsageFlags, 110468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SHARING_MODE_EXCLUSIVE, 110568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1, 110668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &queueIndex, 110768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos layout); 1108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<Allocation> createImageMemory (const DeviceInterface& vk, 1111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Allocator& allocator, 1113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImage image, 1114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool lazy) 1115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<Allocation> allocation (allocator.allocate(getImageMemoryRequirements(vk, device, image), lazy ? MemoryRequirement::LazilyAllocated : MemoryRequirement::Any)); 1117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bindImageMemory(vk, device, image, allocation->getMemory(), allocation->getOffset()); 1118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return allocation; 1119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1121c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImageView> createImageAttachmentView (const DeviceInterface& vk, 1122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImage image, 1124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkFormat format, 1125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageAspectFlags aspect) 1126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageSubresourceRange range = 1128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi aspect, 1130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 1131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1, 1132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 1133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 1134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 113668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return createImageView(vk, device, 0u, image, VK_IMAGE_VIEW_TYPE_2D, format, makeComponentMappingRGBA(), range); 1137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1139c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkClearValue randomClearValue (const Attachment& attachment, de::Random& rng) 1140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clearNan = tcu::Float32::nan().asFloat(); 1142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 1143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order) || tcu::hasDepthComponent(format.order)) 1145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkClearValue clearValue; 1147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValue.depthStencil.depth = clearNan; 1149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValue.depthStencil.stencil = 255; 1150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order)) 1152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValue.depthStencil.stencil = rng.getInt(0, 255); 1153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order)) 1155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValue.depthStencil.depth = rng.getFloat(); 1156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return clearValue; 1158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 1160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkClearValue clearValue; 1162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValue.color = randomColorClearValue(attachment, rng); 1164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return clearValue; 1166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass AttachmentResources 1170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 1172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentResources (const DeviceInterface& vk, 1173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Allocator& allocator, 1175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 queueIndex, 1176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 1177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachmentInfo, 1178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool lazy) 1179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_image (createAttachmentImage(vk, device, queueIndex, size, attachmentInfo.getFormat(), attachmentInfo.getSamples(), lazy ? VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT : 0, VK_IMAGE_LAYOUT_UNDEFINED)) 1180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_imageMemory (createImageMemory(vk, device, allocator, *m_image, lazy)) 1181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_attachmentView (createImageAttachmentView(vk, device, *m_image, attachmentInfo.getFormat(), getImageAspectFlags(attachmentInfo.getFormat()))) 1182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!lazy) 1184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachmentInfo.getFormat()); 1186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order) && tcu::hasStencilComponent(format.order)) 1188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1189bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz const tcu::TextureFormat depthFormat = getDepthCopyFormat(attachmentInfo.getFormat()); 1190bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz const tcu::TextureFormat stencilFormat = getStencilCopyFormat(attachmentInfo.getFormat()); 1191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_bufferSize = size.x() * size.y() * depthFormat.getPixelSize(); 1193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_secondaryBufferSize = size.x() * size.y() * stencilFormat.getPixelSize(); 1194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 119568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_buffer = createBuffer(vk, device, 0, m_bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex); 1196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_bufferMemory = allocator.allocate(getBufferMemoryRequirements(vk, device, *m_buffer), MemoryRequirement::HostVisible); 1197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bindBufferMemory(vk, device, *m_buffer, m_bufferMemory->getMemory(), m_bufferMemory->getOffset()); 1199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 120068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_secondaryBuffer = createBuffer(vk, device, 0, m_secondaryBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex); 1201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_secondaryBufferMemory = allocator.allocate(getBufferMemoryRequirements(vk, device, *m_secondaryBuffer), MemoryRequirement::HostVisible); 1202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bindBufferMemory(vk, device, *m_secondaryBuffer, m_secondaryBufferMemory->getMemory(), m_secondaryBufferMemory->getOffset()); 1204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 1206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_bufferSize = size.x() * size.y() * format.getPixelSize(); 1208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 120968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_buffer = createBuffer(vk, device, 0, m_bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex); 1210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_bufferMemory = allocator.allocate(getBufferMemoryRequirements(vk, device, *m_buffer), MemoryRequirement::HostVisible); 1211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bindBufferMemory(vk, device, *m_buffer, m_bufferMemory->getMemory(), m_bufferMemory->getOffset()); 1213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ~AttachmentResources (void) 1218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageView getAttachmentView (void) const 1222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_attachmentView; 1224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImage getImage (void) const 1227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_image; 1229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkBuffer getBuffer (void) const 1232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(*m_buffer != DE_NULL); 1234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_buffer; 1235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDeviceSize getBufferSize (void) const 1238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(*m_buffer != DE_NULL); 1240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return m_bufferSize; 1241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Allocation& getResultMemory (void) const 1244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(m_bufferMemory); 1246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_bufferMemory; 1247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkBuffer getSecondaryBuffer (void) const 1250c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(*m_secondaryBuffer != DE_NULL); 1252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_secondaryBuffer; 1253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDeviceSize getSecondaryBufferSize (void) const 1256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(*m_secondaryBuffer != DE_NULL); 1258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return m_secondaryBufferSize; 1259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Allocation& getSecondaryResultMemory (void) const 1262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(m_secondaryBufferMemory); 1264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_secondaryBufferMemory; 1265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 1268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Unique<VkImage> m_image; 1269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UniquePtr<Allocation> m_imageMemory; 1270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Unique<VkImageView> m_attachmentView; 1271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Move<VkBuffer> m_buffer; 1273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDeviceSize m_bufferSize; 1274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<Allocation> m_bufferMemory; 1275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Move<VkBuffer> m_secondaryBuffer; 1277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDeviceSize m_secondaryBufferSize; 1278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<Allocation> m_secondaryBufferMemory; 1279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid uploadBufferData (const DeviceInterface& vk, 1282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Allocation& memory, 1284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi size_t size, 1285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const void* data) 1286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkMappedMemoryRange range = 1288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // sType; 1290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 1291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi memory.getMemory(), // mem; 1292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi memory.getOffset(), // offset; 1293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (VkDeviceSize)size // size; 1294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void* const ptr = memory.getHostPtr(); 1296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deMemcpy(ptr, data, size); 1298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.flushMappedMemoryRanges(device, 1, &range)); 1299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 130168e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkImageAspectFlagBits getPrimaryImageAspect (tcu::TextureFormat::ChannelOrder order) 1302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST == 21); 1304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (order) 1306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::D: 1308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::DS: 130968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_IMAGE_ASPECT_DEPTH_BIT; 1310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::S: 131268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_IMAGE_ASPECT_STENCIL_BIT; 1313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 131568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_IMAGE_ASPECT_COLOR_BIT; 1316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass RenderQuad 1320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 1322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RenderQuad (const Vec4& posA, const Vec4& posB) 1323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_vertices(6) 1324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertices[0] = posA; 1326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertices[1] = Vec4(posA[0], posB[1], posA[2], posA[3]); 1327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertices[2] = posB; 1328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertices[3] = posB; 1330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertices[4] = Vec4(posB[0], posA[1], posB[2], posA[3]); 1331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertices[5] = posA; 1332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4& getCornerA (void) const 1335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return m_vertices[0]; 1337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4& getCornerB (void) const 1340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return m_vertices[2]; 1342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const void* getVertexPointer (void) const 1345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return &m_vertices[0]; 1347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi size_t getVertexDataSize (void) const 1350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return sizeof(Vec4) * m_vertices.size(); 1352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 1355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Vec4> m_vertices; 1356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass ColorClear 1359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 1361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ColorClear (const UVec2& offset, 1362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 1363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearColorValue& color) 1364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_offset (offset) 1365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_size (size) 1366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_color (color) 1367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& getOffset (void) const { return m_offset; } 1371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& getSize (void) const { return m_size; } 1372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearColorValue& getColor (void) const { return m_color; } 1373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 1375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 m_offset; 1376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 m_size; 1377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkClearColorValue m_color; 1378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass DepthStencilClear 1381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 1383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DepthStencilClear (const UVec2& offset, 1384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 1385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi float depth, 1386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 stencil) 1387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_offset (offset) 1388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_size (size) 1389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_depth (depth) 1390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_stencil (stencil) 1391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& getOffset (void) const { return m_offset; } 1395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& getSize (void) const { return m_size; } 1396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi float getDepth (void) const { return m_depth; } 1397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getStencil (void) const { return m_stencil; } 1398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 1400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 m_offset; 1401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 m_size; 1402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi float m_depth; 1404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 m_stencil; 1405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassRenderInfo 1408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 1410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi SubpassRenderInfo (const RenderPass& renderPass, 1411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 subpassIndex, 1412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool isSecondary_, 1414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& viewportOffset, 1416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& viewportSize, 1417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<RenderQuad>& renderQuad, 1419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<ColorClear>& colorClears, 1420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<DepthStencilClear>& depthStencilClear) 1421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_viewportOffset (viewportOffset) 1422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_viewportSize (viewportSize) 1423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_subpassIndex (subpassIndex) 1424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_isSecondary (isSecondary_) 1425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_flags (renderPass.getSubpasses()[subpassIndex].getFlags()) 1426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_renderQuad (renderQuad) 1427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_colorClears (colorClears) 1428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_depthStencilClear (depthStencilClear) 1429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_colorAttachments (renderPass.getSubpasses()[subpassIndex].getColorAttachments()) 1430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (deUint32 attachmentNdx = 0; attachmentNdx < (deUint32)m_colorAttachments.size(); attachmentNdx++) 1432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_colorAttachmentInfo.push_back(renderPass.getAttachments()[m_colorAttachments[attachmentNdx].getAttachment()]); 1433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 1435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_depthStencilAttachment = tcu::just(renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment()); 1437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_depthStencilAttachmentInfo = tcu::just(renderPass.getAttachments()[renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment().getAttachment()]); 1438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& getViewportOffset (void) const { return m_viewportOffset; } 1442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& getViewportSize (void) const { return m_viewportSize; } 1443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getSubpassIndex (void) const { return m_subpassIndex; } 1445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool isSecondary (void) const { return m_isSecondary; } 1446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<RenderQuad>& getRenderQuad (void) const { return m_renderQuad; } 1448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<ColorClear>& getColorClears (void) const { return m_colorClears; } 1449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<DepthStencilClear>& getDepthStencilClear (void) const { return m_depthStencilClear; } 1450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getColorAttachmentCount (void) const { return (deUint32)m_colorAttachments.size(); } 1452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout getColorAttachmentLayout (deUint32 attachmentNdx) const { return m_colorAttachments[attachmentNdx].getImageLayout(); } 1453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getColorAttachmentIndex (deUint32 attachmentNdx) const { return m_colorAttachments[attachmentNdx].getAttachment(); } 1454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& getColorAttachment (deUint32 attachmentNdx) const { return m_colorAttachmentInfo[attachmentNdx]; } 1455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<VkImageLayout> getDepthStencilAttachmentLayout (void) const { return m_depthStencilAttachment ? tcu::just(m_depthStencilAttachment->getImageLayout()) : tcu::nothing<VkImageLayout>(); } 1456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<deUint32> getDepthStencilAttachmentIndex (void) const { return m_depthStencilAttachment ? tcu::just(m_depthStencilAttachment->getAttachment()) : tcu::nothing<deUint32>(); }; 1457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<Attachment>& getDepthStencilAttachment (void) const { return m_depthStencilAttachmentInfo; } 1458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkSubpassDescriptionFlags getSubpassFlags (void) const { return m_flags; } 1459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 1460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 m_viewportOffset; 1461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 m_viewportSize; 1462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 m_subpassIndex; 1464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool m_isSecondary; 1465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkSubpassDescriptionFlags m_flags; 1466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<RenderQuad> m_renderQuad; 1468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<ColorClear> m_colorClears; 1469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<DepthStencilClear> m_depthStencilClear; 1470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> m_colorAttachments; 1472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Attachment> m_colorAttachmentInfo; 1473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<AttachmentReference> m_depthStencilAttachment; 1475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<Attachment> m_depthStencilAttachmentInfo; 1476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1478c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkPipeline> createSubpassPipeline (const DeviceInterface& vk, 1479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkRenderPass renderPass, 148168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkShaderModule vertexShaderModule, 148268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkShaderModule fragmentShaderModule, 1483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineLayout pipelineLayout, 1484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassRenderInfo& renderInfo) 1485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkSpecializationInfo emptyShaderSpecializations = 1487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // mapEntryCount 1489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pMap 1490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // dataSize 1491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pData 1492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 149468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos Maybe<VkSampleCountFlagBits> rasterSamples; 1495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkPipelineColorBlendAttachmentState> attachmentBlendStates; 1496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (deUint32 attachmentNdx = 0; attachmentNdx < renderInfo.getColorAttachmentCount(); attachmentNdx++) 1498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = renderInfo.getColorAttachment(attachmentNdx); 1500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(!rasterSamples || *rasterSamples == attachment.getSamples()); 1502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi rasterSamples = attachment.getSamples(); 1504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineColorBlendAttachmentState attachmentBlendState = 1507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 150868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FALSE, // blendEnable 150968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_SRC_ALPHA, // srcBlendColor 151068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, // destBlendColor 151168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_OP_ADD, // blendOpColor 151268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ONE, // srcBlendAlpha 151368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ONE, // destBlendAlpha 151468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_OP_ADD, // blendOpAlpha 151568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COLOR_COMPONENT_R_BIT|VK_COLOR_COMPONENT_G_BIT|VK_COLOR_COMPONENT_B_BIT|VK_COLOR_COMPONENT_A_BIT, // channelWriteMask 1516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentBlendStates.push_back(attachmentBlendState); 1519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.getDepthStencilAttachment()) 1523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = *renderInfo.getDepthStencilAttachment(); 1525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(!rasterSamples || *rasterSamples == attachment.getSamples()); 1527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi rasterSamples = attachment.getSamples(); 1528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1529c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // If there are no attachment use single sample 1531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!rasterSamples) 153268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos rasterSamples = VK_SAMPLE_COUNT_1_BIT; 1533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineShaderStageCreateInfo shaderStages[2] = 1535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // sType 1538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 153968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineShaderStageCreateFlags)0u, 154068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SHADER_STAGE_VERTEX_BIT, // stage 154168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vertexShaderModule, // shader 154268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos "main", 1543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &emptyShaderSpecializations 1544c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, 1545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // sType 1547c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 154868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineShaderStageCreateFlags)0u, 154968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SHADER_STAGE_FRAGMENT_BIT, // stage 155068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos fragmentShaderModule, // shader 155168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos "main", 1552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &emptyShaderSpecializations 1553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkVertexInputBindingDescription vertexBinding = 1556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // binding 1558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (deUint32)sizeof(tcu::Vec4), // strideInBytes 155968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_VERTEX_INPUT_RATE_VERTEX, // stepRate 1560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkVertexInputAttributeDescription vertexAttrib = 1562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // location 1564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // binding 1565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32B32A32_SFLOAT, // format 1566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // offsetInBytes 1567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineVertexInputStateCreateInfo vertexInputState = 1569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // sType 1571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 157268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineVertexInputStateCreateFlags)0u, 1573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1u, // bindingCount 1574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &vertexBinding, // pVertexBindingDescriptions 1575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1u, // attributeCount 1576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &vertexAttrib, // pVertexAttributeDescriptions 1577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineInputAssemblyStateCreateInfo inputAssemblyState = 1579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // sType 1581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 158268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineInputAssemblyStateCreateFlags)0u, 1583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // topology 1584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // primitiveRestartEnable 1585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkViewport viewport = 1587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (float)renderInfo.getViewportOffset().x(), (float)renderInfo.getViewportOffset().y(), 1589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y(), 1590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0.0f, 1.0f 1591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkRect2D scissor = 1593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { (deInt32)renderInfo.getViewportOffset().x(), (deInt32)renderInfo.getViewportOffset().y() }, 1595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { (deInt32)renderInfo.getViewportSize().x(), (deInt32)renderInfo.getViewportSize().y() } 1596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineViewportStateCreateInfo viewportState = 1598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, 1600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 160168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineViewportStateCreateFlags)0u, 1602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1u, 1603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &viewport, 1604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1u, 1605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &scissor 1606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 160768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkPipelineRasterizationStateCreateInfo rasterState = 1608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 160968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // sType 1610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 161168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineRasterizationStateCreateFlags)0u, 1612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_TRUE, // depthClipEnable 1613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // rasterizerDiscardEnable 161468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_POLYGON_MODE_FILL, // fillMode 1615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CULL_MODE_NONE, // cullMode 161668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FRONT_FACE_COUNTER_CLOCKWISE, // frontFace 1617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // depthBiasEnable 1618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0.0f, // depthBias 1619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0.0f, // depthBiasClamp 1620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0.0f, // slopeScaledDepthBias 1621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1.0f // lineWidth 1622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineMultisampleStateCreateInfo multisampleState = 1624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // sType 1626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 162768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineMultisampleStateCreateFlags)0u, 1628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *rasterSamples, // rasterSamples 1629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // sampleShadingEnable 1630c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0.0f, // minSampleShading 163168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pSampleMask 163268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FALSE, // alphaToCoverageEnable 163368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FALSE, // alphaToOneEnable 1634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineDepthStencilStateCreateInfo depthStencilState = 1636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // sType 1638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 163968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineDepthStencilStateCreateFlags)0u, 1640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_TRUE, // depthTestEnable 1641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_TRUE, // depthWriteEnable 1642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_COMPARE_OP_ALWAYS, // depthCompareOp 1643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // depthBoundsEnable 1644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_TRUE, // stencilTestEnable 1645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilFailOp 1647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilPassOp 1648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilDepthFailOp 1649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_COMPARE_OP_ALWAYS, // stencilCompareOp 1650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ~0u, // stencilCompareMask 1651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ~0u, // stencilWriteMask 1652a3e06bac8ee2c4ccac086f1bfc3c2e833d9f154fJeff Bolz STENCIL_VALUE // stencilReference 1653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, // front 1654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilFailOp 1656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilPassOp 1657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilDepthFailOp 1658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_COMPARE_OP_ALWAYS, // stencilCompareOp 1659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ~0u, // stencilCompareMask 1660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ~0u, // stencilWriteMask 1661a3e06bac8ee2c4ccac086f1bfc3c2e833d9f154fJeff Bolz STENCIL_VALUE // stencilReference 1662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, // back 1663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi -1.0f, // minDepthBounds; 1665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1.0f // maxDepthBounds; 1666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineColorBlendStateCreateInfo blendState = 1668c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // sType 1670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 167168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineColorBlendStateCreateFlags)0u, 1672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // logicOpEnable 1673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_LOGIC_OP_COPY, // logicOp 1674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (deUint32)attachmentBlendStates.size(), // attachmentCount 1675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentBlendStates.empty() ? DE_NULL : &attachmentBlendStates[0],// pAttachments 1676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 0.0f, 0.0f, 0.0f, 0.0f } // blendConst 1677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineDynamicStateCreateInfo dynamicState = 1679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, 1681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 168268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineDynamicStateCreateFlags)0u, 1683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 1684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL 1685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkGraphicsPipelineCreateInfo createInfo = 1687c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // sType 1689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 169068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineCreateFlags)0u, 1691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2, // stageCount 1693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi shaderStages, // pStages 1694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &vertexInputState, // pVertexInputState 1696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &inputAssemblyState, // pInputAssemblyState 1697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pTessellationState 1698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &viewportState, // pViewportState 1699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &rasterState, // pRasterState 1700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &multisampleState, // pMultisampleState 1701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &depthStencilState, // pDepthStencilState 1702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &blendState, // pColorBlendState 1703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &dynamicState, // pDynamicState 1704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pipelineLayout, // layout 1705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderPass, // renderPass 1707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderInfo.getSubpassIndex(), // subpass 1708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // basePipelineHandle 1709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u // basePipelineIndex 1710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return createGraphicsPipeline(vk, device, DE_NULL, &createInfo); 1713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassRenderer 1716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 1718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi SubpassRenderer (Context& context, 1719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DeviceInterface& vk, 1720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Allocator& allocator, 1722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkRenderPass renderPass, 1723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkFramebuffer framebuffer, 172468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandPool commandBufferPool, 1725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 queueFamilyIndex, 1726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassRenderInfo& renderInfo) 1727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_renderInfo (renderInfo) 1728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 subpassIndex = renderInfo.getSubpassIndex(); 1730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.getRenderQuad()) 1732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderQuad& renderQuad = *renderInfo.getRenderQuad(); 1734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineLayoutCreateInfo pipelineLayoutParams = 1735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType; 1737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 173868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (vk::VkPipelineLayoutCreateFlags)0, 1739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // descriptorSetCount; 1740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pSetLayouts; 1741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // pushConstantRangeCount; 1742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pPushConstantRanges; 1743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertexShaderModule = createShaderModule(vk, device, context.getBinaryCollection().get(de::toString(subpassIndex) + "-vert"), 0u); 1746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_fragmentShaderModule = createShaderModule(vk, device, context.getBinaryCollection().get(de::toString(subpassIndex) + "-frag"), 0u); 1747c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_pipelineLayout = createPipelineLayout(vk, device, &pipelineLayoutParams); 174868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_pipeline = createSubpassPipeline(vk, device, renderPass, *m_vertexShaderModule, *m_fragmentShaderModule, *m_pipelineLayout, m_renderInfo); 1749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 175068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_vertexBuffer = createBuffer(vk, device, 0u, (VkDeviceSize)renderQuad.getVertexDataSize(), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_SHARING_MODE_EXCLUSIVE, 1u, &queueFamilyIndex); 1751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertexBufferMemory = allocator.allocate(getBufferMemoryRequirements(vk, device, *m_vertexBuffer), MemoryRequirement::HostVisible); 1752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bindBufferMemory(vk, device, *m_vertexBuffer, m_vertexBufferMemory->getMemory(), m_vertexBufferMemory->getOffset()); 1754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi uploadBufferData(vk, device, *m_vertexBufferMemory, renderQuad.getVertexDataSize(), renderQuad.getVertexPointer()); 1755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.isSecondary()) 1758c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 175968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_commandBuffer = allocateCommandBuffer(vk, device, commandBufferPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY); 1760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 176157b41652a8af472d28943d13924edc3a32ec3884scygan beginCommandBuffer(vk, *m_commandBuffer, vk::VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, renderPass, subpassIndex, framebuffer, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0); 1762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pushRenderCommands(vk, *m_commandBuffer); 1763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi endCommandBuffer(vk, *m_commandBuffer); 1764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool isSecondary (void) const 1768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1769c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return m_commandBuffer; 1770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 177268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer getCommandBuffer (void) const 1773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(isSecondary()); 1775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_commandBuffer; 1776c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void pushRenderCommands (const DeviceInterface& vk, 177968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer commandBuffer) 1780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!m_renderInfo.getColorClears().empty()) 1782c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1783c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<ColorClear>& colorClears (m_renderInfo.getColorClears()); 1784c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1785c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (deUint32 attachmentNdx = 0; attachmentNdx < m_renderInfo.getColorAttachmentCount(); attachmentNdx++) 1786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const ColorClear& colorClear = colorClears[attachmentNdx]; 178868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkClearAttachment attachment = 1789c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 179068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_ASPECT_COLOR_BIT, 179168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachmentNdx, 179268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos makeClearValue(colorClear.getColor()), 179368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }; 179468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkClearRect rect = 179568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 179668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 179768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { (deInt32)colorClear.getOffset().x(), (deInt32)colorClear.getOffset().y() }, 179868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { (deInt32)colorClear.getSize().x(), (deInt32)colorClear.getSize().y() } 179968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }, // rect 180068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // baseArrayLayer 180168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // layerCount 1802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 180468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdClearAttachments(commandBuffer, 1u, &attachment, 1u, &rect); 1805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1808c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (m_renderInfo.getDepthStencilClear()) 1809c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DepthStencilClear& depthStencilClear = *m_renderInfo.getDepthStencilClear(); 181168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const deUint32 attachmentNdx = m_renderInfo.getColorAttachmentCount(); 18124c7a3aad422a9a456debcbf83f0af165c2471f5cscygan tcu::TextureFormat format = mapVkFormat(m_renderInfo.getDepthStencilAttachment()->getFormat()); 181368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkClearAttachment attachment = 1814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 18154c7a3aad422a9a456debcbf83f0af165c2471f5cscygan (VkImageAspectFlags)((hasDepthComponent(format.order) ? VK_IMAGE_ASPECT_DEPTH_BIT : 0) 18164c7a3aad422a9a456debcbf83f0af165c2471f5cscygan | (hasStencilComponent(format.order) ? VK_IMAGE_ASPECT_STENCIL_BIT : 0)), 181768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachmentNdx, 181868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos makeClearValueDepthStencil(depthStencilClear.getDepth(), depthStencilClear.getStencil()) 1819c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 182068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkClearRect rect = 1821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 182268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 182368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { (deInt32)depthStencilClear.getOffset().x(), (deInt32)depthStencilClear.getOffset().y() }, 182468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { (deInt32)depthStencilClear.getSize().x(), (deInt32)depthStencilClear.getSize().y() } 182568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }, // rect 182668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // baseArrayLayer 182768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // layerCount 1828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 183068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdClearAttachments(commandBuffer, 1u, &attachment, 1u, &rect); 1831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1832c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1833c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (m_renderInfo.getRenderQuad()) 1834c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkDeviceSize offset = 0; 1836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBuffer vertexBuffer = *m_vertexBuffer; 1837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline); 1839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdBindVertexBuffers(commandBuffer, 0u, 1u, &vertexBuffer, &offset); 1840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdDraw(commandBuffer, 6u, 1u, 0u, 0u); 1841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 1845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassRenderInfo m_renderInfo; 184668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos Move<VkCommandBuffer> m_commandBuffer; 1847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Move<VkPipeline> m_pipeline; 1848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Move<VkPipelineLayout> m_pipelineLayout; 1849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1850c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Move<VkShaderModule> m_vertexShaderModule; 1851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Move<VkShaderModule> m_fragmentShaderModule; 1853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Move<VkBuffer> m_vertexBuffer; 1855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<Allocation> m_vertexBufferMemory; 1856c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1857c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid pushImageInitializationCommands (const DeviceInterface& vk, 185968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer commandBuffer, 1860c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment>& attachmentInfo, 1861c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<de::SharedPtr<AttachmentResources> >& attachmentResources, 1862c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 queueIndex, 1863c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& clearValues) 1864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1865c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkImageMemoryBarrier> initializeLayouts; 1867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 1869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!clearValues[attachmentNdx]) 1871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi continue; 1872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageMemoryBarrier barrier = 1874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType; 1876c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 1877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 187868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryWriteFlags(), // srcAccessMask 187968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryReadFlags(), // dstAccessMask 1880c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_UNDEFINED, // oldLayout 188268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // newLayout; 1883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, // srcQueueFamilyIndex; 1885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, // destQueueFamilyIndex; 1886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getImage(), // image; 1888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { // subresourceRange; 1889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()), // aspect; 1890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // baseMipLevel; 1891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1, // mipLevels; 1892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // baseArraySlice; 1893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 // arraySize; 1894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeLayouts.push_back(barrier); 1898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!initializeLayouts.empty()) 1901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkImageMemoryBarrier*> initializeLayoutPtrs; 1903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t ndx = 0; ndx < initializeLayouts.size(); ndx++) 1905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeLayoutPtrs.push_back(&initializeLayouts[ndx]); 1906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdPipelineBarrier(commandBuffer, 0, 0, VK_FALSE, (deUint32)initializeLayouts.size(), (const void* const*)&initializeLayoutPtrs[0]); 1908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 1912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!clearValues[attachmentNdx]) 1914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi continue; 1915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachmentInfo[attachmentNdx].getFormat()); 1917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasStencilComponent(format.order) || hasDepthComponent(format.order)) 1919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clearNan = tcu::Float32::nan().asFloat(); 1921c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clearDepth = hasDepthComponent(format.order) ? clearValues[attachmentNdx]->depthStencil.depth : clearNan; 1922c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 clearStencil = hasStencilComponent(format.order) ? clearValues[attachmentNdx]->depthStencil.stencil : ~0u; 1923c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearDepthStencilValue depthStencil = 1924c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1925c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearDepth, 1926c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearStencil 1927c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1928c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageSubresourceRange range = 1929c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1930d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz (VkImageAspectFlags)((hasDepthComponent(format.order) ? VK_IMAGE_ASPECT_DEPTH_BIT : 0) 1931d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz | (hasStencilComponent(format.order) ? VK_IMAGE_ASPECT_STENCIL_BIT : 0)), 1932c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 1933c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1, 1934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 1935c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 1936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 193868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdClearDepthStencilImage(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &depthStencil, 1, &range); 1939c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 1941c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1942c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageSubresourceRange range = 1943c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 194468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask; 1945c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // baseMipLevel; 1946c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1, // mipLevels; 194768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0, // baseArrayLayer; 194868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1 // layerCount; 1949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearColorValue clearColor = clearValues[attachmentNdx]->color; 1951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 195268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdClearColorImage(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearColor, 1, &range); 1953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1956c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1957c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkImageMemoryBarrier> renderPassLayouts; 1958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1959c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 1960c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1961c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageMemoryBarrier barrier = 1962c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1963c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType; 1964c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 1965c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 196668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryWriteFlags(), // srcAccessMask 196768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryReadFlags(), // dstAccessMask 1968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues[attachmentNdx] ? 197068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL 1971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : VK_IMAGE_LAYOUT_UNDEFINED, // oldLayout 1972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentInfo[attachmentNdx].getInitialLayout(), // newLayout; 1974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, // srcQueueFamilyIndex; 1976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, // destQueueFamilyIndex; 1977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getImage(), // image; 1979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { // subresourceRange; 1980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()), // aspect; 1981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // baseMipLevel; 1982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1, // mipLevels; 1983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // baseArraySlice; 1984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 // arraySize; 1985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1986c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1987c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1988c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderPassLayouts.push_back(barrier); 1989c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1990c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1991c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!renderPassLayouts.empty()) 1992c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkImageMemoryBarrier*> renderPassLayoutPtrs; 1994c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1995c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t ndx = 0; ndx < renderPassLayouts.size(); ndx++) 1996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderPassLayoutPtrs.push_back(&renderPassLayouts[ndx]); 1997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1998c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdPipelineBarrier(commandBuffer, 0, 0, VK_FALSE, (deUint32)renderPassLayouts.size(), (const void* const*)&renderPassLayoutPtrs[0]); 1999c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2003c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid pushRenderPassCommands (const DeviceInterface& vk, 200468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer commandBuffer, 2005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkRenderPass renderPass, 2006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkFramebuffer framebuffer, 2007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<de::SharedPtr<SubpassRenderer> >& subpassRenderers, 2008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderPos, 2009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderSize, 2010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& renderPassClearValues, 2011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RenderTypes render) 2012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clearNan = tcu::Float32::nan().asFloat(); 2014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkClearValue> attachmentClearValues; 2015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassClearValues.size(); attachmentNdx++) 2017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderPassClearValues[attachmentNdx]) 2019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentClearValues.push_back(*renderPassClearValues[attachmentNdx]); 2020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentClearValues.push_back(makeClearValueColorF32(clearNan, clearNan, clearNan, clearNan)); 2022c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkRect2D renderArea = 2026c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { (deInt32)renderPos.x(), (deInt32)renderPos.y() }, 2028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { (deInt32)renderSize.x(), (deInt32)renderSize.y() } 2029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < subpassRenderers.size(); subpassNdx++) 2032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 203368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSubpassContents contents = subpassRenderers[subpassNdx]->isSecondary() ? VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS : VK_SUBPASS_CONTENTS_INLINE; 2034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpassNdx == 0) 2036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi cmdBeginRenderPass(vk, commandBuffer, renderPass, framebuffer, renderArea, (deUint32)attachmentClearValues.size(), attachmentClearValues.empty() ? DE_NULL : &attachmentClearValues[0], contents); 2037c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdNextSubpass(commandBuffer, contents); 2039c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (render) 2041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 204268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos if (contents == VK_SUBPASS_CONTENTS_INLINE) 2043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpassRenderers[subpassNdx]->pushRenderCommands(vk, commandBuffer); 2045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 204668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos else if (contents == VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS) 2047c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 204868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandBuffer cmd = subpassRenderers[subpassNdx]->getCommandBuffer(); 2049c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdExecuteCommands(commandBuffer, 1, &cmd); 2050c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2051c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2052c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Invalid contents"); 2053c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdEndRenderPass(commandBuffer); 2057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2058c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2060c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid pushReadImagesToBuffers (const DeviceInterface& vk, 206168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer commandBuffer, 2062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 queueIndex, 2063c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<de::SharedPtr<AttachmentResources> >& attachmentResources, 2065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment>& attachmentInfo, 2066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<bool>& isLazy, 2067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& targetSize) 2069c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2071c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkImageMemoryBarrier> imageBarriers; 2072c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 2074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isLazy[attachmentNdx]) 2076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi continue; 2077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2078c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageMemoryBarrier barrier = 2079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType 2081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 2082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 208368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryWriteFlags(), // srcAccessMask 208468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryReadFlags(), // dstAccessMask 2085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2086c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentInfo[attachmentNdx].getFinalLayout(), // oldLayout 208768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // newLayout 2088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2089c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, // srcQueueFamilyIndex 2090c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, // destQueueFamilyIndex 2091c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2092c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getImage(), // image 2093c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { // subresourceRange 2094c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()), // aspect; 2095c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // baseMipLevel 2096c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1, // mipLevels 2097c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // baseArraySlice 2098c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 // arraySize 2099c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2100c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2102c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi imageBarriers.push_back(barrier); 2103c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!imageBarriers.empty()) 2106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkImageMemoryBarrier*> clearLayoutPtrs; 2108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t ndx = 0; ndx < imageBarriers.size(); ndx++) 2110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearLayoutPtrs.push_back(&imageBarriers[ndx]); 2111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdPipelineBarrier(commandBuffer, getAllPipelineStageFlags(), 2113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi getAllPipelineStageFlags(), 2114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, (deUint32)imageBarriers.size(), (const void* const*)&clearLayoutPtrs[0]); 2115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 2119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isLazy[attachmentNdx]) 2121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi continue; 2122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat::ChannelOrder order = mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order; 2124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBufferImageCopy rect = 2125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // bufferOffset 2127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // bufferRowLength 2128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // bufferImageHeight 2129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { // imageSubresource 2130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi getPrimaryImageAspect(mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order), // aspect 213194128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos 0, // mipLevel 2132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // arraySlice 2133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 // arraySize 2134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, 213594128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos { 0, 0, 0 }, // imageOffset 2136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { (deInt32)targetSize.x(), (deInt32)targetSize.y(), 1 } // imageExtent 2137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 213968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdCopyImageToBuffer(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, attachmentResources[attachmentNdx]->getBuffer(), 1, &rect); 2140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::TextureFormat::DS == order) 2142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBufferImageCopy stencilRect = 2144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // bufferOffset 2146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // bufferRowLength 2147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // bufferImageHeight 214868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { // imageSubresource 214968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_ASPECT_STENCIL_BIT, // aspect 215068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0, // mipLevel 215168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0, // arraySlice 2152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 // arraySize 2153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, 215494128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos { 0, 0, 0 }, // imageOffset 2155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { (deInt32)targetSize.x(), (deInt32)targetSize.y(), 1 } // imageExtent 2156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 215868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdCopyImageToBuffer(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, attachmentResources[attachmentNdx]->getSecondaryBuffer(), 1, &stencilRect); 2159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkBufferMemoryBarrier> bufferBarriers; 2164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 2166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isLazy[attachmentNdx]) 2168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi continue; 2169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat::ChannelOrder order = mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order; 2171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBufferMemoryBarrier bufferBarrier = 2172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, 2174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 2175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 217668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryWriteFlags(), 217768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryReadFlags(), 2178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, 2180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, 2181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getBuffer(), 2183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 2184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getBufferSize() 2185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bufferBarriers.push_back(bufferBarrier); 2188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::TextureFormat::DS == order) 2190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBufferMemoryBarrier secondaryBufferBarrier = 2192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, 2194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 2195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 219668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryWriteFlags(), 219768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryReadFlags(), 2198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, 2200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, 2201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getSecondaryBuffer(), 2203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 2204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getSecondaryBufferSize() 2205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bufferBarriers.push_back(secondaryBufferBarrier); 2208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bufferBarriers.push_back(bufferBarrier); 2211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!bufferBarriers.empty()) 2214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkBufferMemoryBarrier*> clearLayoutPtrs; 2216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t ndx = 0; ndx < bufferBarriers.size(); ndx++) 2218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearLayoutPtrs.push_back(&bufferBarriers[ndx]); 2219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdPipelineBarrier(commandBuffer, getAllPipelineStageFlags(), 2221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi getAllPipelineStageFlags(), 2222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, (deUint32)bufferBarriers.size(), (const void* const*)&clearLayoutPtrs[0]); 2223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid clear (const PixelBufferAccess& access, const VkClearValue& value) 2228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat& format = access.getFormat(); 2230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order) || tcu::hasStencilComponent(format.order)) 2232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order)) 2234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::clearDepth(access, value.depthStencil.depth); 2235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order)) 2237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::clearStencil(access, value.depthStencil.stencil); 2238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_FLOATING_POINT 2242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT 2243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT) 2244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::Vec4 color (value.color.float32[0], 2246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.float32[1], 2247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.float32[2], 2248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.float32[3]); 2249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2250c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::isSRGB(format)) 2251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::clear(access, tcu::linearToSRGB(color)); 2252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::clear(access, color); 2254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER) 2256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::UVec4 color (value.color.uint32[0], 2258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.uint32[1], 2259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.uint32[2], 2260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.uint32[3]); 2261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::clear(access, color); 2263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER) 2265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::IVec4 color (value.color.int32[0], 2267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.int32[1], 2268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.int32[2], 2269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.int32[3]); 2270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::clear(access, color); 2272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown channel class"); 2275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2278c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVec4 computeUvs (const IVec2& posA, const IVec2& posB, const IVec2& pos) 2279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float u = de::clamp((float)(pos.x() - posA.x()) / (float)(posB.x() - posA.x()), 0.0f, 1.0f); 2281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float v = de::clamp((float)(pos.y() - posA.y()) / (float)(posB.y() - posA.y()), 0.0f, 1.0f); 2282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return Vec4(u, v, u * v, (u + v) / 2.0f); 2284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid renderReferenceImages (vector<tcu::TextureLevel>& referenceAttachments, 2287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPassInfo, 2288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& targetSize, 2289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& imageClearValues, 2290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& renderPassClearValues, 2291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassRenderInfo>& subpassRenderInfo, 2292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderPos, 2293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderSize) 2294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses = renderPassInfo.getSubpasses(); 2296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<bool> attachmentUsed (renderPassInfo.getAttachments().size(), false); 2297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi referenceAttachments.resize(renderPassInfo.getAttachments().size()); 2299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 2301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachment = renderPassInfo.getAttachments()[attachmentNdx]; 2303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 2304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(format); 2305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel& reference = referenceAttachments[attachmentNdx]; 2306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool isDepthOrStencilAttachment = hasDepthComponent(format.order) || hasStencilComponent(format.order); 2307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi reference = tcu::TextureLevel(format, targetSize.x(), targetSize.y()); 2309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (imageClearValues[attachmentNdx]) 2311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clear(reference.getAccess(), *imageClearValues[attachmentNdx]); 2312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Fill with grid if image contentst are undefined before renderpass 2315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isDepthOrStencilAttachment) 2316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order)) 2318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::fillWithGrid(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_DEPTH), 2, textureInfo.valueMin, textureInfo.valueMax); 2319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order)) 2321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::fillWithGrid(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_STENCIL), 2, textureInfo.valueMin, textureInfo.valueMax); 2322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::fillWithGrid(reference.getAccess(), 2, textureInfo.valueMin, textureInfo.valueMax); 2325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++) 2329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = subpasses[subpassNdx]; 2331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassRenderInfo& renderInfo = subpassRenderInfo[subpassNdx]; 2332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& colorAttachments = subpass.getColorAttachments(); 2333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Apply load op if attachment was used for the first time 2335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < colorAttachments.size(); attachmentNdx++) 2336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 attachmentIndex = colorAttachments[attachmentNdx].getAttachment(); 2338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!attachmentUsed[attachmentIndex]) 2340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = renderPassInfo.getAttachments()[attachmentIndex]; 2342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel& reference = referenceAttachments[attachmentIndex]; 2343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(!tcu::hasDepthComponent(reference.getFormat().order)); 2345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(!tcu::hasStencilComponent(reference.getFormat().order)); 2346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 2348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clear(tcu::getSubregion(reference.getAccess(), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), *renderPassClearValues[attachmentIndex]); 2349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 2350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(reference.getFormat()); 2352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::fillWithGrid(tcu::getSubregion(reference.getAccess(), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), 2, textureInfo.valueMin, textureInfo.valueMax); 2354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentUsed[attachmentIndex] = true; 2357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 236094128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos // Apply load op to depth/stencil attachment if it was used for the first time 2361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED && !attachmentUsed[subpass.getDepthStencilAttachment().getAttachment()]) 2362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 attachmentIndex = subpass.getDepthStencilAttachment().getAttachment(); 2364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Apply load op if attachment was used for the first time 2366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!attachmentUsed[attachmentIndex]) 2367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = renderPassInfo.getAttachments()[attachmentIndex]; 2369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel& reference = referenceAttachments[attachmentIndex]; 2370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(reference.getFormat().order)) 2372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 2374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clear(tcu::getSubregion(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_DEPTH), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), *renderPassClearValues[attachmentIndex]); 2375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 2376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(reference.getFormat()); 2378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::fillWithGrid(tcu::getSubregion(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_DEPTH), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), 2, textureInfo.valueMin, textureInfo.valueMax); 2380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(reference.getFormat().order)) 2384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachment.getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 2386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clear(tcu::getSubregion(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_STENCIL), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), *renderPassClearValues[attachmentIndex]); 2387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (attachment.getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 2388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(reference.getFormat()); 2390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::fillWithGrid(tcu::getSubregion(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_STENCIL), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), 2, textureInfo.valueMin, textureInfo.valueMax); 2392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentUsed[attachmentIndex] = true; 2397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t colorClearNdx = 0; colorClearNdx < renderInfo.getColorClears().size(); colorClearNdx++) 2400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const ColorClear& colorClear = renderInfo.getColorClears()[colorClearNdx]; 2402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 offset = colorClear.getOffset(); 2403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 size = colorClear.getSize(); 2404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel& reference = referenceAttachments[subpass.getColorAttachments()[colorClearNdx].getAttachment()]; 2405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkClearValue value; 2406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color = colorClear.getColor(); 2408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clear(tcu::getSubregion(reference.getAccess(), offset.x(), offset.y(), 0, size.x(), size.y(), 1), value); 2410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.getDepthStencilClear()) 2413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DepthStencilClear& dsClear = *renderInfo.getDepthStencilClear(); 2415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 offset = dsClear.getOffset(); 2416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 size = dsClear.getSize(); 2417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel& reference = referenceAttachments[subpass.getDepthStencilAttachment().getAttachment()]; 2418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(reference.getFormat().order)) 2420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearDepth(tcu::getSubregion(reference.getAccess(), offset.x(), offset.y(), 0, size.x(), size.y(), 1), dsClear.getDepth()); 2421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(reference.getFormat().order)) 2423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearStencil(tcu::getSubregion(reference.getAccess(), offset.x(), offset.y(), 0, size.x(), size.y(), 1), dsClear.getStencil()); 2424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.getRenderQuad()) 2427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderQuad& renderQuad = *renderInfo.getRenderQuad(); 2429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 posA = renderQuad.getCornerA(); 2430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 posB = renderQuad.getCornerB(); 2431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec2 origin = Vec2((float)renderInfo.getViewportOffset().x(), (float)renderInfo.getViewportOffset().y()) + Vec2((float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y()) / Vec2(2.0f); 2432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec2 p = Vec2((float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y()) / Vec2(2.0f); 2433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2 posAI ((deInt32)(origin.x() + (p.x() * posA.x())), 2434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (deInt32)(origin.y() + (p.y() * posA.y()))); 2435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2 posBI ((deInt32)(origin.x() + (p.x() * posB.x())), 2436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (deInt32)(origin.y() + (p.y() * posB.y()))); 2437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentRefNdx = 0; attachmentRefNdx < subpass.getColorAttachments().size(); attachmentRefNdx++) 2439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachment = renderPassInfo.getAttachments()[subpass.getColorAttachments()[attachmentRefNdx].getAttachment()]; 2441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(mapVkFormat(attachment.getFormat())); 2442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel& referenceTexture = referenceAttachments[subpass.getColorAttachments()[attachmentRefNdx].getAttachment()]; 2443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool srgb = tcu::isSRGB(referenceTexture.getFormat()); 2444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const PixelBufferAccess reference = referenceTexture.getAccess(); 2445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clampMin = (float)(-MAX_INTEGER_VALUE); 2446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clampMax = (float)(MAX_INTEGER_VALUE); 2447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 valueMax (de::clamp(textureInfo.valueMax[0], clampMin, clampMax), 2448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMax[1], clampMin, clampMax), 2449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMax[2], clampMin, clampMax), 2450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMax[3], clampMin, clampMax)); 2451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 valueMin (de::clamp(textureInfo.valueMin[0], clampMin, clampMax), 2453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMin[1], clampMin, clampMax), 2454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMin[2], clampMin, clampMax), 2455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMin[3], clampMin, clampMax)); 2456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(posAI.x() < posBI.x()); 2458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(posAI.y() < posBI.y()); 2459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = posAI.y(); y <= (int)posBI.y(); y++) 2461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = posAI.x(); x <= (int)posBI.x(); x++) 2462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 uvs = computeUvs(posAI, posBI, IVec2(x, y)); 2464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 color = valueMax * uvs + valueMin * (Vec4(1.0f) - uvs); 2465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (srgb) 2467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi reference.setPixel(tcu::linearToSRGB(color), x, y); 2468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi reference.setPixel(color, x, y); 2470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 2474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel& referenceTexture = referenceAttachments[subpass.getDepthStencilAttachment().getAttachment()]; 2476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const PixelBufferAccess reference = referenceTexture.getAccess(); 2477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(posAI.x() < posBI.x()); 2479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(posAI.y() < posBI.y()); 2480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = posAI.y(); y <= (int)posBI.y(); y++) 2482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = posAI.x(); x <= (int)posBI.x(); x++) 2483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 uvs = computeUvs(posAI, posBI, IVec2(x, y)); 2485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(reference.getFormat().order)) 2487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi reference.setPixDepth(uvs.x(), x, y); 2488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(reference.getFormat().order)) 2490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi reference.setPixStencil(STENCIL_VALUE, x, y); 2491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2494c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Mark all attachments that were used but not stored as undefined 2497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 2498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachment = renderPassInfo.getAttachments()[attachmentNdx]; 2500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 2501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(format); 2502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel& reference = referenceAttachments[attachmentNdx]; 2503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachmentUsed[attachmentNdx] && renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE) 2505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::fillWithGrid(tcu::getSubregion(reference.getAccess(), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), 2, textureInfo.valueMin, textureInfo.valueMax); 2506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2509c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMaybe<deUint32> findColorAttachment (const Subpass& subpass, 2510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 attachmentIndex) 2511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t colorAttachmentNdx = 0; colorAttachmentNdx < subpass.getColorAttachments().size(); colorAttachmentNdx++) 2513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpass.getColorAttachments()[colorAttachmentNdx].getAttachment() == attachmentIndex) 2515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return tcu::just((deUint32)colorAttachmentNdx); 2516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return tcu::nothing<deUint32>(); 2519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviint calcFloatDiff (float a, float b) 2522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 au = tcu::Float32(a).bits(); 2524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 bu = tcu::Float32(b).bits(); 2525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool asign = (au & (0x1u << 31u)) != 0u; 2527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool bsign = (bu & (0x1u << 31u)) != 0u; 2528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2529c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 avalue = (au & ((0x1u << 31u) - 1u)); 2530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 bvalue = (bu & ((0x1u << 31u) - 1u)); 2531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (asign != bsign) 2533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return avalue + bvalue + 1u; 2534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (avalue < bvalue) 2535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return bvalue - avalue; 2536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return avalue - bvalue; 2538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool comparePixelToDepthClearValue (const ConstPixelBufferAccess& access, 2541c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi int x, 2542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi int y, 2543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi float ref) 2544c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = tcu::getEffectiveDepthStencilTextureFormat(access.getFormat(), tcu::Sampler::MODE_DEPTH); 2546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 2547c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2548c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (channelClass) 2549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2550c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 2551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 2552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const int bitDepth = tcu::getTextureFormatBitDepth(format).x(); 2554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float depth = access.getPixDepth(x, y); 2555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float threshold = 2.0f / (float)((1 << bitDepth) - 1); 2556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return deFloatAbs(depth - ref) <= threshold; 2558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 2561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float depth = access.getPixDepth(x, y); 2563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const int mantissaBits = tcu::getTextureFormatMantissaBitDepth(format).x(); 2564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const int threshold = 10 * 1 << (23 - mantissaBits); 2565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(mantissaBits <= 23); 2567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return calcFloatDiff(depth, ref) <= threshold; 2569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 2572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Invalid channel class"); 2573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return false; 2574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool comparePixelToStencilClearValue (const ConstPixelBufferAccess& access, 2578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi int x, 2579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi int y, 2580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 ref) 2581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 stencil = access.getPixStencil(x, y); 2583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return stencil == ref; 2585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool comparePixelToColorClearValue (const ConstPixelBufferAccess& access, 2588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi int x, 2589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi int y, 2590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearColorValue& ref) 2591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = access.getFormat(); 2593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 2594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const BVec4 channelMask = tcu::getTextureFormatChannelMask(format); 2595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (channelClass) 2597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 2599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 2600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 bitDepth (tcu::getTextureFormatBitDepth(format)); 2602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 resColor (access.getPixel(x, y)); 2603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 refColor (ref.float32[0], 2604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.float32[1], 2605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.float32[2], 2606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.float32[3]); 2607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 threshold (bitDepth[0] > 0 ? 20.0f / (float)((1 << bitDepth[0]) - 1) : 1.0f, 2608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bitDepth[1] > 0 ? 20.0f / (float)((1 << bitDepth[1]) - 1) : 1.0f, 2609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bitDepth[2] > 0 ? 20.0f / (float)((1 << bitDepth[2]) - 1) : 1.0f, 2610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bitDepth[3] > 0 ? 20.0f / (float)((1 << bitDepth[3]) - 1) : 1.0f); 2611c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::isSRGB(access.getFormat())) 2613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return !(tcu::anyNotEqual(tcu::logicalAnd(lessThanEqual(tcu::absDiff(resColor, tcu::linearToSRGB(refColor)), threshold), channelMask), channelMask)); 2614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return !(tcu::anyNotEqual(tcu::logicalAnd(lessThanEqual(tcu::absDiff(resColor, refColor), threshold), channelMask), channelMask)); 2616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 2619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec4 resColor (access.getPixelUint(x, y)); 2621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec4 refColor (ref.uint32[0], 2622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.uint32[1], 2623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.uint32[2], 2624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.uint32[3]); 2625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec4 threshold (1); 2626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return !(tcu::anyNotEqual(tcu::logicalAnd(lessThanEqual(tcu::absDiff(resColor, refColor), threshold), channelMask), channelMask)); 2628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2630c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 2631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 resColor (access.getPixelInt(x, y)); 2633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 refColor (ref.int32[0], 2634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.int32[1], 2635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.int32[2], 2636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.int32[3]); 2637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 threshold (1); 2638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return !(tcu::anyNotEqual(tcu::logicalAnd(lessThanEqual(tcu::absDiff(resColor, refColor), threshold), channelMask), channelMask)); 2640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 2643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 resColor (access.getPixel(x, y)); 2645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 refColor (ref.float32[0], 2646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.float32[1], 2647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.float32[2], 2648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.float32[3]); 2649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 mantissaBits (tcu::getTextureFormatMantissaBitDepth(format)); 2650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 threshold (10 * IVec4(1) << (23 - mantissaBits)); 2651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(tcu::allEqual(greaterThanEqual(threshold, IVec4(0)), BVec4(true))); 2653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int ndx = 0; ndx < 4; ndx++) 2655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (calcFloatDiff(resColor[ndx], refColor[ndx]) > threshold[ndx] && channelMask[ndx]) 2657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return false; 2658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return true; 2661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 2664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Invalid channel class"); 2665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return false; 2666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2668c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass PixelStatus 2670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 2672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi enum Status 2673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi STATUS_UNDEFINED = 0, 2675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi STATUS_OK = 1, 2676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi STATUS_FAIL = 2, 2677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi STATUS_LAST 2679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus (Status color, Status depth, Status stencil) 2682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_status ((deUint8)(color << COLOR_OFFSET) 2683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | (deUint8)((deUint8)depth << DEPTH_OFFSET) 2684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | (deUint8)((deUint8)stencil << STENCIL_OFFSET)) 2685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2687c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Status getColorStatus (void) const { return (Status)((m_status & COLOR_MASK) >> COLOR_OFFSET); } 2689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Status getDepthStatus (void) const { return (Status)((m_status & DEPTH_MASK) >> DEPTH_OFFSET); } 2690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Status getStencilStatus (void) const { return (Status)((m_status & STENCIL_MASK) >> STENCIL_OFFSET); } 2691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void setColorStatus (Status status) 2693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(getColorStatus() == STATUS_UNDEFINED); 2695682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos m_status |= (deUint8)(status << COLOR_OFFSET); 2696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void setDepthStatus (Status status) 2699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(getDepthStatus() == STATUS_UNDEFINED); 2701682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos m_status |= (deUint8)(status << DEPTH_OFFSET); 2702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void setStencilStatus (Status status) 2705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(getStencilStatus() == STATUS_UNDEFINED); 2707682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos m_status |= (deUint8)(status << STENCIL_OFFSET); 2708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 2711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi enum 2712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi COLOR_OFFSET = 0, 2714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DEPTH_OFFSET = 2, 2715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi STENCIL_OFFSET = 4, 2716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi COLOR_MASK = (3<<COLOR_OFFSET), 2718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DEPTH_MASK = (3<<DEPTH_OFFSET), 2719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi STENCIL_MASK = (3<<STENCIL_OFFSET), 2720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint8 m_status; 2722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 2723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkDepthRenderQuad (const ConstPixelBufferAccess& result, 2725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2& posA, 2726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2& posB, 2727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<PixelStatus>& status) 2728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = posA.y(); y <= posB.y(); y++) 2730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = posA.x(); x <= posB.x(); x++) 2731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 2733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getDepthStatus() == PixelStatus::STATUS_UNDEFINED) 2735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 minUvs = computeUvs(posA, posB, IVec2(x-1, y-1)); 2737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 maxUvs = computeUvs(posA, posB, IVec2(x+1, y+1)); 2738c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool softCheck = std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1 2739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1; 2740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float resDepth = result.getPixDepth(x, y); 2741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (resDepth >= minUvs.x() && resDepth <= maxUvs.x()) 2743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setDepthStatus(PixelStatus::STATUS_OK); 2744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (!softCheck) 2745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setDepthStatus(PixelStatus::STATUS_FAIL); 2746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2747c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2750c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkStencilRenderQuad (const ConstPixelBufferAccess& result, 2751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2& posA, 2752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2& posB, 2753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<PixelStatus>& status) 2754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = posA.y(); y <= posB.y(); y++) 2756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = posA.x(); x <= posB.x(); x++) 2757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2758c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 2759c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getStencilStatus() == PixelStatus::STATUS_UNDEFINED) 2761c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool softCheck = std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1 2763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1; 2764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (result.getPixStencil(x, y) == STENCIL_VALUE) 2766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setStencilStatus(PixelStatus::STATUS_OK); 2767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (!softCheck) 2768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setStencilStatus(PixelStatus::STATUS_FAIL); 2769c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2772c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkColorRenderQuad (const ConstPixelBufferAccess& result, 2774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2& posA, 2775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2& posB, 2776c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<PixelStatus>& status) 2777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat& format = result.getFormat(); 2779c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool srgb = tcu::isSRGB(format); 2780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 2781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(format); 2782c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clampMin = (float)(-MAX_INTEGER_VALUE); 2783c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clampMax = (float)(MAX_INTEGER_VALUE); 2784c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 valueMax (de::clamp(textureInfo.valueMax[0], clampMin, clampMax), 2785c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMax[1], clampMin, clampMax), 2786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMax[2], clampMin, clampMax), 2787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMax[3], clampMin, clampMax)); 2788c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2789c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 valueMin (de::clamp(textureInfo.valueMin[0], clampMin, clampMax), 2790c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMin[1], clampMin, clampMax), 2791c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMin[2], clampMin, clampMax), 2792c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMin[3], clampMin, clampMax)); 2793c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const BVec4 channelMask = tcu::getTextureFormatChannelMask(format); 2794c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2795d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz IVec4 formatBitDepths = tcu::getTextureFormatBitDepth(format); 2796d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz Vec4 threshold = Vec4(1.0f) / Vec4((float)(1 << formatBitDepths.x()), 2797d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz (float)(1 << formatBitDepths.y()), 2798d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz (float)(1 << formatBitDepths.z()), 2799d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz (float)(1 << formatBitDepths.w())); 2800d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz 2801c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (channelClass) 2802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 2804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 2805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 2806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = posA.y(); y <= posB.y(); y++) 2808c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = posA.x(); x <= posB.x(); x++) 2809c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 2811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED) 2813c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 minUvs = computeUvs(posA, posB, IVec2(x-1, y-1)); 2815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 maxUvs = computeUvs(posA, posB, IVec2(x+1, y+1)); 2816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool softCheck = std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1 2817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1; 2818c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2819c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 resColor (result.getPixel(x, y)); 2820c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 minRefColor = srgb ? tcu::linearToSRGB(valueMax * minUvs + valueMin * (Vec4(1.0f) - minUvs)) 2822d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz : valueMax * minUvs + valueMin * (Vec4(1.0f) - minUvs) - threshold; 2823c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 maxRefColor = srgb ? tcu::linearToSRGB(valueMax * maxUvs + valueMin * (Vec4(1.0f) - maxUvs)) 2824d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz : valueMax * maxUvs + valueMin * (Vec4(1.0f) - maxUvs) + threshold; 2825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2826c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[0] <= maxRefColor[0]); 2827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[1] <= maxRefColor[1]); 2828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[2] <= maxRefColor[2]); 2829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[3] <= maxRefColor[3]); 2830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::anyNotEqual(tcu::logicalAnd( 2832c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::logicalAnd(greaterThanEqual(resColor, minRefColor), 2833c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lessThanEqual(resColor, maxRefColor)), 2834c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi channelMask), channelMask)) 2835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!softCheck) 2837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_FAIL); 2838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_OK); 2841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 2845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 2848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = posA.y(); y <= posB.y(); y++) 2850c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = posA.x(); x <= posB.x(); x++) 2851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 2853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED) 2855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2856c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 minUvs = computeUvs(posA, posB, IVec2(x-1, y-1)); 2857c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 maxUvs = computeUvs(posA, posB, IVec2(x+1, y+1)); 2858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool softCheck = std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1 2859c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1; 2860c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2861c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec4 resColor (result.getPixelUint(x, y)); 2862c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2863c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 minRefColorF = valueMax * minUvs + valueMin * (Vec4(1.0f) - minUvs); 2864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 maxRefColorF = valueMax * maxUvs + valueMin * (Vec4(1.0f) - maxUvs); 2865c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec4 minRefColor (minRefColorF.asUint()); 2867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec4 maxRefColor (maxRefColorF.asUint()); 2868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[0] <= maxRefColor[0]); 2870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[1] <= maxRefColor[1]); 2871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[2] <= maxRefColor[2]); 2872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[3] <= maxRefColor[3]); 2873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::anyNotEqual(tcu::logicalAnd( 2875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::logicalAnd(greaterThanEqual(resColor, minRefColor), 2876c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lessThanEqual(resColor, maxRefColor)), 2877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi channelMask), channelMask)) 2878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2879c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!softCheck) 2880c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_FAIL); 2881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_OK); 2884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 2888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 2891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = posA.y(); y <= posB.y(); y++) 2893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = posA.x(); x <= posB.x(); x++) 2894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 2896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED) 2898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 minUvs = computeUvs(posA, posB, IVec2(x-1, y-1)); 2900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 maxUvs = computeUvs(posA, posB, IVec2(x+1, y+1)); 2901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool softCheck = std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1 2902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1; 2903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 resColor (result.getPixelInt(x, y)); 2905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 minRefColorF = valueMax * minUvs + valueMin * (Vec4(1.0f) - minUvs); 2907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 maxRefColorF = valueMax * maxUvs + valueMin * (Vec4(1.0f) - maxUvs); 2908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 minRefColor (minRefColorF.asInt()); 2910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 maxRefColor (maxRefColorF.asInt()); 2911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[0] <= maxRefColor[0]); 2913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[1] <= maxRefColor[1]); 2914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[2] <= maxRefColor[2]); 2915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[3] <= maxRefColor[3]); 2916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::anyNotEqual(tcu::logicalAnd( 2918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::logicalAnd(greaterThanEqual(resColor, minRefColor), 2919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lessThanEqual(resColor, maxRefColor)), 2920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi channelMask), channelMask)) 2921c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2922c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!softCheck) 2923c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_FAIL); 2924c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2925c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2926c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_OK); 2927c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2928c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2929c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2930c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 2931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2932c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2933c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 2934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Invalid channel class"); 2935c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2938c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkColorClear (const ConstPixelBufferAccess& result, 2939c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& offset, 2940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 2941c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<PixelStatus>& status, 2942c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearColorValue& color) 2943c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2944c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(offset.x() + size.x() <= (deUint32)result.getWidth()); 2945c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(offset.y() + size.y() <= (deUint32)result.getHeight()); 2946c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2947c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(result.getWidth() * result.getHeight() == (int)status.size()); 2948c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = offset.y(); y < (int)(offset.y() + size.y()); y++) 2950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = offset.x(); x < (int)(offset.x() + size.x()); x++) 2951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 2953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(x + y * result.getWidth() < (int)status.size()); 2955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2956c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED) 2957c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (comparePixelToColorClearValue(result, x, y, color)) 2959c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_OK); 2960c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2961c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_FAIL); 2962c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2963c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2964c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2965c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2966c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkDepthClear (const ConstPixelBufferAccess& result, 2967c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& offset, 2968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 2969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<PixelStatus>& status, 2970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi float depth) 2971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = offset.y(); y < (int)(offset.y() + size.y()); y++) 2973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = offset.x(); x < (int)(offset.x() + size.x()); x++) 2974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 2976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getDepthStatus() == PixelStatus::STATUS_UNDEFINED) 2978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (comparePixelToDepthClearValue(result, x, y, depth)) 2980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setDepthStatus(PixelStatus::STATUS_OK); 2981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setDepthStatus(PixelStatus::STATUS_FAIL); 2983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2986c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2987c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkStencilClear (const ConstPixelBufferAccess& result, 2988c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& offset, 2989c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 2990c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<PixelStatus>& status, 2991c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 stencil) 2992c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = offset.y(); y < (int)(offset.y() + size.y()); y++) 2994c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = offset.x(); x < (int)(offset.x() + size.x()); x++) 2995c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 2997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2998c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getStencilStatus() == PixelStatus::STATUS_UNDEFINED) 2999c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (comparePixelToStencilClearValue(result, x, y, stencil)) 3001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setStencilStatus(PixelStatus::STATUS_OK); 3002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3003c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setStencilStatus(PixelStatus::STATUS_FAIL); 3004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool verifyAttachment (const ConstPixelBufferAccess& result, 3009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<ConstPixelBufferAccess>& secondaryResult, 3010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPassInfo, 3011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<VkClearValue>& renderPassClearValue, 3012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<VkClearValue>& imageClearValue, 3013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses, 3014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassRenderInfo>& subpassRenderInfo, 3015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const PixelBufferAccess& errorImage, 3016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 attachmentIndex, 3017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderPos, 3018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderSize) 3019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat& format = result.getFormat(); 3021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool hasDepth = tcu::hasDepthComponent(format.order); 3022c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool hasStencil = tcu::hasStencilComponent(format.order); 3023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool isColorFormat = !hasDepth && !hasStencil; 3024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const PixelStatus initialStatus (isColorFormat ? PixelStatus::STATUS_UNDEFINED : PixelStatus::STATUS_OK, 3025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi hasDepth ? PixelStatus::STATUS_UNDEFINED : PixelStatus::STATUS_OK, 3026c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi hasStencil ? PixelStatus::STATUS_UNDEFINED : PixelStatus::STATUS_OK); 3027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool attachmentIsUsed = false; 3029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<PixelStatus> status (result.getWidth() * result.getHeight(), initialStatus); 3030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::clear(errorImage, Vec4(0.0f, 1.0f, 0.0f, 1.0f)); 3031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Check if attachment is used 3033c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int subpassNdx = 0; subpassNdx < (int)subpasses.size(); subpassNdx++) 3034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = subpasses[subpassNdx]; 3036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<deUint32> attachmentNdx = findColorAttachment(subpass, attachmentIndex); 3037c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachmentNdx || subpass.getDepthStencilAttachment().getAttachment() == attachmentIndex) 3039c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentIsUsed = true; 3040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Set all pixels that have undefined values to OK 3043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachmentIsUsed && (((isColorFormat || hasDepth) && renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE) 3044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE))) 3045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3046c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for(int y = renderPos.y(); y < (int)(renderPos.y() + renderSize.y()); y++) 3047c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for(int x = renderPos.x(); x < (int)(renderPos.x() + renderSize.x()); x++) 3048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3049c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 3050c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3051c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isColorFormat && renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE) 3052c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_OK); 3053c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth && renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE) 3056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setDepthStatus(PixelStatus::STATUS_OK); 3057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3058c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE) 3059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setStencilStatus(PixelStatus::STATUS_OK); 3060c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3063c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Check renderpass rendering results 3065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE 3066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE)) 3067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Check subpass rendering results 3069c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int subpassNdx = (int)subpasses.size() - 1; subpassNdx >= 0; subpassNdx--) 3070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3071c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = subpasses[subpassNdx]; 3072c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassRenderInfo& renderInfo = subpassRenderInfo[subpassNdx]; 3073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<deUint32> attachmentNdx = findColorAttachment(subpass, attachmentIndex); 3074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Check rendered quad 3076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.getRenderQuad() && (attachmentNdx || subpass.getDepthStencilAttachment().getAttachment() == attachmentIndex)) 3077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3078c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderQuad& renderQuad = *renderInfo.getRenderQuad(); 3079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 posA = renderQuad.getCornerA(); 3080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 posB = renderQuad.getCornerB(); 3081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec2 origin = Vec2((float)renderInfo.getViewportOffset().x(), (float)renderInfo.getViewportOffset().y()) + Vec2((float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y()) / Vec2(2.0f); 3082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec2 p = Vec2((float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y()) / Vec2(2.0f); 3083c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2 posAI ((deInt32)(origin.x() + (p.x() * posA.x())), 3084c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (deInt32)(origin.y() + (p.y() * posA.y()))); 3085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2 posBI ((deInt32)(origin.x() + (p.x() * posB.x())), 3086c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (deInt32)(origin.y() + (p.y() * posB.y()))); 3087c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isColorFormat) 3089c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkColorRenderQuad(result, posAI, posBI, status); 3090c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3091c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3092c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth) 3093c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkDepthRenderQuad(result, posAI, posBI, status); 3094c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3095c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth && hasStencil) 3096c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkStencilRenderQuad(*secondaryResult, posAI, posBI, status); 3097c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (hasStencil) 3098c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkStencilRenderQuad(result, posAI, posBI, status); 3099c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3100c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3102c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Check color attachment clears 3103c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachmentNdx && !renderInfo.getColorClears().empty()) 3104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const ColorClear& clear = renderInfo.getColorClears()[*attachmentNdx]; 3106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkColorClear(result, clear.getOffset(), clear.getSize(), status, clear.getColor()); 3108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Check depth/stencil attachment clears 3111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() == attachmentIndex && renderInfo.getDepthStencilClear()) 3112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DepthStencilClear clear = *renderInfo.getDepthStencilClear(); 3114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth) 3116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkDepthClear(result, clear.getOffset(), clear.getSize(), status, clear.getDepth()); 3117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth && hasStencil) 3119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkStencilClear(*secondaryResult, clear.getOffset(), clear.getSize(), status, clear.getStencil()); 3120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (hasStencil) 3121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkStencilClear(result, clear.getOffset(), clear.getSize(), status, clear.getStencil()); 3122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Check renderpas clear results 3126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachmentIsUsed && renderPassClearValue) 3127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isColorFormat) 3129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 3131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkColorClear(result, renderPos, renderSize, status, renderPassClearValue->color); 3132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth && renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 3136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkDepthClear(result, renderPos, renderSize, status, renderPassClearValue->depthStencil.depth); 3137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth && hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 3139c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkStencilClear(*secondaryResult, renderPos, renderSize, status, renderPassClearValue->depthStencil.stencil); 3140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 3141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkStencilClear(result, renderPos, renderSize, status, renderPassClearValue->depthStencil.stencil); 3142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Set all pixels that have undefined values fater renderpass to OK 3147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachmentIsUsed && (((isColorFormat || hasDepth) && renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 3148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE))) 3149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for(int y = renderPos.y(); y < (int)(renderPos.y() + renderSize.y()); y++) 3151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for(int x = renderPos.x(); x < (int)(renderPos.x() + renderSize.x()); x++) 3152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 3154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED 3156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && isColorFormat && renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 3157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_OK); 3158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getDepthStatus() == PixelStatus::STATUS_UNDEFINED 3161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && hasDepth && renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 3162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setDepthStatus(PixelStatus::STATUS_OK); 3163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getStencilStatus() == PixelStatus::STATUS_UNDEFINED 3165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 3166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setStencilStatus(PixelStatus::STATUS_OK); 3167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (imageClearValue) 3172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isColorFormat) 3174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkColorClear(result, UVec2(0, 0), UVec2(result.getWidth(), result.getHeight()), status, imageClearValue->color); 3175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth) 3178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkDepthClear(result, UVec2(0, 0), UVec2(result.getWidth(), result.getHeight()), status, imageClearValue->depthStencil.depth); 3179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth && hasStencil) 3181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkStencilClear(*secondaryResult, UVec2(0, 0), UVec2(secondaryResult->getWidth(), result.getHeight()), status, imageClearValue->depthStencil.stencil); 3182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (hasStencil) 3183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkStencilClear(result, UVec2(0, 0), UVec2(result.getWidth(), result.getHeight()), status, imageClearValue->depthStencil.stencil); 3184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool isOk = true; 3189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for(int y = 0; y < result.getHeight(); y++) 3191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for(int x = 0; x < result.getWidth(); x++) 3192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 3194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isColorFormat) 3196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getColorStatus() != PixelStatus::STATUS_OK) 3198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED) 3200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi errorImage.setPixel(Vec4(1.0f, 1.0f, 0.0f, 1.0f), x, y); 3201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (pixelStatus.getColorStatus() == PixelStatus::STATUS_FAIL) 3202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi errorImage.setPixel(Vec4(1.0f, 0.0f, 0.0f, 1.0f), x, y); 3203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi isOk = false; 3205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth && pixelStatus.getDepthStatus() != PixelStatus::STATUS_OK) 3210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi errorImage.setPixel(Vec4(1.0f, 0.0f, 0.0f, 1.0f), x, y); 3212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi isOk = false; 3213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasStencil && pixelStatus.getStencilStatus() != PixelStatus::STATUS_OK) 3216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi errorImage.setPixel(Vec4(1.0f, 0.0f, 0.0f, 1.0f), x, y); 3218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi isOk = false; 3219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return isOk; 3224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool logAndVerifyImages (TestLog& log, 3228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DeviceInterface& vk, 3229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 3230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<de::SharedPtr<AttachmentResources> >& attachmentResources, 3231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<bool>& attachmentIsLazy, 3232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPassInfo, 3233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& renderPassClearValues, 3234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& imageClearValues, 3235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassRenderInfo>& subpassRenderInfo, 3236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& targetSize, 3237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig& config) 3238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<tcu::TextureLevel> referenceAttachments; 3240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool isOk = true; 3241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Reference images fill undefined pixels with grid pattern." << TestLog::EndMessage; 3243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderReferenceImages(referenceAttachments, renderPassInfo, targetSize, imageClearValues, renderPassClearValues, subpassRenderInfo, config.renderPos, config.renderSize); 3245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 3247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!attachmentIsLazy[attachmentNdx]) 3249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3250c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachment = renderPassInfo.getAttachments()[attachmentNdx]; 3251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 3252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order) && tcu::hasStencilComponent(format.order)) 3254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3255bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz const tcu::TextureFormat depthFormat = getDepthCopyFormat(attachment.getFormat()); 3256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkDeviceSize depthBufferSize = targetSize.x() * targetSize.y() * depthFormat.getPixelSize(); 3257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void* const depthPtr = attachmentResources[attachmentNdx]->getResultMemory().getHostPtr(); 3258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3259bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz const tcu::TextureFormat stencilFormat = getStencilCopyFormat(attachment.getFormat()); 3260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkDeviceSize stencilBufferSize = targetSize.x() * targetSize.y() * stencilFormat.getPixelSize(); 3261a3e06bac8ee2c4ccac086f1bfc3c2e833d9f154fJeff Bolz void* const stencilPtr = attachmentResources[attachmentNdx]->getSecondaryResultMemory().getHostPtr(); 3262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkMappedMemoryRange ranges[] = 3264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // sType; 3267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 3268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getResultMemory().getMemory(), // mem; 3269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getResultMemory().getOffset(), // offset; 3270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi depthBufferSize // size; 3271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, 3272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // sType; 3274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 3275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getSecondaryResultMemory().getMemory(), // mem; 3276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getSecondaryResultMemory().getOffset(), // offset; 3277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stencilBufferSize // size; 3278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.invalidateMappedMemoryRanges(device, 2u, ranges)); 3281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3283bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz const ConstPixelBufferAccess depthAccess (depthFormat, targetSize.x(), targetSize.y(), 1, depthPtr); 3284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const ConstPixelBufferAccess stencilAccess (stencilFormat, targetSize.x(), targetSize.y(), 1, stencilPtr); 3285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel errorImage (tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y()); 3286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("Attachment" + de::toString(attachmentNdx) + "Depth", "Attachment " + de::toString(attachmentNdx) + " Depth", depthAccess); 3288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("Attachment" + de::toString(attachmentNdx) + "Stencil", "Attachment " + de::toString(attachmentNdx) + " Stencil", stencilAccess); 3289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess()); 3291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if ((renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE || renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE) 3293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && !verifyAttachment(depthAccess, tcu::just(stencilAccess), renderPassInfo, renderPassClearValues[attachmentNdx], imageClearValues[attachmentNdx], renderPassInfo.getSubpasses(), subpassRenderInfo, errorImage.getAccess(), (deUint32)attachmentNdx, config.renderPos, config.renderSize)) 3294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("AttachmentError" + de::toString(attachmentNdx), "Attachment Error " + de::toString(attachmentNdx), errorImage.getAccess()); 3296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi isOk = false; 3297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkDeviceSize bufferSize = targetSize.x() * targetSize.y() * format.getPixelSize(); 3303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void* const ptr = attachmentResources[attachmentNdx]->getResultMemory().getHostPtr(); 3304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkMappedMemoryRange range = 3306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // sType; 3308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 3309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getResultMemory().getMemory(), // mem; 3310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getResultMemory().getOffset(), // offset; 3311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bufferSize // size; 3312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.invalidateMappedMemoryRanges(device, 1u, &range)); 3314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const ConstPixelBufferAccess access (format, targetSize.x(), targetSize.y(), 1, ptr); 3317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel errorImage (tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y()); 3318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx), access); 3320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess()); 3321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if ((renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE || renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE) 3323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && !verifyAttachment(access, tcu::nothing<ConstPixelBufferAccess>(), renderPassInfo, renderPassClearValues[attachmentNdx], imageClearValues[attachmentNdx], renderPassInfo.getSubpasses(), subpassRenderInfo, errorImage.getAccess(), (deUint32)attachmentNdx, config.renderPos, config.renderSize)) 3324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("AttachmentError" + de::toString(attachmentNdx), "Attachment Error " + de::toString(attachmentNdx), errorImage.getAccess()); 3326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi isOk = false; 3327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return isOk; 3334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string getAttachmentType (VkFormat vkFormat) 3337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(vkFormat); 3339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 3340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (channelClass) 3342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 3344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return "ivec4"; 3345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 3347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return "uvec4"; 3348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 3350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 3351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 3352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return "vec4"; 3353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 3355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown channel class"); 3356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return ""; 3357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid createTestShaders (SourceCollections& dst, TestConfig config) 3361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (config.renderTypes & TestConfig::RENDERTYPES_DRAW) 3363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses = config.renderPass.getSubpasses(); 3365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++) 3367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = subpasses[subpassNdx]; 3369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi std::ostringstream vertexShader; 3370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi std::ostringstream fragmentShader; 3371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vertexShader << "#version 310 es\n" 3373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "layout(location = 0) in highp vec4 a_position;\n" 3374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "layout(location = 0) out highp vec2 v_color;\n" 3375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "void main (void) {\n" 3376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "\thighp float a = 0.5 + a_position.x;\n" 3377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "\thighp float b = 0.5 + a_position.y;\n" 3378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "\tv_color = vec2(a, b);\n" 3379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "\tgl_Position = a_position;\n" 3380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "}\n"; 3381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi fragmentShader << "#version 310 es\n" 3383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "layout(location = 0) in highp vec2 v_color;\n"; 3384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++) 3386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const std::string attachmentType = getAttachmentType(config.renderPass.getAttachments()[subpass.getColorAttachments()[attachmentNdx].getAttachment()].getFormat()); 3388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi fragmentShader << "layout(location = " << attachmentNdx << ") out highp " << attachmentType << " o_color" << attachmentNdx << ";\n"; 3389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi fragmentShader << "void main (void) {\n" 3392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "\thighp vec4 scale = vec4(v_color.x, v_color.y, v_color.x * v_color.y, (v_color.x + v_color.y) / 2.0);\n"; 3393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++) 3395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(config.renderPass.getAttachments()[subpass.getColorAttachments()[attachmentNdx].getAttachment()].getFormat()); 3397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo formatInfo = tcu::getTextureFormatInfo(format); 3398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clampMin = (float)(-MAX_INTEGER_VALUE); 3399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clampMax = (float)(MAX_INTEGER_VALUE); 3400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 valueMax (de::clamp(formatInfo.valueMax[0], clampMin, clampMax), 3401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(formatInfo.valueMax[1], clampMin, clampMax), 3402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(formatInfo.valueMax[2], clampMin, clampMax), 3403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(formatInfo.valueMax[3], clampMin, clampMax)); 3404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 valueMin (de::clamp(formatInfo.valueMin[0], clampMin, clampMax), 3406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(formatInfo.valueMin[1], clampMin, clampMax), 3407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(formatInfo.valueMin[2], clampMin, clampMax), 3408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(formatInfo.valueMin[3], clampMin, clampMax)); 3409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const std::string attachmentType = getAttachmentType(config.renderPass.getAttachments()[subpass.getColorAttachments()[attachmentNdx].getAttachment()].getFormat()); 3410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi fragmentShader << "\to_color" << attachmentNdx << " = " << attachmentType << "(vec4" << valueMin << " + vec4" << (valueMax - valueMin) << " * scale);\n"; 3412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi fragmentShader << "}\n"; 3415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dst.glslSources.add(de::toString(subpassNdx) + "-vert") << glu::VertexSource(vertexShader.str()); 3417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dst.glslSources.add(de::toString(subpassNdx) + "-frag") << glu::FragmentSource(fragmentShader.str()); 3418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeAttachmentIsLazy (vector<bool>& attachmentIsLazy, const vector<Attachment>& attachments, TestConfig::ImageMemory imageMemory) 3423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool lastAttachmentWasLazy = false; 3425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++) 3427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachments[attachmentNdx].getLoadOp() != VK_ATTACHMENT_LOAD_OP_LOAD 3429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && attachments[attachmentNdx].getStoreOp() != VK_ATTACHMENT_STORE_OP_STORE 3430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && attachments[attachmentNdx].getStencilLoadOp() != VK_ATTACHMENT_LOAD_OP_LOAD 3431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && attachments[attachmentNdx].getStencilStoreOp() != VK_ATTACHMENT_STORE_OP_STORE) 3432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (imageMemory == TestConfig::IMAGEMEMORY_LAZY || (imageMemory & TestConfig::IMAGEMEMORY_LAZY && !lastAttachmentWasLazy)) 3434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentIsLazy.push_back(true); 3436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lastAttachmentWasLazy = true; 3437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (imageMemory & TestConfig::IMAGEMEMORY_STRICT) 3439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentIsLazy.push_back(false); 3441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lastAttachmentWasLazy = false; 3442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown imageMemory"); 3445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentIsLazy.push_back(false); 3448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassIsSecondary (vector<bool>& subpassIsSecondary, const vector<Subpass>& subpasses, TestConfig::CommandBufferTypes commandBuffer) 3452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool lastSubpassWasSecondary = false; 3454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++) 3456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (commandBuffer == TestConfig::COMMANDBUFFERTYPES_SECONDARY || (commandBuffer & TestConfig::COMMANDBUFFERTYPES_SECONDARY && !lastSubpassWasSecondary)) 3458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpassIsSecondary.push_back(true); 3460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lastSubpassWasSecondary = true; 3461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (commandBuffer & TestConfig::COMMANDBUFFERTYPES_INLINE) 3463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpassIsSecondary.push_back(false); 3465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lastSubpassWasSecondary = false; 3466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown commandBuffer"); 3469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeImageClearValues (de::Random& rng, vector<Maybe<VkClearValue> >& clearValues, const vector<Attachment>& attachments, const vector<bool>& isLazy) 3473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++) 3475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!isLazy[attachmentNdx]) 3477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues.push_back(just(randomClearValue(attachments[attachmentNdx], rng))); 3478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues.push_back(nothing<VkClearValue>()); 3480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeRenderPassClearValues (de::Random& rng, vector<Maybe<VkClearValue> >& clearValues, const vector<Attachment>& attachments) 3484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++) 3486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachments[attachmentNdx].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR 3488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || attachments[attachmentNdx].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 3489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues.push_back(just(randomClearValue(attachments[attachmentNdx], rng))); 3491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues.push_back(nothing<VkClearValue>()); 3494c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassClearValues (de::Random& rng, vector<vector<VkClearColorValue> >& clearValues, const RenderPass& renderPass) 3498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues.resize(renderPass.getSubpasses().size()); 3500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < renderPass.getSubpasses().size(); subpassNdx++) 3502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = renderPass.getSubpasses()[subpassNdx]; 3504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& colorAttachments = subpass.getColorAttachments(); 3505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues[subpassNdx].resize(colorAttachments.size()); 3507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentRefNdx = 0; attachmentRefNdx < colorAttachments.size(); attachmentRefNdx++) 3509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& attachmentRef = colorAttachments[attachmentRefNdx]; 3511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = renderPass.getAttachments()[attachmentRef.getAttachment()]; 3512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues[subpassNdx][attachmentRefNdx] = randomColorClearValue(attachment, rng); 3514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid logSubpassRenderInfo (TestLog& log, 3519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassRenderInfo& info) 3520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Viewport, offset: " << info.getViewportOffset() << ", size: " << info.getViewportSize() << TestLog::EndMessage; 3522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (info.isSecondary()) 3524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Subpass uses secondary command buffers" << TestLog::EndMessage; 3525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Subpass uses inlined commands" << TestLog::EndMessage; 3527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (deUint32 attachmentNdx = 0; attachmentNdx < info.getColorClears().size(); attachmentNdx++) 3529c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const ColorClear& colorClear = info.getColorClears()[attachmentNdx]; 3531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Clearing color attachment " << attachmentNdx 3533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ". Offset: " << colorClear.getOffset() 3534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ", Size: " << colorClear.getSize() 3535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ", Color: " << clearColorToString(info.getColorAttachment(attachmentNdx).getFormat(), colorClear.getColor()) << TestLog::EndMessage; 3536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (info.getDepthStencilClear()) 3539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DepthStencilClear& depthStencilClear = *info.getDepthStencilClear(); 3541c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Clearing depth stencil attachment" 3543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ". Offset: " << depthStencilClear.getOffset() 3544c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ", Size: " << depthStencilClear.getSize() 3545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ", Depth: " << depthStencilClear.getDepth() 3546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ", Stencil: " << depthStencilClear.getStencil() << TestLog::EndMessage; 3547c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3548c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (info.getRenderQuad()) 3550c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderQuad& renderQuad = *info.getRenderQuad(); 3552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Rendering gradient quad to " << renderQuad.getCornerA() << " -> " << renderQuad.getCornerB() << TestLog::EndMessage; 3554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid logTestCaseInfo (TestLog& log, 3558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig& config, 3559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<bool>& attachmentIsLazy, 3560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& imageClearValues, 3561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& renderPassClearValues, 3562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassRenderInfo>& subpassRenderInfo) 3563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPass = config.renderPass; 3565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi logRenderPassInfo(log, renderPass); 3567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(attachmentIsLazy.size() == renderPass.getAttachments().size()); 3569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(imageClearValues.size() == renderPass.getAttachments().size()); 3570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(renderPassClearValues.size() == renderPass.getAttachments().size()); 3571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "TargetSize: " << config.targetSize << TestLog::EndMessage; 3573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Render area, Offset: " << config.renderPos << ", Size: " << config.renderSize << TestLog::EndMessage; 3574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentIsLazy.size(); attachmentNdx++) 3576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection section (log, "Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx)); 3578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachmentIsLazy[attachmentNdx]) 3580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Is lazy." << TestLog::EndMessage; 3581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (imageClearValues[attachmentNdx]) 3583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Image is cleared to " << clearValueToString(renderPass.getAttachments()[attachmentNdx].getFormat(), *imageClearValues[attachmentNdx]) << " before rendering." << TestLog::EndMessage; 3584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderPass.getAttachments()[attachmentNdx].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR && renderPassClearValues[attachmentNdx]) 3586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Attachment is cleared to " << clearValueToString(renderPass.getAttachments()[attachmentNdx].getFormat(), *renderPassClearValues[attachmentNdx]) << " in the beginning of the render pass." << TestLog::EndMessage; 3587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < renderPass.getSubpasses().size(); subpassNdx++) 3590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection section (log, "Subpass" + de::toString(subpassNdx), "Subpass " + de::toString(subpassNdx)); 3592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi logSubpassRenderInfo(log, subpassRenderInfo[subpassNdx]); 3594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassRenderInfo (vector<SubpassRenderInfo>& renderInfos, de::Random& rng, const RenderPass& renderPass, const TestConfig& config) 3598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::CommandBufferTypes commandBuffer = config.commandBufferTypes; 3600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses = renderPass.getSubpasses(); 3601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool lastSubpassWasSecondary = false; 3602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (deUint32 subpassNdx = 0; subpassNdx < (deUint32)subpasses.size(); subpassNdx++) 3604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = subpasses[subpassNdx]; 3606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool subpassIsSecondary = commandBuffer == TestConfig::COMMANDBUFFERTYPES_SECONDARY 3607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || (commandBuffer & TestConfig::COMMANDBUFFERTYPES_SECONDARY && !lastSubpassWasSecondary) ? true : false; 3608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 viewportSize ((config.renderSize * UVec2(2)) / UVec2(3)); 3609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 viewportOffset (config.renderPos.x() + (subpassNdx % 2) * (config.renderSize.x() / 3), 3610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi config.renderPos.y() + ((subpassNdx / 2) % 2) * (config.renderSize.y() / 3)); 3611c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<ColorClear> colorClears; 3613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<DepthStencilClear> depthStencilClear; 3614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<RenderQuad> renderQuad; 3615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lastSubpassWasSecondary = subpassIsSecondary; 3617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (config.renderTypes & TestConfig::RENDERTYPES_CLEAR) 3619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& colorAttachments = subpass.getColorAttachments(); 3621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentRefNdx = 0; attachmentRefNdx < colorAttachments.size(); attachmentRefNdx++) 3623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& attachmentRef = colorAttachments[attachmentRefNdx]; 3625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = renderPass.getAttachments()[attachmentRef.getAttachment()]; 3626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 size ((viewportSize * UVec2(2)) / UVec2(3)); 3627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 offset (viewportOffset.x() + ((deUint32)attachmentRefNdx % 2u) * (viewportSize.x() / 3u), 3628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi viewportOffset.y() + (((deUint32)attachmentRefNdx / 2u) % 2u) * (viewportSize.y() / 3u)); 3629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearColorValue color = randomColorClearValue(attachment, rng); 3630c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorClears.push_back(ColorClear(offset, size, color)); 3632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 3635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = renderPass.getAttachments()[subpass.getDepthStencilAttachment().getAttachment()]; 3637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 size ((viewportSize * UVec2(2)) / UVec2(3)); 3638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 offset (viewportOffset.x() + ((deUint32)colorAttachments.size() % 2u) * (viewportSize.x() / 3u), 3639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi viewportOffset.y() + (((deUint32)colorAttachments.size() / 2u) % 2u) * (viewportSize.y() / 3u)); 3640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearValue value = randomClearValue(attachment, rng); 3641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi depthStencilClear = tcu::just(DepthStencilClear(offset, size, value.depthStencil.depth, value.depthStencil.stencil)); 3643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (config.renderTypes & TestConfig::RENDERTYPES_DRAW) 3647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderQuad = tcu::just(RenderQuad(tcu::Vec4(-0.5f, -0.5f, 0.0f, 1.0f), tcu::Vec4(0.5f, 0.5f, 1.0f, 1.0f))); 3648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderInfos.push_back(SubpassRenderInfo(renderPass, subpassNdx, subpassIsSecondary, viewportOffset, viewportSize, renderQuad, colorClears, depthStencilClear)); 3650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkTextureFormatSupport (TestLog& log, 3654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const InstanceInterface& vk, 3655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPhysicalDevice device, 3656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment>& attachments) 3657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool supported = true; 3659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++) 3661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = attachments[attachmentNdx]; 3663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 3664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool isDepthOrStencilAttachment = hasDepthComponent(format.order) || hasStencilComponent(format.order); 3665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkFormatFeatureFlags flags = isDepthOrStencilAttachment? VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT : VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT; 3666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkFormatProperties properties; 3667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 366868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.getPhysicalDeviceFormatProperties(device, attachment.getFormat(), &properties); 3669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if ((properties.optimalTilingFeatures & flags) != flags) 3671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi supported = false; 3673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Format: " << attachment.getFormat() << " not supported as " << (isDepthOrStencilAttachment ? "depth stencil attachment" : "color attachment") << TestLog::EndMessage; 3674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!supported) 3678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TCU_THROW(NotSupportedError, "Format not supported"); 3679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvitcu::TestStatus renderPassTest (Context& context, TestConfig config) 3682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSize = config.targetSize; 3684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPos = config.renderPos; 3685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSize = config.renderSize; 3686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPassInfo = config.renderPass; 3687c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestLog& log = context.getTestContext().getLog(); 3689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::Random rng (config.seed); 3690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<bool> attachmentIsLazy; 3692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Maybe<VkClearValue> > imageClearValues; 3693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Maybe<VkClearValue> > renderPassClearValues; 3694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<bool> subpassIsSecondary; 3696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassRenderInfo> subpassRenderInfo; 3697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<vector<VkClearColorValue> > subpassColorClearValues; 3698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeAttachmentIsLazy(attachmentIsLazy, renderPassInfo.getAttachments(), config.imageMemory); 3700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeImageClearValues(rng, imageClearValues, renderPassInfo.getAttachments(), attachmentIsLazy); 3701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeRenderPassClearValues(rng, renderPassClearValues, renderPassInfo.getAttachments()); 3702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeSubpassIsSecondary(subpassIsSecondary, renderPassInfo.getSubpasses(), config.commandBufferTypes); 3704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeSubpassClearValues(rng, subpassColorClearValues, renderPassInfo); 3705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeSubpassRenderInfo(subpassRenderInfo, rng, renderPassInfo, config); 3706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi logTestCaseInfo(log, config, attachmentIsLazy, imageClearValues, renderPassClearValues, subpassRenderInfo); 3708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkTextureFormatSupport(log, context.getInstanceInterface(), context.getPhysicalDevice(), config.renderPass.getAttachments()); 3710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkDevice device = context.getDevice(); 3713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DeviceInterface& vk = context.getDeviceInterface(); 3714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkQueue queue = context.getUniversalQueue(); 3715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 queueIndex = context.getUniversalQueueFamilyIndex(); 3716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Allocator& allocator = context.getDefaultAllocator(); 3717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Unique<VkRenderPass> renderPass (createRenderPass(vk, device, renderPassInfo)); 371968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkCommandPool> commandBufferPool (createCommandPool(vk, device, queueIndex, 0)); 372068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkCommandBuffer> initializeImagesCommandBuffer (allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY)); 372168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkCommandBuffer> renderCommandBuffer (allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY)); 372268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkCommandBuffer> readImagesToBuffersCommandBuffer (allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY)); 3723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<de::SharedPtr<AttachmentResources> > attachmentResources; 3725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<de::SharedPtr<SubpassRenderer> > subpassRenderers; 3726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkImageView> attachmentViews; 3727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 3729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachmentInfo = renderPassInfo.getAttachments()[attachmentNdx]; 3731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources.push_back(de::SharedPtr<AttachmentResources>(new AttachmentResources(vk, device, allocator, queueIndex, targetSize, attachmentInfo, attachmentIsLazy[attachmentNdx]))); 3733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentViews.push_back(attachmentResources[attachmentNdx]->getAttachmentView()); 3734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 373668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos beginCommandBuffer(vk, *initializeImagesCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0); 3737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pushImageInitializationCommands(vk, *initializeImagesCommandBuffer, renderPassInfo.getAttachments(), attachmentResources, queueIndex, imageClearValues); 3738c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi endCommandBuffer(vk, *initializeImagesCommandBuffer); 3739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Unique<VkFramebuffer> framebuffer (createFramebuffer(vk, device, *renderPass, targetSize, attachmentViews)); 3742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++) 3744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpassRenderers.push_back(de::SharedPtr<SubpassRenderer>(new SubpassRenderer(context, vk, device, allocator, *renderPass, *framebuffer, *commandBufferPool, queueIndex, subpassRenderInfo[subpassNdx]))); 3745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 374668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos beginCommandBuffer(vk, *renderCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0); 3747c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pushRenderPassCommands(vk, *renderCommandBuffer, *renderPass, *framebuffer, subpassRenderers, renderPos, renderSize, renderPassClearValues, config.renderTypes); 3748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi endCommandBuffer(vk, *renderCommandBuffer); 3749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 375068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos beginCommandBuffer(vk, *readImagesToBuffersCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0); 3751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pushReadImagesToBuffers(vk, *readImagesToBuffersCommandBuffer, queueIndex, attachmentResources, renderPassInfo.getAttachments(), attachmentIsLazy, targetSize); 3752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi endCommandBuffer(vk, *readImagesToBuffersCommandBuffer); 3753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 375468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandBuffer commandBuffers[] = 3755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *initializeImagesCommandBuffer, 3757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *renderCommandBuffer, 3758c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *readImagesToBuffersCommandBuffer 3759c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Unique<VkFence> fence (createFence(vk, device, 0u)); 3761c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueSubmit(vk, queue, DE_LENGTH_OF_ARRAY(commandBuffers), commandBuffers, *fence); 3763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi waitForFences(vk, device, 1, &fence.get(), VK_TRUE, ~0ull); 3764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (logAndVerifyImages(log, vk, device, attachmentResources, attachmentIsLazy, renderPassInfo, renderPassClearValues, imageClearValues, subpassRenderInfo, targetSize, config)) 3768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return tcu::TestStatus::pass("Pass"); 3769c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return tcu::TestStatus::fail("Result verification failed"); 3771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3772c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 377418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvistatic const VkFormat s_coreColorFormats[] = 3775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 377668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FORMAT_R5G6B5_UNORM_PACK16, 3777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8_UNORM, 3778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8_SNORM, 3779c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8_UINT, 3780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8_SINT, 3781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8_UNORM, 3782c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8_SNORM, 3783c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8_UINT, 3784c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8_SINT, 3785c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8B8A8_UNORM, 3786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8B8A8_SNORM, 3787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8B8A8_UINT, 3788c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8B8A8_SINT, 3789c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8B8A8_SRGB, 379018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A8B8G8R8_UNORM_PACK32, 379118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A8B8G8R8_SNORM_PACK32, 379218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A8B8G8R8_UINT_PACK32, 379318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A8B8G8R8_SINT_PACK32, 379418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A8B8G8R8_SRGB_PACK32, 379518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_B8G8R8A8_UNORM, 379618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_B8G8R8A8_SRGB, 379718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A2R10G10B10_UNORM_PACK32, 379818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A2B10G10R10_UNORM_PACK32, 379918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A2B10G10R10_UINT_PACK32, 3800c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16_UNORM, 3801c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16_SNORM, 3802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16_UINT, 3803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16_SINT, 3804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16_SFLOAT, 3805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16_UNORM, 3806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16_SNORM, 3807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16_UINT, 3808c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16_SINT, 3809c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16_SFLOAT, 3810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16B16A16_UNORM, 3811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16B16A16_SNORM, 3812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16B16A16_UINT, 3813c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16B16A16_SINT, 3814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16B16A16_SFLOAT, 3815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32_UINT, 3816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32_SINT, 3817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32_SFLOAT, 3818c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32_UINT, 3819c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32_SINT, 3820c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32_SFLOAT, 3821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32B32A32_UINT, 3822c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32B32A32_SINT, 3823c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32B32A32_SFLOAT 3824c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 3825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 382618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvistatic const VkFormat s_coreDepthStencilFormats[] = 3827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_D16_UNORM, 382918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 383068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FORMAT_X8_D24_UNORM_PACK32, 3831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_D32_SFLOAT, 383218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 383318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_D24_UNORM_S8_UINT, 383418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_D32_SFLOAT_S8_UINT 3835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 3836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<tcu::TestCaseGroup> createAttachmentTestCaseGroup (tcu::TestContext& testCtx) 3838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 attachmentCounts[] = { 1, 3, 8 }; 3840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp loadOps[] = 3841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_LOAD, 3843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 3844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE 3845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp storeOps[] = 3848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 3850775c33feeee3a8a7cfe1a51447424d4160083fffscygan VK_ATTACHMENT_STORE_OP_DONT_CARE 3851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 385300d994858ab64bb5e1c6cb534bb049dcbb9269descygan const VkImageLayout initialAndFinalColorLayouts[] = 3854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, 3856c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 385700d994858ab64bb5e1c6cb534bb049dcbb9269descygan VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 385800d994858ab64bb5e1c6cb534bb049dcbb9269descygan VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, 385900d994858ab64bb5e1c6cb534bb049dcbb9269descygan VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL 386000d994858ab64bb5e1c6cb534bb049dcbb9269descygan }; 386100d994858ab64bb5e1c6cb534bb049dcbb9269descygan 386200d994858ab64bb5e1c6cb534bb049dcbb9269descygan const VkImageLayout initialAndFinalDepthStencilLayouts[] = 386300d994858ab64bb5e1c6cb534bb049dcbb9269descygan { 386400d994858ab64bb5e1c6cb534bb049dcbb9269descygan VK_IMAGE_LAYOUT_GENERAL, 3865c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 3866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, 3867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 386868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, 386968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL 3870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayouts[] = 3873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, 3875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL 3876c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout depthStencilLayouts[] = 3879c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3880c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, 3881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL 3882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::RenderTypes renderCommands[] = 3885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_NONE, 3887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_CLEAR, 3888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_DRAW, 3889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW, 3890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::CommandBufferTypes commandBuffers[] = 3893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_INLINE, 3895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_SECONDARY, 3896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_INLINE|TestConfig::COMMANDBUFFERTYPES_SECONDARY 3897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::ImageMemory imageMemories[] = 3900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_STRICT, 3902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_LAZY, 3903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_STRICT|TestConfig::IMAGEMEMORY_LAZY 3904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSizes[] = 3907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(64, 64), 3909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(63, 65) 3910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPositions[] = 3913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(0, 0), 3915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(3, 17) 3916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSizes[] = 3919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(32, 32), 3921c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(60, 47) 3922c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3923c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3924c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::Random rng (1433774382u); 3925c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "attachment", "Attachment format and count tests with load and store ops and image layouts")); 3926c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3927c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentCountNdx = 0; attachmentCountNdx < DE_LENGTH_OF_ARRAY(attachmentCounts); attachmentCountNdx++) 3928c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3929c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 attachmentCount = attachmentCounts[attachmentCountNdx]; 3930c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 testCaseCount = (attachmentCount == 1 ? 100 : 200); 3931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> attachmentCountGroup (new tcu::TestCaseGroup(testCtx, de::toString(attachmentCount).c_str(), de::toString(attachmentCount).c_str())); 3932c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3933c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t testCaseNdx = 0; testCaseNdx < testCaseCount; testCaseNdx++) 3934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3935c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool useDepthStencil = rng.getBool(); 3936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout depthStencilLayout = VK_IMAGE_LAYOUT_GENERAL; 3937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Attachment> attachments; 3938c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 3939c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount; attachmentNdx++) 3941c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 394268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT; 394318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkFormat format = rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreColorFormats), DE_ARRAY_END(s_coreColorFormats)); 3944c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp loadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 3945c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp storeOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 3946c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 394700d994858ab64bb5e1c6cb534bb049dcbb9269descygan const VkImageLayout initialLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts)); 394800d994858ab64bb5e1c6cb534bb049dcbb9269descygan const VkImageLayout finalizeLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts)); 3949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 3950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp stencilLoadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 3952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp stencilStoreOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 3953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout)); 3955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout)); 3956c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3957c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (useDepthStencil) 3959c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 396018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT; 396118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkFormat format = rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreDepthStencilFormats), DE_ARRAY_END(s_coreDepthStencilFormats)); 3962c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp loadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 3963c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp storeOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 3964c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 396500d994858ab64bb5e1c6cb534bb049dcbb9269descygan const VkImageLayout initialLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalDepthStencilLayouts), DE_ARRAY_END(initialAndFinalDepthStencilLayouts)); 396600d994858ab64bb5e1c6cb534bb049dcbb9269descygan const VkImageLayout finalizeLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalDepthStencilLayouts), DE_ARRAY_END(initialAndFinalDepthStencilLayouts)); 3967c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp stencilLoadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 3969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp stencilStoreOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 3970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi depthStencilLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(depthStencilLayouts), DE_ARRAY_END(depthStencilLayouts)); 3972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout)); 3973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::RenderTypes render = rng.choose<TestConfig::RenderTypes>(DE_ARRAY_BEGIN(renderCommands), DE_ARRAY_END(renderCommands)); 3977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::CommandBufferTypes commandBuffer = rng.choose<TestConfig::CommandBufferTypes>(DE_ARRAY_BEGIN(commandBuffers), DE_ARRAY_END(commandBuffers)); 3978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::ImageMemory imageMemory = rng.choose<TestConfig::ImageMemory>(DE_ARRAY_BEGIN(imageMemories), DE_ARRAY_END(imageMemories)); 3979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass> subpasses (1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference((useDepthStencil ? (deUint32)(attachments.size() - 1) : VK_ATTACHMENT_UNUSED), depthStencilLayout), vector<AttachmentReference>())); 3980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassDependency> deps; 3981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const string testCaseName = de::toString(attachmentCountNdx * testCaseCount + testCaseNdx); 3983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (attachments, subpasses, deps); 3984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSize = rng.choose<UVec2>(DE_ARRAY_BEGIN(targetSizes), DE_ARRAY_END(targetSizes)); 3985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPos = rng.choose<UVec2>(DE_ARRAY_BEGIN(renderPositions), DE_ARRAY_END(renderPositions)); 3986c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSize = rng.choose<UVec2>(DE_ARRAY_BEGIN(renderSizes), DE_ARRAY_END(renderSizes)); 3987c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3988c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(attachmentCountGroup.get(), testCaseName.c_str(), testCaseName.c_str(), createTestShaders, renderPassTest, TestConfig(renderPass, render, commandBuffer, imageMemory, targetSize, renderPos, renderSize, 1293809)); 3989c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3990c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3991c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3992c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi group->addChild(attachmentCountGroup.release()); 3993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3994c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3995c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return group; 3996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3998c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<tcu::TestCaseGroup> createAttachmentAllocationTestGroup (tcu::TestContext& testCtx) 3999c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 attachmentCounts[] = { 4, 8 }; 4001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp loadOps[] = 4002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4003c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_LOAD, 4004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE 4006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp storeOps[] = 4009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE 4012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout initialAndFinalLayouts[] = 4015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, 4017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 4018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 4019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, 4020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 402168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, 402268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL 4023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayouts[] = 4026c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, 4028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 4029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi enum AllocationType 4032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4033c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Each pass uses one more attachmen than previous one 4034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_GROW, 4035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Each pass uses one less attachment than previous one 4036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_SHRINK, 4037c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Each pass drops one attachment and picks up new one 4038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_ROLL, 4039c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Start by growing and end by shrinking 4040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_GROW_SHRINK 4041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AllocationType allocationTypes[] = 4044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_GROW, 4046c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_SHRINK, 4047c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_ROLL, 4048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_GROW_SHRINK 4049c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4050c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4051c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const char* const allocationTypeStr[] = 4052c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4053c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi "grow", 4054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi "shrink", 4055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi "roll", 4056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi "grow_shrink" 4057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4058c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::RenderTypes renderCommands[] = 4060c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_NONE, 4062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_CLEAR, 4063c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_DRAW, 4064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW, 4065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::CommandBufferTypes commandBuffers[] = 4068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4069c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_INLINE, 4070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_SECONDARY, 4071c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_INLINE|TestConfig::COMMANDBUFFERTYPES_SECONDARY 4072c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::ImageMemory imageMemories[] = 4075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_STRICT, 4077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_LAZY, 4078c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_STRICT|TestConfig::IMAGEMEMORY_LAZY 4079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSizes[] = 4082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4083c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(64, 64), 4084c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(63, 65) 4085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4086c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4087c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPositions[] = 4088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4089c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(0, 0), 4090c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(3, 17) 4091c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4092c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4093c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSizes[] = 4094c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4095c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(32, 32), 4096c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(60, 47) 4097c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4098c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4099c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "attachment_allocation", "Attachment allocation tests")); 4100c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::Random rng (3700649827u); 4101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4102c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t allocationTypeNdx = 0; allocationTypeNdx < DE_LENGTH_OF_ARRAY(allocationTypes); allocationTypeNdx++) 4103c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AllocationType allocationType = allocationTypes[allocationTypeNdx]; 4105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const size_t testCaseCount = 100; 4106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> allocationTypeGroup (new tcu::TestCaseGroup(testCtx, allocationTypeStr[allocationTypeNdx], allocationTypeStr[allocationTypeNdx])); 4107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t testCaseNdx = 0; testCaseNdx < testCaseCount; testCaseNdx++) 4109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 attachmentCount = rng.choose<deUint32>(DE_ARRAY_BEGIN(attachmentCounts), DE_ARRAY_END(attachmentCounts)); 4111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Attachment> attachments; 4112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass> subpasses; 4113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount; attachmentNdx++) 4115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 411668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT; 411718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkFormat format = rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreColorFormats), DE_ARRAY_END(s_coreColorFormats)); 4118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp loadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 4119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp storeOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 4120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout initialLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalLayouts), DE_ARRAY_END(initialAndFinalLayouts)); 4122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout finalizeLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalLayouts), DE_ARRAY_END(initialAndFinalLayouts)); 4123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp stencilLoadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 4125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp stencilStoreOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 4126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout)); 4128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (allocationType == ALLOCATIONTYPE_GROW) 4131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++) 4133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 4135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpassNdx + 1; attachmentNdx++) 4137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 4139c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout)); 4141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), vector<AttachmentReference>())); 4144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (allocationType == ALLOCATIONTYPE_SHRINK) 4147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++) 4149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 4151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < (attachmentCount - subpassNdx); attachmentNdx++) 4153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 4155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout)); 4157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), vector<AttachmentReference>())); 4160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (allocationType == ALLOCATIONTYPE_ROLL) 4163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < attachmentCount / 2; subpassNdx++) 4165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 4167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount / 2; attachmentNdx++) 4169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 4171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)(subpassNdx + attachmentNdx), subpassLayout)); 4173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), vector<AttachmentReference>())); 4176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (allocationType == ALLOCATIONTYPE_GROW_SHRINK) 4179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++) 4181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 4183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpassNdx + 1; attachmentNdx++) 4185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 4187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout)); 4189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), vector<AttachmentReference>())); 4192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++) 4195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 4197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < (attachmentCount - subpassNdx); attachmentNdx++) 4199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 4201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout)); 4203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), vector<AttachmentReference>())); 4206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 4209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown allocation type"); 4210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::RenderTypes render = rng.choose<TestConfig::RenderTypes>(DE_ARRAY_BEGIN(renderCommands), DE_ARRAY_END(renderCommands)); 4213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::CommandBufferTypes commandBuffer = rng.choose<TestConfig::CommandBufferTypes>(DE_ARRAY_BEGIN(commandBuffers), DE_ARRAY_END(commandBuffers)); 4214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::ImageMemory imageMemory = rng.choose<TestConfig::ImageMemory>(DE_ARRAY_BEGIN(imageMemories), DE_ARRAY_END(imageMemories)); 4215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const string testCaseName = de::toString(testCaseNdx); 4217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSize = rng.choose<UVec2>(DE_ARRAY_BEGIN(targetSizes), DE_ARRAY_END(targetSizes)); 4218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPos = rng.choose<UVec2>(DE_ARRAY_BEGIN(renderPositions), DE_ARRAY_END(renderPositions)); 4219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSize = rng.choose<UVec2>(DE_ARRAY_BEGIN(renderSizes), DE_ARRAY_END(renderSizes)); 4220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency> deps; 4222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4223433aad756646dacd9b9bdd863fda3578977e254escygan for (size_t subpassNdx = 0; subpassNdx < subpasses.size() - 1; subpassNdx++) 4224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool byRegion = rng.getBool(); 4226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deps.push_back(SubpassDependency((deUint32)subpassNdx, (deUint32)subpassNdx + 1, 4227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 4228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 4229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 4230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 4231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 4233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 4234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 4235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 4236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 423768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, 423868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, // \todo [pyry] Correct? 4239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4240682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos byRegion ? (VkBool32)VK_TRUE : (VkBool32)VK_FALSE)); 4241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (attachments, subpasses, deps); 4244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(allocationTypeGroup.get(), testCaseName.c_str(), testCaseName.c_str(), createTestShaders, renderPassTest, TestConfig(renderPass, render, commandBuffer, imageMemory, targetSize, renderPos, renderSize, 80329)); 4246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi group->addChild(allocationTypeGroup.release()); 4250c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return group; 4253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<tcu::TestCaseGroup> createSimpleTestGroup (tcu::TestContext& testCtx) 4256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSize (64, 64); 4258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPos (0, 0); 4259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSize (64, 64); 4260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "simple", "Simple basic render pass tests")); 4261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // color 4263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(1, Attachment(VK_FORMAT_R8G8B8A8_UNORM, 426568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 4271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 4272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 4273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 4274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 4276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 4278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>())), 4279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 4280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group.get(), "color", "Single color attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 4282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // depth 4285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 428668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const RenderPass renderPass (vector<Attachment>(1, Attachment(VK_FORMAT_X8_D24_UNORM_PACK32, 428768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 4293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)), 4294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 4295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 4296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>())), 4301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 4302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group.get(), "depth", "Single depth attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 4304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // stencil 4307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(1, Attachment(VK_FORMAT_S8_UINT, 430968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 4315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)), 4316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 4317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 4318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>())), 4323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 4324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group.get(), "stencil", "Single stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 4326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // depth_stencil 4329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(1, Attachment(VK_FORMAT_D24_UNORM_S8_UINT, 433168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 4337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)), 4338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 4339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 4340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>())), 4345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 4346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group.get(), "depth_stencil", "Single depth stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 4348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // color_depth 4351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachments[] = 4353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment(VK_FORMAT_R8G8B8A8_UNORM, 435568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 4361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL), 436268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos Attachment(VK_FORMAT_X8_D24_UNORM_PACK32, 436368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 4369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)), 4373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 4374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 4375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 4377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>())), 4380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 4381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group.get(), "color_depth", "Color and depth attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 4383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // color_stencil 4386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachments[] = 4388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment(VK_FORMAT_R8G8B8A8_UNORM, 439068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 4396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL), 4397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment(VK_FORMAT_S8_UINT, 439868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 4404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)), 4408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 4409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 4410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 4412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>())), 4415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 4416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group.get(), "color_stencil", "Color and stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 4419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // color_depth_stencil 4422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachments[] = 4424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment(VK_FORMAT_R8G8B8A8_UNORM, 442668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 4432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL), 4433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment(VK_FORMAT_D24_UNORM_S8_UINT, 443468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 4440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)), 4444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 4445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 4446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 4448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>())), 4451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 4452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group.get(), "color_depth_stencil", "Color, depth and stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 4454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return group; 4457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string formatToName (VkFormat format) 4460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const std::string formatStr = de::toString(format); 4462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const std::string prefix = "VK_FORMAT_"; 4463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(formatStr.substr(0, prefix.length()) == prefix); 4465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return de::toLower(formatStr.substr(prefix.length())); 4467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<tcu::TestCaseGroup> createFormatTestGroup(tcu::TestContext& testCtx) 4470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "formats", "Tests for different image formats.")); 4472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSize (64, 64); 4474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPos (0, 0); 4475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSize (64, 64); 4476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const struct 4478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const char* const str; 4480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp op; 4481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } loadOps[] = 4482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "clear", VK_ATTACHMENT_LOAD_OP_CLEAR }, 4484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "load", VK_ATTACHMENT_LOAD_OP_LOAD }, 4485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "dont_care", VK_ATTACHMENT_LOAD_OP_DONT_CARE } 4486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const struct 4489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const char* const str; 4491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::RenderTypes types; 4492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } renderTypes[] = 4493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4494c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "clear", TestConfig::RENDERTYPES_CLEAR }, 4495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "draw", TestConfig::RENDERTYPES_DRAW }, 4496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "clear_draw", TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW } 4497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 449918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi // Color formats 450018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_coreColorFormats); formatNdx++) 4501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 450218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkFormat format = s_coreColorFormats[formatNdx]; 4503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> formatGroup (new tcu::TestCaseGroup(testCtx, formatToName(format).c_str(), de::toString(format).c_str())); 4504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t loadOpNdx = 0; loadOpNdx < DE_LENGTH_OF_ARRAY(loadOps); loadOpNdx++) 4506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp loadOp = loadOps[loadOpNdx].op; 4508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> loadOpGroup (new tcu::TestCaseGroup(testCtx, loadOps[loadOpNdx].str, loadOps[loadOpNdx].str)); 4509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypes); renderTypeNdx++) 4511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(1, Attachment(format, 451368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi loadOp, 4515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 4519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 4520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 4521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 4522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 4524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 4526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>())), 4527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 452818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 452918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi addFunctionCaseWithPrograms<TestConfig>(loadOpGroup.get(), renderTypes[renderTypeNdx].str, renderTypes[renderTypeNdx].str, createTestShaders, renderPassTest, TestConfig(renderPass, renderTypes[renderTypeNdx].types, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 453018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi } 453118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 453218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi formatGroup->addChild(loadOpGroup.release()); 453318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi } 453418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 453518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi group->addChild(formatGroup.release()); 453618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi } 453718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 453818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi // Depth stencil formats 453918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_coreDepthStencilFormats); formatNdx++) 454018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi { 454118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkFormat format = s_coreDepthStencilFormats[formatNdx]; 454218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi de::MovePtr<tcu::TestCaseGroup> formatGroup (new tcu::TestCaseGroup(testCtx, formatToName(format).c_str(), de::toString(format).c_str())); 454318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 454418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi for (size_t loadOpNdx = 0; loadOpNdx < DE_LENGTH_OF_ARRAY(loadOps); loadOpNdx++) 454518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi { 454618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkAttachmentLoadOp loadOp = loadOps[loadOpNdx].op; 454718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi de::MovePtr<tcu::TestCaseGroup> loadOpGroup (new tcu::TestCaseGroup(testCtx, loadOps[loadOpNdx].str, loadOps[loadOpNdx].str)); 454818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 454918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi for (size_t renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypes); renderTypeNdx++) 455018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi { 455118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const RenderPass renderPass (vector<Attachment>(1, Attachment(format, 455218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_SAMPLE_COUNT_1_BIT, 455318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 455418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 455518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi loadOp, 455618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 455718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 455818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)), 455918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 456018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 0u, 456118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<AttachmentReference>(), 456218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<AttachmentReference>(), 456318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<AttachmentReference>(), 456418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 456518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<AttachmentReference>())), 456618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<SubpassDependency>()); 4567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(loadOpGroup.get(), renderTypes[renderTypeNdx].str, renderTypes[renderTypeNdx].str, createTestShaders, renderPassTest, TestConfig(renderPass, renderTypes[renderTypeNdx].types, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 4569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi formatGroup->addChild(loadOpGroup.release()); 4572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi group->addChild(formatGroup.release()); 4575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return group; 4578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} // anonymous 4581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvitcu::TestCaseGroup* createRenderPassTests (tcu::TestContext& testCtx) 4583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> renderpassTests (new tcu::TestCaseGroup(testCtx, "renderpass", "RenderPass Tests")); 4585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderpassTests->addChild(createSimpleTestGroup(testCtx).release()); 4587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderpassTests->addChild(createFormatTestGroup(testCtx).release()); 4588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderpassTests->addChild(createAttachmentTestCaseGroup(testCtx).release()); 4589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderpassTests->addChild(createAttachmentAllocationTestGroup(testCtx).release()); 4590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return renderpassTests.release(); 4592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} // vkt 4595