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 * 7978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 8978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License. 9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at 10c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * 11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 12c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * 13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software 14978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and 17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License. 18c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * 19c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *//*! 20c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * \file 21c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi * \brief RenderPass tests 22c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *//*--------------------------------------------------------------------*/ 23c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 24c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vktRenderPassTests.hpp" 25c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 26c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vktTestCaseUtil.hpp" 2758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include "vktTestGroupUtil.hpp" 28c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 29c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkDefs.hpp" 30c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkDeviceUtil.hpp" 31c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkImageUtil.hpp" 32c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkMemUtil.hpp" 33c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkPlatform.hpp" 34c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkPrograms.hpp" 35c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkQueryUtil.hpp" 36c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkRef.hpp" 37c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkRefUtil.hpp" 38c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkStrUtil.hpp" 39c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkTypeUtil.hpp" 40c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 41c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuFloat.hpp" 4258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include "tcuFormatUtil.hpp" 43c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuMaybe.hpp" 4458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include "tcuResultCollector.hpp" 4558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include "tcuTestLog.hpp" 4658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include "tcuTextureUtil.hpp" 47c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuVectorUtil.hpp" 48c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include "deRandom.hpp" 5058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include "deSTLUtil.hpp" 51c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deSharedPtr.hpp" 52c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deStringUtil.hpp" 5358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include "deUniquePtr.hpp" 54c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 55c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include <limits> 5658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include <set> 5758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include <string> 5858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi#include <vector> 59c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 60c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing namespace vk; 61c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 6258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing tcu::BVec4; 63c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::IVec2; 64c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::IVec4; 6558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing tcu::UVec2; 66c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::UVec4; 6758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing tcu::Vec2; 68c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::Vec4; 6958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 7058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing tcu::Maybe; 7158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing tcu::just; 7258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing tcu::nothing; 7358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 74c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::ConstPixelBufferAccess; 75c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::PixelBufferAccess; 76c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 7758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing tcu::TestLog; 7858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 79c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing de::UniquePtr; 80c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 8158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing std::pair; 8258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing std::set; 83c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing std::string; 8458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviusing std::vector; 85c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 86c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvinamespace vkt 87c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 88c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvinamespace 89c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 9058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvienum BoolOp 91c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 9258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi BOOLOP_AND, 9358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi BOOLOP_OR, 9458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi BOOLOP_EQ, 9558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi BOOLOP_NEQ 96c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 97c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 9858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviconst char* boolOpToString (BoolOp op) 9958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{ 10058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi switch (op) 10158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 10258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case BOOLOP_OR: 10358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return "||"; 10458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 10558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case BOOLOP_AND: 10658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return "&&"; 10758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 10858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case BOOLOP_EQ: 10958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return "=="; 11058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 11158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case BOOLOP_NEQ: 11258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return "!="; 11358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 11458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi default: 11558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_FATAL("Unknown boolean operation."); 11658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return DE_NULL; 11758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 11858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi} 11958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 12058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvibool performBoolOp (BoolOp op, bool a, bool b) 12158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{ 12258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi switch (op) 12358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 12458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case BOOLOP_OR: 12558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return a || b; 12658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 12758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case BOOLOP_AND: 12858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return a && b; 12958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 13058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case BOOLOP_EQ: 13158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return a == b; 13258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 13358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case BOOLOP_NEQ: 13458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return a != b; 13558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 13658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi default: 13758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_FATAL("Unknown boolean operation."); 13858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return false; 13958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 14058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi} 14158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 14258a80a6102cf592f064b8094c59812081ee5d323Mika IsojärviBoolOp boolOpFromIndex (size_t index) 14358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{ 14458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const BoolOp ops[] = 14558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 14658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi BOOLOP_OR, 14758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi BOOLOP_AND, 14858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi BOOLOP_EQ, 14958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi BOOLOP_NEQ 15058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 15158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 15258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return ops[index % DE_LENGTH_OF_ARRAY(ops)]; 15358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi} 15458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi// Utility functions using flattened structs 156c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkFence> createFence (const DeviceInterface& vk, VkDevice device, VkFenceCreateFlags flags) 157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkFenceCreateInfo pCreateInfo = 159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, 161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi flags 164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 165955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createFence(vk, device, &pCreateInfo); 166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 16868e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkFramebuffer> createFramebuffer (const DeviceInterface& vk, 16968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDevice device, 17068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkFramebufferCreateFlags pCreateInfo_flags, 17168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkRenderPass pCreateInfo_renderPass, 17268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_attachmentCount, 17368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkImageView* pCreateInfo_pAttachments, 17468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_width, 17568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_height, 17668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_layers) 177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkFramebufferCreateInfo pCreateInfo = 179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, 181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 18268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_flags, 183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_renderPass, 184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_attachmentCount, 185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_pAttachments, 186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_width, 187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_height, 188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_layers, 189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 190955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createFramebuffer(vk, device, &pCreateInfo); 191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 19368e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkImage> createImage (const DeviceInterface& vk, 19468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDevice device, 19568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageCreateFlags pCreateInfo_flags, 19668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageType pCreateInfo_imageType, 19768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkFormat pCreateInfo_format, 19868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkExtent3D pCreateInfo_extent, 19968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_mipLevels, 20068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_arrayLayers, 20168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSampleCountFlagBits pCreateInfo_samples, 20268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageTiling pCreateInfo_tiling, 20368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageUsageFlags pCreateInfo_usage, 20468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSharingMode pCreateInfo_sharingMode, 20568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_queueFamilyCount, 20668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const deUint32* pCreateInfo_pQueueFamilyIndices, 20768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout pCreateInfo_initialLayout) 208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageCreateInfo pCreateInfo = 210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, 212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 21368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_flags, 214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_imageType, 215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_format, 216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_extent, 217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_mipLevels, 21868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_arrayLayers, 219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_samples, 220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_tiling, 221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_usage, 222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_sharingMode, 223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_queueFamilyCount, 224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_pQueueFamilyIndices, 225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_initialLayout 226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 227955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createImage(vk, device, &pCreateInfo); 228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid bindBufferMemory (const DeviceInterface& vk, VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memOffset) 231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.bindBufferMemory(device, buffer, mem, memOffset)); 233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid bindImageMemory (const DeviceInterface& vk, VkDevice device, VkImage image, VkDeviceMemory mem, VkDeviceSize memOffset) 236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.bindImageMemory(device, image, mem, memOffset)); 238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 240c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImageView> createImageView (const DeviceInterface& vk, 241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 24268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageViewCreateFlags pCreateInfo_flags, 243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImage pCreateInfo_image, 244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageViewType pCreateInfo_viewType, 245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkFormat pCreateInfo_format, 24668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkComponentMapping pCreateInfo_components, 24768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageSubresourceRange pCreateInfo_subresourceRange) 248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageViewCreateInfo pCreateInfo = 250c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, 252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 25368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_flags, 254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_image, 255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_viewType, 256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_format, 25768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_components, 258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_subresourceRange, 259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 260955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createImageView(vk, device, &pCreateInfo); 261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 26368e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkBuffer> createBuffer (const DeviceInterface& vk, 26468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDevice device, 26568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkBufferCreateFlags pCreateInfo_flags, 26668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDeviceSize pCreateInfo_size, 26768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkBufferUsageFlags pCreateInfo_usage, 26868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSharingMode pCreateInfo_sharingMode, 26968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_queueFamilyCount, 27068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const deUint32* pCreateInfo_pQueueFamilyIndices) 271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBufferCreateInfo pCreateInfo = 273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, 275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 27668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_flags, 277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_size, 278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_usage, 279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_sharingMode, 280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_queueFamilyCount, 281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_pQueueFamilyIndices, 282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 283955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createBuffer(vk, device, &pCreateInfo); 284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 28668e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkCommandPool> createCommandPool (const DeviceInterface& vk, 28768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDevice device, 28868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandPoolCreateFlags pCreateInfo_flags, 28968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_queueFamilyIndex) 290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 29168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandPoolCreateInfo pCreateInfo = 292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 29368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, 294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_flags, 296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_queueFamilyIndex, 297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 298955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createCommandPool(vk, device, &pCreateInfo); 299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 30168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid cmdBeginRenderPass (const DeviceInterface& vk, 30268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer cmdBuffer, 30368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkRenderPass pRenderPassBegin_renderPass, 30468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkFramebuffer pRenderPassBegin_framebuffer, 30568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkRect2D pRenderPassBegin_renderArea, 30668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pRenderPassBegin_clearValueCount, 30768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkClearValue* pRenderPassBegin_pAttachmentClearValues, 30868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSubpassContents contents) 309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkRenderPassBeginInfo pRenderPassBegin = 311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, 313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pRenderPassBegin_renderPass, 315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pRenderPassBegin_framebuffer, 316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pRenderPassBegin_renderArea, 31768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pRenderPassBegin_clearValueCount, 318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pRenderPassBegin_pAttachmentClearValues, 319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdBeginRenderPass(cmdBuffer, &pRenderPassBegin, contents); 321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 32368e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkCommandBuffer> allocateCommandBuffer (const DeviceInterface& vk, 32468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDevice device, 32568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandPool pCreateInfo_commandPool, 32668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBufferLevel pCreateInfo_level) 327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 328955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos const VkCommandBufferAllocateInfo pAllocateInfo = 329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 33068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, 331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 33268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_commandPool, 333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_level, 33468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // bufferCount 335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 336955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return allocateCommandBuffer(vk, device, &pAllocateInfo); 337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 33968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid beginCommandBuffer (const DeviceInterface& vk, 34068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer cmdBuffer, 34168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBufferUsageFlags pBeginInfo_flags, 342689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VkRenderPass pInheritanceInfo_renderPass, 343689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos deUint32 pInheritanceInfo_subpass, 344689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VkFramebuffer pInheritanceInfo_framebuffer, 345689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VkBool32 pInheritanceInfo_occlusionQueryEnable, 346689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VkQueryControlFlags pInheritanceInfo_queryFlags, 347689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VkQueryPipelineStatisticFlags pInheritanceInfo_pipelineStatistics) 348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 34958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkCommandBufferInheritanceInfo pInheritanceInfo = 350689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 351689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, 352689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos DE_NULL, 353689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos pInheritanceInfo_renderPass, 354689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos pInheritanceInfo_subpass, 355689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos pInheritanceInfo_framebuffer, 356689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos pInheritanceInfo_occlusionQueryEnable, 357689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos pInheritanceInfo_queryFlags, 358689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos pInheritanceInfo_pipelineStatistics, 359689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos }; 36058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkCommandBufferBeginInfo pBeginInfo = 361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 36268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pBeginInfo_flags, 365689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos &pInheritanceInfo, 366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.beginCommandBuffer(cmdBuffer, &pBeginInfo)); 368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 37068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid endCommandBuffer (const DeviceInterface& vk, VkCommandBuffer cmdBuffer) 371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.endCommandBuffer(cmdBuffer)); 373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 37568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid queueSubmit (const DeviceInterface& vk, VkQueue queue, deUint32 cmdBufferCount, const VkCommandBuffer* pCmdBuffers, VkFence fence) 376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 37768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSubmitInfo submitInfo = 37868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 37968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_SUBMIT_INFO, 38068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, 38168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // waitSemaphoreCount 38268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (const VkSemaphore*)DE_NULL, // pWaitSemaphores 383689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, 38468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos cmdBufferCount, // commandBufferCount 38568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCmdBuffers, 38668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // signalSemaphoreCount 38768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (const VkSemaphore*)DE_NULL, // pSignalSemaphores 38868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }; 38968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence)); 390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid waitForFences (const DeviceInterface& vk, VkDevice device, deUint32 fenceCount, const VkFence* pFences, VkBool32 waitAll, deUint64 timeout) 393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.waitForFences(device, fenceCount, pFences, waitAll, timeout)); 395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 397c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkImageAspectFlags getImageAspectFlags (VkFormat vkFormat) 398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(vkFormat); 400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST == 21); 402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (format.order) 404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::DS: 406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; 407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::D: 409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return VK_IMAGE_ASPECT_DEPTH_BIT; 410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::S: 412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return VK_IMAGE_ASPECT_STENCIL_BIT; 413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return VK_IMAGE_ASPECT_COLOR_BIT; 416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 41968e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkAccessFlags getAllMemoryReadFlags (void) 420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 42168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_ACCESS_TRANSFER_READ_BIT 42268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_UNIFORM_READ_BIT 42368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_HOST_READ_BIT 42468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_INDEX_READ_BIT 42568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_SHADER_READ_BIT 42668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT 42768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_INDIRECT_COMMAND_READ_BIT 42868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT 42968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT 43068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; 431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 43368e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkAccessFlags getAllMemoryWriteFlags (void) 434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 43568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_ACCESS_TRANSFER_WRITE_BIT 43668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_HOST_WRITE_BIT 43768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_SHADER_WRITE_BIT 43868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT 43968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; 440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 442ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej JesionowskiVkAccessFlags getMemoryFlagsForLayout (const VkImageLayout layout) 443ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski{ 444ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski switch (layout) 445ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski { 446ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski case VK_IMAGE_LAYOUT_GENERAL: return getAllMemoryReadFlags() | getAllMemoryWriteFlags(); 447ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: return VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; 448ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: return VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; 449ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL: return VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; 450ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: return VK_ACCESS_SHADER_READ_BIT; 451ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: return VK_ACCESS_TRANSFER_READ_BIT; 452ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: return VK_ACCESS_TRANSFER_WRITE_BIT; 453ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski 454ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski default: 455ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski return (VkAccessFlags)0; 456ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski } 457ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski} 458ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski 459c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkPipelineStageFlags getAllPipelineStageFlags (void) 460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 46168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT 462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_TRANSFER_BIT 463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT 464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT 465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT 466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_VERTEX_INPUT_BIT 467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT 468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 46968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT 470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT 472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; 474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass AttachmentReference 477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference (deUint32 attachment, 480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout layout) 481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_attachment (attachment) 482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_layout (layout) 483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getAttachment (void) const { return m_attachment; } 487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout getImageLayout (void) const { return m_layout; } 488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 m_attachment; 491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout m_layout; 492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 494c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass Subpass 495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Subpass (VkPipelineBindPoint pipelineBindPoint, 498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkSubpassDescriptionFlags flags, 499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& inputAttachments, 500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& colorAttachments, 501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& resolveAttachments, 502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference depthStencilAttachment, 50358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const vector<deUint32>& preserveAttachments) 504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_pipelineBindPoint (pipelineBindPoint) 505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_flags (flags) 506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_inputAttachments (inputAttachments) 507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_colorAttachments (colorAttachments) 508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_resolveAttachments (resolveAttachments) 509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_depthStencilAttachment (depthStencilAttachment) 510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_preserveAttachments (preserveAttachments) 511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineBindPoint getPipelineBindPoint (void) const { return m_pipelineBindPoint; } 515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkSubpassDescriptionFlags getFlags (void) const { return m_flags; } 516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& getInputAttachments (void) const { return m_inputAttachments; } 517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& getColorAttachments (void) const { return m_colorAttachments; } 518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& getResolveAttachments (void) const { return m_resolveAttachments; } 519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& getDepthStencilAttachment (void) const { return m_depthStencilAttachment; } 52058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const vector<deUint32>& getPreserveAttachments (void) const { return m_preserveAttachments; } 521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineBindPoint m_pipelineBindPoint; 524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkSubpassDescriptionFlags m_flags; 525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> m_inputAttachments; 527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> m_colorAttachments; 528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> m_resolveAttachments; 529c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference m_depthStencilAttachment; 530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 53158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32> m_preserveAttachments; 532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassDependency 535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi SubpassDependency (deUint32 srcPass, 538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 dstPass, 539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags srcStageMask, 541c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags dstStageMask, 542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 54368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags outputMask, 54468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags inputMask, 545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 54668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDependencyFlags flags) 547c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_srcPass (srcPass) 548c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_dstPass (dstPass) 549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 550c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_srcStageMask (srcStageMask) 551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_dstStageMask (dstStageMask) 552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_outputMask (outputMask) 554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_inputMask (inputMask) 55568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos , m_flags (flags) 556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getSrcPass (void) const { return m_srcPass; } 560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getDstPass (void) const { return m_dstPass; } 561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags getSrcStageMask (void) const { return m_srcStageMask; } 563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags getDstStageMask (void) const { return m_dstStageMask; } 564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 56568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags getOutputMask (void) const { return m_outputMask; } 56668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags getInputMask (void) const { return m_inputMask; } 567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 56868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDependencyFlags getFlags (void) const { return m_flags; } 569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 m_srcPass; 572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 m_dstPass; 573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags m_srcStageMask; 575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags m_dstStageMask; 576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 57768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags m_outputMask; 57868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags m_inputMask; 57968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDependencyFlags m_flags; 580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass Attachment 583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 58558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Attachment (VkFormat format, 58658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkSampleCountFlagBits samples, 587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 58858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkAttachmentLoadOp loadOp, 58958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkAttachmentStoreOp storeOp, 590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 59158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkAttachmentLoadOp stencilLoadOp, 59258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkAttachmentStoreOp stencilStoreOp, 593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 59458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkImageLayout initialLayout, 59558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkImageLayout finalLayout) 596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_format (format) 597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_samples (samples) 598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_loadOp (loadOp) 600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_storeOp (storeOp) 601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_stencilLoadOp (stencilLoadOp) 603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_stencilStoreOp (stencilStoreOp) 604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_initialLayout (initialLayout) 606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_finalLayout (finalLayout) 607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 61068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkFormat getFormat (void) const { return m_format; } 61168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSampleCountFlagBits getSamples (void) const { return m_samples; } 612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 61368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentLoadOp getLoadOp (void) const { return m_loadOp; } 61468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentStoreOp getStoreOp (void) const { return m_storeOp; } 615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 61768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentLoadOp getStencilLoadOp (void) const { return m_stencilLoadOp; } 61868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentStoreOp getStencilStoreOp (void) const { return m_stencilStoreOp; } 619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 62068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout getInitialLayout (void) const { return m_initialLayout; } 62168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout getFinalLayout (void) const { return m_finalLayout; } 622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 62468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkFormat m_format; 62568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSampleCountFlagBits m_samples; 626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 62768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentLoadOp m_loadOp; 62868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentStoreOp m_storeOp; 629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 63068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentLoadOp m_stencilLoadOp; 63168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentStoreOp m_stencilStoreOp; 632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 63368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout m_initialLayout; 63468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout m_finalLayout; 635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass RenderPass 638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RenderPass (const vector<Attachment>& attachments, 641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses, 642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassDependency>& dependencies) 643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_attachments (attachments) 644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_subpasses (subpasses) 645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_dependencies (dependencies) 646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment>& getAttachments (void) const { return m_attachments; } 650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& getSubpasses (void) const { return m_subpasses; } 651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassDependency>& getDependencies (void) const { return m_dependencies; } 652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment> m_attachments; 655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass> m_subpasses; 656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassDependency> m_dependencies; 657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistruct TestConfig 660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi enum RenderTypes 662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RENDERTYPES_NONE = 0, 664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RENDERTYPES_CLEAR = (1<<1), 665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RENDERTYPES_DRAW = (1<<2) 666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 668c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi enum CommandBufferTypes 669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi COMMANDBUFFERTYPES_INLINE = (1<<0), 671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi COMMANDBUFFERTYPES_SECONDARY = (1<<1) 672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi enum ImageMemory 675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi IMAGEMEMORY_STRICT = (1<<0), 677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi IMAGEMEMORY_LAZY = (1<<1) 678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 68058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi TestConfig (const RenderPass& renderPass_, 68158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi RenderTypes renderTypes_, 68258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi CommandBufferTypes commandBufferTypes_, 68358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ImageMemory imageMemory_, 68458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& targetSize_, 68558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& renderPos_, 68658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& renderSize_, 68758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deUint32 seed_) 688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : renderPass (renderPass_) 689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , renderTypes (renderTypes_) 690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , commandBufferTypes (commandBufferTypes_) 691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , imageMemory (imageMemory_) 692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , targetSize (targetSize_) 693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , renderPos (renderPos_) 694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , renderSize (renderSize_) 695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , seed (seed_) 696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RenderPass renderPass; 700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RenderTypes renderTypes; 701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi CommandBufferTypes commandBufferTypes; 702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ImageMemory imageMemory; 703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 targetSize; 704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 renderPos; 705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 renderSize; 706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 seed; 707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 709c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::RenderTypes operator| (TestConfig::RenderTypes a, TestConfig::RenderTypes b) 710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return (TestConfig::RenderTypes)(((deUint32)a) | ((deUint32)b)); 712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 714c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::CommandBufferTypes operator| (TestConfig::CommandBufferTypes a, TestConfig::CommandBufferTypes b) 715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return (TestConfig::CommandBufferTypes)(((deUint32)a) | ((deUint32)b)); 717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 719c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::ImageMemory operator| (TestConfig::ImageMemory a, TestConfig::ImageMemory b) 720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return (TestConfig::ImageMemory)(((deUint32)a) | ((deUint32)b)); 722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid logRenderPassInfo (TestLog& log, 725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPass) 726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection section (log, "RenderPass", "RenderPass"); 728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection attachmentsSection (log, "Attachments", "Attachments"); 731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment>& attachments = renderPass.getAttachments(); 732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++) 734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection attachmentSection (log, "Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx)); 736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = attachments[attachmentNdx]; 737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 738c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Format: " << attachment.getFormat() << TestLog::EndMessage; 739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Samples: " << attachment.getSamples() << TestLog::EndMessage; 740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "LoadOp: " << attachment.getLoadOp() << TestLog::EndMessage; 742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "StoreOp: " << attachment.getStoreOp() << TestLog::EndMessage; 743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "StencilLoadOp: " << attachment.getStencilLoadOp() << TestLog::EndMessage; 745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "StencilStoreOp: " << attachment.getStencilStoreOp() << TestLog::EndMessage; 746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 747c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "InitialLayout: " << attachment.getInitialLayout() << TestLog::EndMessage; 748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "FinalLayout: " << attachment.getFinalLayout() << TestLog::EndMessage; 749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 750c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection subpassesSection (log, "Subpasses", "Subpasses"); 754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses = renderPass.getSubpasses(); 755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++) 757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 758c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection subpassSection (log, "Subpass" + de::toString(subpassNdx), "Subpass " + de::toString(subpassNdx)); 759c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = subpasses[subpassNdx]; 760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 761c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& inputAttachments = subpass.getInputAttachments(); 762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& colorAttachments = subpass.getColorAttachments(); 763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& resolveAttachments = subpass.getResolveAttachments(); 76458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const vector<deUint32>& preserveAttachments = subpass.getPreserveAttachments(); 765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!inputAttachments.empty()) 767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 76858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::ScopedLogSection inputAttachmentsSection (log, "Inputs", "Inputs"); 769c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t inputNdx = 0; inputNdx < inputAttachments.size(); inputNdx++) 771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 77258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::ScopedLogSection inputAttachmentSection (log, "Input" + de::toString(inputNdx), "Input " + de::toString(inputNdx)); 77358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const AttachmentReference& inputAttachment = inputAttachments[inputNdx]; 774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Attachment: " << inputAttachment.getAttachment() << TestLog::EndMessage; 776c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Layout: " << inputAttachment.getImageLayout() << TestLog::EndMessage; 777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 779c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 78258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::ScopedLogSection depthStencilAttachmentSection (log, "DepthStencil", "DepthStencil"); 78358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const AttachmentReference& depthStencilAttachment = subpass.getDepthStencilAttachment(); 784c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 785c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Attachment: " << depthStencilAttachment.getAttachment() << TestLog::EndMessage; 786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Layout: " << depthStencilAttachment.getImageLayout() << TestLog::EndMessage; 787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 788c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 789c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!colorAttachments.empty()) 790c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 79158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::ScopedLogSection colorAttachmentsSection (log, "Colors", "Colors"); 792c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 793c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t colorNdx = 0; colorNdx < colorAttachments.size(); colorNdx++) 794c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 79558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::ScopedLogSection colorAttachmentSection (log, "Color" + de::toString(colorNdx), "Color " + de::toString(colorNdx)); 79658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const AttachmentReference& colorAttachment = colorAttachments[colorNdx]; 797c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 798c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Attachment: " << colorAttachment.getAttachment() << TestLog::EndMessage; 799c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Layout: " << colorAttachment.getImageLayout() << TestLog::EndMessage; 800c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 801c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!resolveAttachments.empty()) 804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 80558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::ScopedLogSection resolveAttachmentsSection (log, "Resolves", "Resolves"); 806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t resolveNdx = 0; resolveNdx < resolveAttachments.size(); resolveNdx++) 808c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 80958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::ScopedLogSection resolveAttachmentSection (log, "Resolve" + de::toString(resolveNdx), "Resolve " + de::toString(resolveNdx)); 81058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const AttachmentReference& resolveAttachment = resolveAttachments[resolveNdx]; 811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Attachment: " << resolveAttachment.getAttachment() << TestLog::EndMessage; 813c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Layout: " << resolveAttachment.getImageLayout() << TestLog::EndMessage; 814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!preserveAttachments.empty()) 818c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 81958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::ScopedLogSection preserveAttachmentsSection (log, "Preserves", "Preserves"); 820c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t preserveNdx = 0; preserveNdx < preserveAttachments.size(); preserveNdx++) 822c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 82358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::ScopedLogSection preserveAttachmentSection (log, "Preserve" + de::toString(preserveNdx), "Preserve " + de::toString(preserveNdx)); 82458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 preserveAttachment = preserveAttachments[preserveNdx]; 825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 82658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi log << TestLog::Message << "Attachment: " << preserveAttachment << TestLog::EndMessage; 827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 832c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 833c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!renderPass.getDependencies().empty()) 834c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection dependenciesSection (log, "Dependencies", "Dependencies"); 836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t depNdx = 0; depNdx < renderPass.getDependencies().size(); depNdx++) 838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection dependencySection (log, "Dependency" + de::toString(depNdx), "Dependency " + de::toString(depNdx)); 840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassDependency& dep = renderPass.getDependencies()[depNdx]; 841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Source: " << dep.getSrcPass() << TestLog::EndMessage; 843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Destination: " << dep.getDstPass() << TestLog::EndMessage; 844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Source Stage Mask: " << dep.getSrcStageMask() << TestLog::EndMessage; 846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Destination Stage Mask: " << dep.getDstStageMask() << TestLog::EndMessage; 847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Input Mask: " << dep.getInputMask() << TestLog::EndMessage; 849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Output Mask: " << dep.getOutputMask() << TestLog::EndMessage; 85068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos log << TestLog::Message << "Dependency Flags: " << getDependencyFlagsStr(dep.getFlags()) << TestLog::EndMessage; 851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string clearColorToString (VkFormat vkFormat, VkClearColorValue value) 856c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 857c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(vkFormat); 858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 859c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::BVec4 channelMask = tcu::getTextureFormatChannelMask(format); 860c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 861c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi std::ostringstream stream; 862c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 863c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "("; 864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 865c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (channelClass) 866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int i = 0; i < 4; i++) 869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (i > 0) 871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ", "; 872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (channelMask[i]) 874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << value.int32[i]; 875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 876c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "Undef"; 877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 879c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 880c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int i = 0; i < 4; i++) 882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (i > 0) 884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ", "; 885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (channelMask[i]) 887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << value.uint32[i]; 888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "Undef"; 890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int i = 0; i < 4; i++) 897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (i > 0) 899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ", "; 900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (channelMask[i]) 902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << value.float32[i]; 903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "Undef"; 905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown channel class"); 910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ")"; 913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return stream.str(); 915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string clearValueToString (VkFormat vkFormat, VkClearValue value) 918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(vkFormat); 920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 921c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order) || tcu::hasDepthComponent(format.order)) 922c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 923c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi std::ostringstream stream; 924c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 925c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "("; 926c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 927c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order)) 928c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "stencil: " << value.depthStencil.stencil; 929c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 930c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order) && tcu::hasDepthComponent(format.order)) 931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ", "; 932c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 933c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order)) 934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "depth: " << value.depthStencil.depth; 935c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ")"; 937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 938c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return stream.str(); 939c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 941c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return clearColorToString(vkFormat, value.color); 942c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 943c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 944c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkClearColorValue randomColorClearValue (const Attachment& attachment, de::Random& rng) 945c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 946c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clearNan = tcu::Float32::nan().asFloat(); 947c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 948c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::BVec4 channelMask = tcu::getTextureFormatChannelMask(format); 950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkClearColorValue clearColor; 951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (channelClass) 953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 956c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int ndx = 0; ndx < 4; ndx++) 957c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!channelMask[ndx]) 959c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearColor.int32[ndx] = std::numeric_limits<deInt32>::min(); 960c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 96158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi clearColor.uint32[ndx] = rng.getBool() ? 1u : 0u; 962c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 963c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 964c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 965c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 966c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 967c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int ndx = 0; ndx < 4; ndx++) 969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!channelMask[ndx]) 971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearColor.uint32[ndx] = std::numeric_limits<deUint32>::max(); 972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 97358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi clearColor.uint32[ndx] = rng.getBool() ? 1u : 0u; 974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int ndx = 0; ndx < 4; ndx++) 983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!channelMask[ndx]) 985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearColor.float32[ndx] = clearNan; 986c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 98758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi clearColor.float32[ndx] = rng.getBool() ? 1.0f : 0.0f; 988c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 989c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 990c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 991c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 992c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown channel class"); 994c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 995c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return clearColor; 997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 998c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 999c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkAttachmentDescription createAttachmentDescription (const Attachment& attachment) 1000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentDescription attachmentDescription = 1002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 100358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0, // flags 1004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 100558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachment.getFormat(), // format 100658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachment.getSamples(), // samples 1007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 100858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachment.getLoadOp(), // loadOp 100958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachment.getStoreOp(), // storeOp 1010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 101158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachment.getStencilLoadOp(), // stencilLoadOp 101258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachment.getStencilStoreOp(), // stencilStoreOp 1013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 101458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachment.getInitialLayout(), // initialLayout 101558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachment.getFinalLayout(), // finalLayout 1016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return attachmentDescription; 1019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1021c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkAttachmentReference createAttachmentReference (const AttachmentReference& referenceInfo) 1022c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentReference reference = 1024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi referenceInfo.getAttachment(), // attachment; 1026c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi referenceInfo.getImageLayout() // layout; 1027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return reference; 1030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1032c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkSubpassDescription createSubpassDescription (const Subpass& subpass, 1033689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vector<VkAttachmentReference>* attachmentReferenceLists, 1034689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vector<deUint32>* preserveAttachmentReferences) 1035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 103668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vector<VkAttachmentReference>& inputAttachmentReferences = attachmentReferenceLists[0]; 103768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vector<VkAttachmentReference>& colorAttachmentReferences = attachmentReferenceLists[1]; 103868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vector<VkAttachmentReference>& resolveAttachmentReferences = attachmentReferenceLists[2]; 103968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vector<VkAttachmentReference>& depthStencilAttachmentReferences = attachmentReferenceLists[3]; 1040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++) 1042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.push_back(createAttachmentReference(subpass.getColorAttachments()[attachmentNdx])); 1043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getInputAttachments().size(); attachmentNdx++) 1045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi inputAttachmentReferences.push_back(createAttachmentReference(subpass.getInputAttachments()[attachmentNdx])); 1046c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1047c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getResolveAttachments().size(); attachmentNdx++) 1048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi resolveAttachmentReferences.push_back(createAttachmentReference(subpass.getResolveAttachments()[attachmentNdx])); 1049c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 105068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos depthStencilAttachmentReferences.push_back(createAttachmentReference(subpass.getDepthStencilAttachment())); 105168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1052c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getPreserveAttachments().size(); attachmentNdx++) 105358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi preserveAttachmentReferences->push_back(subpass.getPreserveAttachments()[attachmentNdx]); 1054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(resolveAttachmentReferences.empty() || colorAttachmentReferences.size() == resolveAttachmentReferences.size()); 1056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 105868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSubpassDescription subpassDescription = 1059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1060689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos subpass.getFlags(), // flags; 1061689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos subpass.getPipelineBindPoint(), // pipelineBindPoint; 1062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1063689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)inputAttachmentReferences.size(), // inputCount; 1064689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos inputAttachmentReferences.empty() ? DE_NULL : &inputAttachmentReferences[0], // inputAttachments; 1065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1066689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)colorAttachmentReferences.size(), // colorCount; 1067689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos colorAttachmentReferences.empty() ? DE_NULL : &colorAttachmentReferences[0], // colorAttachments; 1068689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos resolveAttachmentReferences.empty() ? DE_NULL : &resolveAttachmentReferences[0], // resolveAttachments; 1069c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1070689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos &depthStencilAttachmentReferences[0], // pDepthStencilAttachment; 1071689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)preserveAttachmentReferences->size(), // preserveCount; 1072689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos preserveAttachmentReferences->empty() ? DE_NULL : &(*preserveAttachmentReferences)[0] // preserveAttachments; 1073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 107568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return subpassDescription; 1076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1078c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1079c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkSubpassDependency createSubpassDependency (const SubpassDependency& dependencyInfo) 1080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkSubpassDependency dependency = 1082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 108358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi dependencyInfo.getSrcPass(), // srcSubpass; 108458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi dependencyInfo.getDstPass(), // destSubpass; 1085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 108658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi dependencyInfo.getSrcStageMask(), // srcStageMask; 108758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi dependencyInfo.getDstStageMask(), // destStageMask; 1088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 108958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi dependencyInfo.getOutputMask(), // outputMask; 109058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi dependencyInfo.getInputMask(), // inputMask; 1091c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 109258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi dependencyInfo.getFlags() // dependencyFlags; 1093c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1094c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1095c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return dependency; 1096c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1097c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1098c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkRenderPass> createRenderPass (const DeviceInterface& vk, 1099c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1100c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPassInfo) 1101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1102689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const size_t perSubpassAttachmentReferenceLists = 4; 1103c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkAttachmentDescription> attachments; 1104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkSubpassDescription> subpasses; 1105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkSubpassDependency> dependencies; 1106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<vector<VkAttachmentReference> > attachmentReferenceLists(renderPassInfo.getSubpasses().size() * perSubpassAttachmentReferenceLists); 1107689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vector<vector<deUint32> > preserveAttachments(renderPassInfo.getSubpasses().size()); 1108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 1110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachments.push_back(createAttachmentDescription(renderPassInfo.getAttachments()[attachmentNdx])); 1111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++) 1113689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos subpasses.push_back(createSubpassDescription(renderPassInfo.getSubpasses()[subpassNdx], &(attachmentReferenceLists[subpassNdx * perSubpassAttachmentReferenceLists]), &preserveAttachments[subpassNdx])); 1114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t depNdx = 0; depNdx < renderPassInfo.getDependencies().size(); depNdx++) 1116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dependencies.push_back(createSubpassDependency(renderPassInfo.getDependencies()[depNdx])); 1117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 111968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkRenderPassCreateInfo createInfo = 112068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 112168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, 112268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, 112368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkRenderPassCreateFlags)0u, 112468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (deUint32)attachments.size(), 112568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (attachments.empty() ? DE_NULL : &attachments[0]), 112668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (deUint32)subpasses.size(), 112768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (subpasses.empty() ? DE_NULL : &subpasses[0]), 112868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (deUint32)dependencies.size(), 112968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (dependencies.empty() ? DE_NULL : &dependencies[0]) 113068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }; 113168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 113268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return createRenderPass(vk, device, &createInfo); 1133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1136c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkFramebuffer> createFramebuffer (const DeviceInterface& vk, 1137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkRenderPass renderPass, 1139c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 1140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<VkImageView>& attachments) 1141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 114268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return createFramebuffer(vk, device, 0u, renderPass, (deUint32)attachments.size(), attachments.empty() ? DE_NULL : &attachments[0], size.x(), size.y(), 1u); 1143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1145c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImage> createAttachmentImage (const DeviceInterface& vk, 1146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 queueIndex, 1148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 1149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkFormat format, 115068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSampleCountFlagBits samples, 1151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageUsageFlags usageFlags, 1152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout layout) 1153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 115458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkImageUsageFlags targetUsageFlags = 0; 115558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat textureFormat = mapVkFormat(format); 115658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 115758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(!(tcu::hasDepthComponent(vk::mapVkFormat(format).order) || tcu::hasStencilComponent(vk::mapVkFormat(format).order)) 115858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi || ((usageFlags & vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) == 0)); 115958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 116058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT((tcu::hasDepthComponent(vk::mapVkFormat(format).order) || tcu::hasStencilComponent(vk::mapVkFormat(format).order)) 116158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi || ((usageFlags & vk::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) == 0)); 116294128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos 11639cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan if (tcu::hasDepthComponent(textureFormat.order) || tcu::hasStencilComponent(textureFormat.order)) 11649cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan targetUsageFlags |= vk::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; 116594128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos else 11669cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan targetUsageFlags |= vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 11679cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan 116868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return createImage(vk, device, 116968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkImageCreateFlags)0, 117068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_TYPE_2D, 117168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos format, 117258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::makeExtent3D(size.x(), size.y(), 1u), 117368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u /* mipLevels */, 117468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u /* arraySize */, 117568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos samples, 117668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_TILING_OPTIMAL, 117768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos usageFlags | targetUsageFlags, 117868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SHARING_MODE_EXCLUSIVE, 117968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1, 118068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &queueIndex, 118168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos layout); 1182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<Allocation> createImageMemory (const DeviceInterface& vk, 1185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Allocator& allocator, 1187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImage image, 1188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool lazy) 1189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<Allocation> allocation (allocator.allocate(getImageMemoryRequirements(vk, device, image), lazy ? MemoryRequirement::LazilyAllocated : MemoryRequirement::Any)); 1191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bindImageMemory(vk, device, image, allocation->getMemory(), allocation->getOffset()); 1192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return allocation; 1193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1195c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImageView> createImageAttachmentView (const DeviceInterface& vk, 1196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImage image, 1198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkFormat format, 1199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageAspectFlags aspect) 1200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageSubresourceRange range = 1202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi aspect, 1204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 1205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1, 1206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 1207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 1208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 121068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return createImageView(vk, device, 0u, image, VK_IMAGE_VIEW_TYPE_2D, format, makeComponentMappingRGBA(), range); 1211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1213c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkClearValue randomClearValue (const Attachment& attachment, de::Random& rng) 1214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clearNan = tcu::Float32::nan().asFloat(); 1216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 1217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order) || tcu::hasDepthComponent(format.order)) 1219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkClearValue clearValue; 1221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValue.depthStencil.depth = clearNan; 122358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi clearValue.depthStencil.stencil = 0xCDu; 1224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order)) 122658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi clearValue.depthStencil.stencil = rng.getBool() 122758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ? 0xFFu 122858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi : 0x0u; 1229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order)) 123158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi clearValue.depthStencil.depth = rng.getBool() 123258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ? 1.0f 123358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi : 0.0f; 1234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return clearValue; 1236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 1238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkClearValue clearValue; 1240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValue.color = randomColorClearValue(attachment, rng); 1242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return clearValue; 1244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass AttachmentResources 1248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 125058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentResources (const DeviceInterface& vk, 125158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkDevice device, 125258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Allocator& allocator, 125358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deUint32 queueIndex, 125458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& size, 125558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment& attachmentInfo, 125658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkImageUsageFlags usageFlags) 12575b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser : m_image (createAttachmentImage(vk, device, queueIndex, size, attachmentInfo.getFormat(), attachmentInfo.getSamples(), usageFlags, VK_IMAGE_LAYOUT_UNDEFINED)) 12585b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser , m_imageMemory (createImageMemory(vk, device, allocator, *m_image, ((usageFlags & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) != 0))) 1259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_attachmentView (createImageAttachmentView(vk, device, *m_image, attachmentInfo.getFormat(), getImageAspectFlags(attachmentInfo.getFormat()))) 1260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 126158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachmentInfo.getFormat()); 126258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool isDepthFormat = tcu::hasDepthComponent(format.order); 126358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool isStencilFormat = tcu::hasStencilComponent(format.order); 126458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 126558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (isDepthFormat && isStencilFormat) 1266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 126758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_depthInputAttachmentView = createImageAttachmentView(vk, device, *m_image, attachmentInfo.getFormat(), VK_IMAGE_ASPECT_DEPTH_BIT); 126858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_stencilInputAttachmentView = createImageAttachmentView(vk, device, *m_image, attachmentInfo.getFormat(), VK_IMAGE_ASPECT_STENCIL_BIT); 126958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 127058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_inputAttachmentViews = std::make_pair(*m_depthInputAttachmentView, *m_stencilInputAttachmentView); 127158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 127258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 127358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_inputAttachmentViews = std::make_pair(*m_attachmentView, (vk::VkImageView)0u); 1274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 127558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if ((usageFlags & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) == 0) 127658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 1277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order) && tcu::hasStencilComponent(format.order)) 1278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1279bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz const tcu::TextureFormat depthFormat = getDepthCopyFormat(attachmentInfo.getFormat()); 1280bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz const tcu::TextureFormat stencilFormat = getStencilCopyFormat(attachmentInfo.getFormat()); 1281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_bufferSize = size.x() * size.y() * depthFormat.getPixelSize(); 1283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_secondaryBufferSize = size.x() * size.y() * stencilFormat.getPixelSize(); 1284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 128568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_buffer = createBuffer(vk, device, 0, m_bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex); 1286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_bufferMemory = allocator.allocate(getBufferMemoryRequirements(vk, device, *m_buffer), MemoryRequirement::HostVisible); 1287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bindBufferMemory(vk, device, *m_buffer, m_bufferMemory->getMemory(), m_bufferMemory->getOffset()); 1289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 129068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_secondaryBuffer = createBuffer(vk, device, 0, m_secondaryBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex); 1291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_secondaryBufferMemory = allocator.allocate(getBufferMemoryRequirements(vk, device, *m_secondaryBuffer), MemoryRequirement::HostVisible); 1292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bindBufferMemory(vk, device, *m_secondaryBuffer, m_secondaryBufferMemory->getMemory(), m_secondaryBufferMemory->getOffset()); 1294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 1296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_bufferSize = size.x() * size.y() * format.getPixelSize(); 1298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 129968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_buffer = createBuffer(vk, device, 0, m_bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex); 1300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_bufferMemory = allocator.allocate(getBufferMemoryRequirements(vk, device, *m_buffer), MemoryRequirement::HostVisible); 1301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bindBufferMemory(vk, device, *m_buffer, m_bufferMemory->getMemory(), m_bufferMemory->getOffset()); 1303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 130758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const pair<VkImageView, VkImageView>& getInputAttachmentViews (void) const 130858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 130958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return m_inputAttachmentViews; 131058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 131158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 1312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ~AttachmentResources (void) 1313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageView getAttachmentView (void) const 1317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_attachmentView; 1319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImage getImage (void) const 1322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_image; 1324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkBuffer getBuffer (void) const 1327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(*m_buffer != DE_NULL); 1329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_buffer; 1330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDeviceSize getBufferSize (void) const 1333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(*m_buffer != DE_NULL); 1335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return m_bufferSize; 1336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Allocation& getResultMemory (void) const 1339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(m_bufferMemory); 1341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_bufferMemory; 1342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkBuffer getSecondaryBuffer (void) const 1345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(*m_secondaryBuffer != DE_NULL); 1347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_secondaryBuffer; 1348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDeviceSize getSecondaryBufferSize (void) const 1351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(*m_secondaryBuffer != DE_NULL); 1353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return m_secondaryBufferSize; 1354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Allocation& getSecondaryResultMemory (void) const 1357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(m_secondaryBufferMemory); 1359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_secondaryBufferMemory; 1360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 1363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Unique<VkImage> m_image; 1364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UniquePtr<Allocation> m_imageMemory; 1365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Unique<VkImageView> m_attachmentView; 1366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 136758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Move<VkImageView> m_depthInputAttachmentView; 136858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Move<VkImageView> m_stencilInputAttachmentView; 136958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi pair<VkImageView, VkImageView> m_inputAttachmentViews; 137058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 1371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Move<VkBuffer> m_buffer; 1372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDeviceSize m_bufferSize; 1373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<Allocation> m_bufferMemory; 1374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Move<VkBuffer> m_secondaryBuffer; 1376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDeviceSize m_secondaryBufferSize; 1377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<Allocation> m_secondaryBufferMemory; 1378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid uploadBufferData (const DeviceInterface& vk, 1381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Allocation& memory, 1383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi size_t size, 1384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const void* data) 1385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkMappedMemoryRange range = 1387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // sType; 1389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 1390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi memory.getMemory(), // mem; 1391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi memory.getOffset(), // offset; 1392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (VkDeviceSize)size // size; 1393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void* const ptr = memory.getHostPtr(); 1395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deMemcpy(ptr, data, size); 1397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.flushMappedMemoryRanges(device, 1, &range)); 1398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 140068e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkImageAspectFlagBits getPrimaryImageAspect (tcu::TextureFormat::ChannelOrder order) 1401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST == 21); 1403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (order) 1405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::D: 1407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::DS: 140868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_IMAGE_ASPECT_DEPTH_BIT; 1409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::S: 141168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_IMAGE_ASPECT_STENCIL_BIT; 1412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 141468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_IMAGE_ASPECT_COLOR_BIT; 1415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass RenderQuad 1419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 142158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi RenderQuad (const Vec2& posA, const Vec2& posB) 1422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_vertices(6) 1423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertices[0] = posA; 142558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_vertices[1] = Vec2(posA[0], posB[1]); 1426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertices[2] = posB; 1427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertices[3] = posB; 142958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_vertices[4] = Vec2(posB[0], posA[1]); 1430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertices[5] = posA; 1431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 143358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Vec2& getCornerA (void) const 1434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return m_vertices[0]; 1436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 143858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Vec2& getCornerB (void) const 1439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return m_vertices[2]; 1441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const void* getVertexPointer (void) const 1444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return &m_vertices[0]; 1446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi size_t getVertexDataSize (void) const 1449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 145058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return sizeof(Vec2) * m_vertices.size(); 1451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 145458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<Vec2> m_vertices; 1455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass ColorClear 1458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 146058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ColorClear (const UVec2& offset, 146158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& size, 146258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkClearColorValue& color) 1463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_offset (offset) 1464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_size (size) 1465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_color (color) 1466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 146958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& getOffset (void) const { return m_offset; } 147058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& getSize (void) const { return m_size; } 147158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkClearColorValue& getColor (void) const { return m_color; } 1472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 147458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi UVec2 m_offset; 147558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi UVec2 m_size; 147658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkClearColorValue m_color; 1477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass DepthStencilClear 1480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 148258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DepthStencilClear (const UVec2& offset, 148358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& size, 148458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi float depth, 148558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deUint32 stencil) 1486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_offset (offset) 1487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_size (size) 1488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_depth (depth) 1489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_stencil (stencil) 1490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 149358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& getOffset (void) const { return m_offset; } 149458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& getSize (void) const { return m_size; } 149558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi float getDepth (void) const { return m_depth; } 149658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deUint32 getStencil (void) const { return m_stencil; } 1497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 149958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 m_offset; 150058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 m_size; 1501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 150258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const float m_depth; 150358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 m_stencil; 1504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassRenderInfo 1507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 150958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi SubpassRenderInfo (const RenderPass& renderPass, 151058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deUint32 subpassIndex, 1511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 151258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bool isSecondary_, 1513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 151458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& viewportOffset, 151558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& viewportSize, 1516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 151758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Maybe<RenderQuad>& renderQuad, 151858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const vector<ColorClear>& colorClears, 151958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Maybe<DepthStencilClear>& depthStencilClear) 1520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_viewportOffset (viewportOffset) 1521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_viewportSize (viewportSize) 1522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_subpassIndex (subpassIndex) 1523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_isSecondary (isSecondary_) 1524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_flags (renderPass.getSubpasses()[subpassIndex].getFlags()) 1525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_renderQuad (renderQuad) 1526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_colorClears (colorClears) 1527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_depthStencilClear (depthStencilClear) 1528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_colorAttachments (renderPass.getSubpasses()[subpassIndex].getColorAttachments()) 152958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi , m_inputAttachments (renderPass.getSubpasses()[subpassIndex].getInputAttachments()) 1530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (deUint32 attachmentNdx = 0; attachmentNdx < (deUint32)m_colorAttachments.size(); attachmentNdx++) 1532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_colorAttachmentInfo.push_back(renderPass.getAttachments()[m_colorAttachments[attachmentNdx].getAttachment()]); 1533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 1535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_depthStencilAttachment = tcu::just(renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment()); 1537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_depthStencilAttachmentInfo = tcu::just(renderPass.getAttachments()[renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment().getAttachment()]); 1538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 154158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& getViewportOffset (void) const { return m_viewportOffset; } 154258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& getViewportSize (void) const { return m_viewportSize; } 1543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 154458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deUint32 getSubpassIndex (void) const { return m_subpassIndex; } 154558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bool isSecondary (void) const { return m_isSecondary; } 1546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 154758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Maybe<RenderQuad>& getRenderQuad (void) const { return m_renderQuad; } 154858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const vector<ColorClear>& getColorClears (void) const { return m_colorClears; } 154958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Maybe<DepthStencilClear>& getDepthStencilClear (void) const { return m_depthStencilClear; } 155058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 155158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deUint32 getInputAttachmentCount (void) const { return (deUint32)m_inputAttachments.size(); } 155258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deUint32 getInputAttachmentIndex (deUint32 attachmentNdx) const { return m_inputAttachments[attachmentNdx].getAttachment(); } 15534dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski VkImageLayout getInputAttachmentLayout (deUint32 attachmentNdx) const { return m_inputAttachments[attachmentNdx].getImageLayout(); } 155458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 155558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deUint32 getColorAttachmentCount (void) const { return (deUint32)m_colorAttachments.size(); } 155658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkImageLayout getColorAttachmentLayout (deUint32 attachmentNdx) const { return m_colorAttachments[attachmentNdx].getImageLayout(); } 155758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deUint32 getColorAttachmentIndex (deUint32 attachmentNdx) const { return m_colorAttachments[attachmentNdx].getAttachment(); } 155858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment& getColorAttachment (deUint32 attachmentNdx) const { return m_colorAttachmentInfo[attachmentNdx]; } 155958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Maybe<VkImageLayout> getDepthStencilAttachmentLayout (void) const { return m_depthStencilAttachment ? tcu::just(m_depthStencilAttachment->getImageLayout()) : tcu::nothing<VkImageLayout>(); } 156058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Maybe<deUint32> getDepthStencilAttachmentIndex (void) const { return m_depthStencilAttachment ? tcu::just(m_depthStencilAttachment->getAttachment()) : tcu::nothing<deUint32>(); }; 156158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Maybe<Attachment>& getDepthStencilAttachment (void) const { return m_depthStencilAttachmentInfo; } 156258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkSubpassDescriptionFlags getSubpassFlags (void) const { return m_flags; } 1563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 156558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi UVec2 m_viewportOffset; 156658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi UVec2 m_viewportSize; 1567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 156858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deUint32 m_subpassIndex; 156958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bool m_isSecondary; 157058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkSubpassDescriptionFlags m_flags; 1571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 157258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Maybe<RenderQuad> m_renderQuad; 157358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<ColorClear> m_colorClears; 157458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Maybe<DepthStencilClear> m_depthStencilClear; 1575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 157658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference> m_colorAttachments; 157758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<Attachment> m_colorAttachmentInfo; 1578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 157958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Maybe<AttachmentReference> m_depthStencilAttachment; 158058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Maybe<Attachment> m_depthStencilAttachmentInfo; 158158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 158258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference> m_inputAttachments; 1583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1585c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkPipeline> createSubpassPipeline (const DeviceInterface& vk, 1586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkRenderPass renderPass, 158868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkShaderModule vertexShaderModule, 158968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkShaderModule fragmentShaderModule, 1590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineLayout pipelineLayout, 1591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassRenderInfo& renderInfo) 1592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkSpecializationInfo emptyShaderSpecializations = 1594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // mapEntryCount 1596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pMap 1597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // dataSize 1598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pData 1599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 160168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos Maybe<VkSampleCountFlagBits> rasterSamples; 1602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkPipelineColorBlendAttachmentState> attachmentBlendStates; 1603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (deUint32 attachmentNdx = 0; attachmentNdx < renderInfo.getColorAttachmentCount(); attachmentNdx++) 1605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 160658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment& attachment = renderInfo.getColorAttachment(attachmentNdx); 1607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(!rasterSamples || *rasterSamples == attachment.getSamples()); 1609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi rasterSamples = attachment.getSamples(); 1611c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineColorBlendAttachmentState attachmentBlendState = 1614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 161568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FALSE, // blendEnable 161668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_SRC_ALPHA, // srcBlendColor 161768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, // destBlendColor 161868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_OP_ADD, // blendOpColor 161968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ONE, // srcBlendAlpha 162068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ONE, // destBlendAlpha 162168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_OP_ADD, // blendOpAlpha 162268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COLOR_COMPONENT_R_BIT|VK_COLOR_COMPONENT_G_BIT|VK_COLOR_COMPONENT_B_BIT|VK_COLOR_COMPONENT_A_BIT, // channelWriteMask 1623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentBlendStates.push_back(attachmentBlendState); 1626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.getDepthStencilAttachment()) 1630c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = *renderInfo.getDepthStencilAttachment(); 1632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(!rasterSamples || *rasterSamples == attachment.getSamples()); 1634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi rasterSamples = attachment.getSamples(); 1635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // If there are no attachment use single sample 1638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!rasterSamples) 163968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos rasterSamples = VK_SAMPLE_COUNT_1_BIT; 1640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineShaderStageCreateInfo shaderStages[2] = 1642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // sType 1645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 164668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineShaderStageCreateFlags)0u, 164768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SHADER_STAGE_VERTEX_BIT, // stage 164868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vertexShaderModule, // shader 164968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos "main", 1650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &emptyShaderSpecializations 1651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, 1652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // sType 1654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 165568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineShaderStageCreateFlags)0u, 165668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SHADER_STAGE_FRAGMENT_BIT, // stage 165768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos fragmentShaderModule, // shader 165868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos "main", 1659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &emptyShaderSpecializations 1660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkVertexInputBindingDescription vertexBinding = 1663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // binding 166558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi (deUint32)sizeof(tcu::Vec2), // strideInBytes 166668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_VERTEX_INPUT_RATE_VERTEX, // stepRate 1667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1668c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkVertexInputAttributeDescription vertexAttrib = 1669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // location 1671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // binding 16726971d4702d10f7b89483a663cb8d9df407b18075Slawomir Cygan VK_FORMAT_R32G32_SFLOAT, // format 1673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // offsetInBytes 1674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineVertexInputStateCreateInfo vertexInputState = 1676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // sType 1678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 167968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineVertexInputStateCreateFlags)0u, 1680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1u, // bindingCount 1681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &vertexBinding, // pVertexBindingDescriptions 1682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1u, // attributeCount 1683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &vertexAttrib, // pVertexAttributeDescriptions 1684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineInputAssemblyStateCreateInfo inputAssemblyState = 1686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1687c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // sType 1688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 168968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineInputAssemblyStateCreateFlags)0u, 1690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // topology 1691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // primitiveRestartEnable 1692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkViewport viewport = 1694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (float)renderInfo.getViewportOffset().x(), (float)renderInfo.getViewportOffset().y(), 1696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y(), 1697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0.0f, 1.0f 1698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkRect2D scissor = 1700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { (deInt32)renderInfo.getViewportOffset().x(), (deInt32)renderInfo.getViewportOffset().y() }, 1702689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { renderInfo.getViewportSize().x(), renderInfo.getViewportSize().y() } 1703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineViewportStateCreateInfo viewportState = 1705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, 1707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 170868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineViewportStateCreateFlags)0u, 1709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1u, 1710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &viewport, 1711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1u, 1712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &scissor 1713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 171468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkPipelineRasterizationStateCreateInfo rasterState = 1715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 171668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // sType 1717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 171868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineRasterizationStateCreateFlags)0u, 1719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_TRUE, // depthClipEnable 1720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // rasterizerDiscardEnable 172168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_POLYGON_MODE_FILL, // fillMode 1722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CULL_MODE_NONE, // cullMode 172368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FRONT_FACE_COUNTER_CLOCKWISE, // frontFace 1724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // depthBiasEnable 1725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0.0f, // depthBias 1726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0.0f, // depthBiasClamp 1727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0.0f, // slopeScaledDepthBias 1728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1.0f // lineWidth 1729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineMultisampleStateCreateInfo multisampleState = 1731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // sType 1733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 173468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineMultisampleStateCreateFlags)0u, 1735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *rasterSamples, // rasterSamples 1736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // sampleShadingEnable 1737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0.0f, // minSampleShading 173868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pSampleMask 173968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FALSE, // alphaToCoverageEnable 174068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FALSE, // alphaToOneEnable 1741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 174258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t stencilIndex = renderInfo.getSubpassIndex(); 1743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineDepthStencilStateCreateInfo depthStencilState = 1744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // sType 1746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 174768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineDepthStencilStateCreateFlags)0u, 1748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_TRUE, // depthTestEnable 1749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_TRUE, // depthWriteEnable 1750c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_COMPARE_OP_ALWAYS, // depthCompareOp 1751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // depthBoundsEnable 1752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_TRUE, // stencilTestEnable 1753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilFailOp 1755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilPassOp 1756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilDepthFailOp 1757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_COMPARE_OP_ALWAYS, // stencilCompareOp 1758c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ~0u, // stencilCompareMask 1759c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ~0u, // stencilWriteMask 176058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ((stencilIndex % 2) == 0) ? ~0x0u : 0x0u // stencilReference 1761c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, // front 1762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilFailOp 1764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilPassOp 1765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilDepthFailOp 1766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_COMPARE_OP_ALWAYS, // stencilCompareOp 1767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ~0u, // stencilCompareMask 1768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ~0u, // stencilWriteMask 176958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ((stencilIndex % 2) == 0) ? ~0x0u : 0x0u // stencilReference 1770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, // back 1771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1772ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski 0.0f, // minDepthBounds; 1773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1.0f // maxDepthBounds; 1774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineColorBlendStateCreateInfo blendState = 1776c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // sType 1778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 177968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineColorBlendStateCreateFlags)0u, 1780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // logicOpEnable 1781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_LOGIC_OP_COPY, // logicOp 1782c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (deUint32)attachmentBlendStates.size(), // attachmentCount 1783c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentBlendStates.empty() ? DE_NULL : &attachmentBlendStates[0],// pAttachments 1784c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 0.0f, 0.0f, 0.0f, 0.0f } // blendConst 1785c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkGraphicsPipelineCreateInfo createInfo = 1787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 178858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // sType 178958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL, // pNext 179068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineCreateFlags)0u, 1791c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 179258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 2, // stageCount 179358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi shaderStages, // pStages 179458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 179558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi &vertexInputState, // pVertexInputState 179658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi &inputAssemblyState, // pInputAssemblyState 179758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL, // pTessellationState 179858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi &viewportState, // pViewportState 179958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi &rasterState, // pRasterState 180058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi &multisampleState, // pMultisampleState 180158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi &depthStencilState, // pDepthStencilState 180258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi &blendState, // pColorBlendState 180358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi (const VkPipelineDynamicStateCreateInfo*)DE_NULL, // pDynamicState 180458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi pipelineLayout, // layout 180558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 180658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi renderPass, // renderPass 180758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi renderInfo.getSubpassIndex(), // subpass 180858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL, // basePipelineHandle 180958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0u // basePipelineIndex 1810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return createGraphicsPipeline(vk, device, DE_NULL, &createInfo); 1813c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassRenderer 1816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 181858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi SubpassRenderer (Context& context, 181958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const DeviceInterface& vk, 182058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkDevice device, 182158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Allocator& allocator, 182258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkRenderPass renderPass, 182358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkFramebuffer framebuffer, 182458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkCommandPool commandBufferPool, 182558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deUint32 queueFamilyIndex, 182658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const vector<VkImage>& attachmentImages, 182758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const vector<pair<VkImageView, VkImageView> >& attachmentViews, 182858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const SubpassRenderInfo& renderInfo, 182958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const vector<Attachment>& attachmentInfos) 1830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_renderInfo (renderInfo) 1831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 183258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 subpassIndex = renderInfo.getSubpassIndex(); 183358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<VkDescriptorSetLayoutBinding> bindings; 183458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 183558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 colorAttachmentNdx = 0; colorAttachmentNdx < renderInfo.getColorAttachmentCount(); colorAttachmentNdx++) 183658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_colorAttachmentImages.push_back(attachmentImages[renderInfo.getColorAttachmentIndex(colorAttachmentNdx)]); 183758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 183858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (renderInfo.getDepthStencilAttachmentIndex()) 183958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_depthStencilAttachmentImage = attachmentImages[*renderInfo.getDepthStencilAttachmentIndex()]; 1840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.getRenderQuad()) 1842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 184358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const RenderQuad& renderQuad = *renderInfo.getRenderQuad(); 184458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 184558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (renderInfo.getInputAttachmentCount() > 0) 184658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 184758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deUint32 bindingIndex = 0; 184858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 184958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 inputAttachmentNdx = 0; inputAttachmentNdx < renderInfo.getInputAttachmentCount(); inputAttachmentNdx++) 185058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 185158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment attachmentInfo = attachmentInfos[renderInfo.getInputAttachmentIndex(inputAttachmentNdx)]; 185258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachmentInfo.getFormat()); 185358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool isDepthFormat = tcu::hasDepthComponent(format.order); 185458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool isStencilFormat = tcu::hasStencilComponent(format.order); 185558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 bindingCount = isDepthFormat && isStencilFormat ? 2u : 1u; 185658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 185758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 bindingNdx = 0; bindingNdx < bindingCount; bindingNdx++) 185858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 185958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkDescriptorSetLayoutBinding binding = 186058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 186158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bindingIndex, 186258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 186358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 1u, 186458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_SHADER_STAGE_FRAGMENT_BIT, 186558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL 186658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 186758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 186858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bindings.push_back(binding); 186958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bindingIndex++; 187058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 187158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 187258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 187358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkDescriptorSetLayoutCreateInfo createInfo = 187458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 187558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, 187658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL, 187758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 187858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0u, 187958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi (deUint32)bindings.size(), 188058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi &bindings[0] 188158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 188258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 188358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_descriptorSetLayout = vk::createDescriptorSetLayout(vk, device, &createInfo); 188458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 188558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 188658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkDescriptorSetLayout descriptorSetLayout = *m_descriptorSetLayout; 1887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineLayoutCreateInfo pipelineLayoutParams = 1888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 188958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType; 189058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL, // pNext; 189168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (vk::VkPipelineLayoutCreateFlags)0, 189258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_descriptorSetLayout ? 1u :0u , // setLayoutCount; 189358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_descriptorSetLayout ? &descriptorSetLayout : DE_NULL, // pSetLayouts; 189458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0u, // pushConstantRangeCount; 189558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL, // pPushConstantRanges; 1896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertexShaderModule = createShaderModule(vk, device, context.getBinaryCollection().get(de::toString(subpassIndex) + "-vert"), 0u); 1899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_fragmentShaderModule = createShaderModule(vk, device, context.getBinaryCollection().get(de::toString(subpassIndex) + "-frag"), 0u); 1900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_pipelineLayout = createPipelineLayout(vk, device, &pipelineLayoutParams); 190168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_pipeline = createSubpassPipeline(vk, device, renderPass, *m_vertexShaderModule, *m_fragmentShaderModule, *m_pipelineLayout, m_renderInfo); 1902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 190368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_vertexBuffer = createBuffer(vk, device, 0u, (VkDeviceSize)renderQuad.getVertexDataSize(), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_SHARING_MODE_EXCLUSIVE, 1u, &queueFamilyIndex); 1904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertexBufferMemory = allocator.allocate(getBufferMemoryRequirements(vk, device, *m_vertexBuffer), MemoryRequirement::HostVisible); 1905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bindBufferMemory(vk, device, *m_vertexBuffer, m_vertexBufferMemory->getMemory(), m_vertexBufferMemory->getOffset()); 1907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi uploadBufferData(vk, device, *m_vertexBufferMemory, renderQuad.getVertexDataSize(), renderQuad.getVertexPointer()); 190858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 190958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (renderInfo.getInputAttachmentCount() > 0) 191058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 191158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 191258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkDescriptorPoolSize poolSize = 191358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 191458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 191558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi // \note Reserve 2 per input attachment since depthStencil attachments require 2. 191658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi renderInfo.getInputAttachmentCount() * 2u 191758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 191858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkDescriptorPoolCreateInfo createInfo = 191958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 192058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, 192158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL, 192258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 192358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 192458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi // \note Reserve 2 per input attachment since depthStencil attachments require 2. 192558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi renderInfo.getInputAttachmentCount() * 2u, 192658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 1u, 192758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi &poolSize 192858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 192958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 193058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_descriptorPool = vk::createDescriptorPool(vk, device, &createInfo); 193158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 193258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 193358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkDescriptorSetAllocateInfo allocateInfo = 193458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 193558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, 193658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL, 193758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 193858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi *m_descriptorPool, 193958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 1u, 194058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi &descriptorSetLayout 194158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 194258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 194358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_descriptorSet = vk::allocateDescriptorSet(vk, device, &allocateInfo); 194458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 194558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 194658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<VkWriteDescriptorSet> writes (bindings.size()); 194758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<VkDescriptorImageInfo> imageInfos (bindings.size()); 194858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deUint32 bindingIndex = 0; 194958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 195058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 inputAttachmentNdx = 0; inputAttachmentNdx < renderInfo.getInputAttachmentCount(); inputAttachmentNdx++) 195158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 19524dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski const Attachment attachmentInfo = attachmentInfos[renderInfo.getInputAttachmentIndex(inputAttachmentNdx)]; 19534dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski const tcu::TextureFormat format = mapVkFormat(attachmentInfo.getFormat()); 19544dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski const bool isDepthFormat = tcu::hasDepthComponent(format.order); 19554dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski const bool isStencilFormat = tcu::hasStencilComponent(format.order); 19564dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski const VkImageLayout inputAttachmentLayout = renderInfo.getInputAttachmentLayout(inputAttachmentNdx); 195758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 195858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (isDepthFormat && isStencilFormat) 195958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 196058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 196158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkDescriptorImageInfo imageInfo = 196258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 196358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi (VkSampler)0, 196458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachmentViews[renderInfo.getInputAttachmentIndex(inputAttachmentNdx)].first, 19654dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski inputAttachmentLayout 196658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 196758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi imageInfos[bindingIndex] = imageInfo; 196858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 196958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 197058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkWriteDescriptorSet write = 197158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 197258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 197358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL, 197458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 197558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi *m_descriptorSet, 197658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bindingIndex, 197758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0u, 197858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 1u, 197958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 198058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi &imageInfos[bindingIndex], 198158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL, 198258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL 198358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 198458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi writes[bindingIndex] = write; 198558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 198658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bindingIndex++; 198758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 198858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 198958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 199058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkDescriptorImageInfo imageInfo = 199158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 199258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi (VkSampler)0, 199358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachmentViews[renderInfo.getInputAttachmentIndex(inputAttachmentNdx)].second, 19944dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski inputAttachmentLayout 199558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 199658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi imageInfos[bindingIndex] = imageInfo; 199758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 199858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 199958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkWriteDescriptorSet write = 200058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 200158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 200258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL, 200358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 200458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi *m_descriptorSet, 200558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bindingIndex, 200658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0u, 200758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 1u, 200858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 200958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi &imageInfos[bindingIndex], 201058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL, 201158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL 201258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 201358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi writes[bindingIndex] = write; 201458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 201558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bindingIndex++; 201658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 201758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 201858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 201958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 202058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 202158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkDescriptorImageInfo imageInfo = 202258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 202358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi (VkSampler)0, 202458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachmentViews[renderInfo.getInputAttachmentIndex(inputAttachmentNdx)].first, 20254dc05bb513737e5e05a93b181686aad7a82e3ebbIgor Ostrowski inputAttachmentLayout 202658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 202758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi imageInfos[bindingIndex] = imageInfo; 202858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 202958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 203058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkWriteDescriptorSet write = 203158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 203258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 203358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL, 203458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 203558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi *m_descriptorSet, 203658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bindingIndex, 203758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0u, 203858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 1u, 203958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 204058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi &imageInfos[bindingIndex], 204158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL, 204258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL 204358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 204458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi writes[bindingIndex] = write; 204558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 204658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bindingIndex++; 204758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 204858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 204958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 205058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 205158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk.updateDescriptorSets(device, (deUint32)writes.size(), &writes[0], 0u, DE_NULL); 205258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 205358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 2054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.isSecondary()) 2057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 205868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_commandBuffer = allocateCommandBuffer(vk, device, commandBufferPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY); 2059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 206057b41652a8af472d28943d13924edc3a32ec3884scygan beginCommandBuffer(vk, *m_commandBuffer, vk::VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, renderPass, subpassIndex, framebuffer, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0); 2061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pushRenderCommands(vk, *m_commandBuffer); 2062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi endCommandBuffer(vk, *m_commandBuffer); 2063c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool isSecondary (void) const 2067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return m_commandBuffer; 2069c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 207168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer getCommandBuffer (void) const 2072c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(isSecondary()); 2074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_commandBuffer; 2075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void pushRenderCommands (const DeviceInterface& vk, 207868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer commandBuffer) 2079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!m_renderInfo.getColorClears().empty()) 2081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<ColorClear>& colorClears (m_renderInfo.getColorClears()); 2083c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2084c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (deUint32 attachmentNdx = 0; attachmentNdx < m_renderInfo.getColorAttachmentCount(); attachmentNdx++) 2085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2086c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const ColorClear& colorClear = colorClears[attachmentNdx]; 208768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkClearAttachment attachment = 2088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 208968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_ASPECT_COLOR_BIT, 209068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachmentNdx, 209168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos makeClearValue(colorClear.getColor()), 209268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }; 209368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkClearRect rect = 209468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 209568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 209668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { (deInt32)colorClear.getOffset().x(), (deInt32)colorClear.getOffset().y() }, 2097689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { colorClear.getSize().x(), colorClear.getSize().y() } 209868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }, // rect 209968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // baseArrayLayer 210068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // layerCount 2101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2102c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 210368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdClearAttachments(commandBuffer, 1u, &attachment, 1u, &rect); 2104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (m_renderInfo.getDepthStencilClear()) 2108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 210958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const DepthStencilClear& depthStencilClear = *m_renderInfo.getDepthStencilClear(); 211058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentNdx = m_renderInfo.getColorAttachmentCount(); 211158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi tcu::TextureFormat format = mapVkFormat(m_renderInfo.getDepthStencilAttachment()->getFormat()); 211258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkClearAttachment attachment = 2113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 21144c7a3aad422a9a456debcbf83f0af165c2471f5cscygan (VkImageAspectFlags)((hasDepthComponent(format.order) ? VK_IMAGE_ASPECT_DEPTH_BIT : 0) 21154c7a3aad422a9a456debcbf83f0af165c2471f5cscygan | (hasStencilComponent(format.order) ? VK_IMAGE_ASPECT_STENCIL_BIT : 0)), 211668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachmentNdx, 211768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos makeClearValueDepthStencil(depthStencilClear.getDepth(), depthStencilClear.getStencil()) 2118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 211968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkClearRect rect = 2120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 212168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 212268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { (deInt32)depthStencilClear.getOffset().x(), (deInt32)depthStencilClear.getOffset().y() }, 2123689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { depthStencilClear.getSize().x(), depthStencilClear.getSize().y() } 212468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }, // rect 212568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // baseArrayLayer 212668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // layerCount 2127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 212968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdClearAttachments(commandBuffer, 1u, &attachment, 1u, &rect); 2130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 213258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<VkImageMemoryBarrier> selfDeps; 213358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkPipelineStageFlags srcStages = 0; 213458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkPipelineStageFlags dstStages = 0; 213558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 213658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 inputAttachmentNdx = 0; inputAttachmentNdx < m_renderInfo.getInputAttachmentCount(); inputAttachmentNdx++) 213758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 213858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 colorAttachmentNdx = 0; colorAttachmentNdx < m_renderInfo.getColorAttachmentCount(); colorAttachmentNdx++) 213958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 214058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (m_renderInfo.getInputAttachmentIndex(inputAttachmentNdx) == m_renderInfo.getColorAttachmentIndex(colorAttachmentNdx)) 214158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 214258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageMemoryBarrier barrier = 214358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 214458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType 214558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_NULL, // pNext 214658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 214758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, // srcAccessMask 214858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, // dstAccessMask 214958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 215058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_GENERAL, // oldLayout 215158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_GENERAL, // newLayout 215258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 215358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex 215458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_QUEUE_FAMILY_IGNORED, // destQueueFamilyIndex 215558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 215658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_colorAttachmentImages[colorAttachmentNdx], // image 215758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { // subresourceRange 215858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_ASPECT_COLOR_BIT, // aspect 215958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0, // baseMipLevel 216058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 1, // mipLevels 216158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0, // baseArraySlice 216258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 1 // arraySize 216358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 216458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 216558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 216658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi srcStages |= VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; 216758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi dstStages |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; 216858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 216958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi selfDeps.push_back(barrier); 217058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 217158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 217258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 217358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (m_renderInfo.getDepthStencilAttachmentIndex() && (m_renderInfo.getInputAttachmentIndex(inputAttachmentNdx) == *m_renderInfo.getDepthStencilAttachmentIndex())) 217458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 217541544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(m_renderInfo.getDepthStencilAttachment()->getFormat()); 217641544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi const bool hasDepth = hasDepthComponent(format.order); 217741544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi const bool hasStencil = hasStencilComponent(format.order); 217841544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi const VkImageMemoryBarrier barrier = 217941544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi { 218041544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType; 218141544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi DE_NULL, // pNext; 218241544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi 218341544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, // srcAccessMask 218441544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, // dstAccessMask 218541544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi 218641544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, // oldLayout 218741544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, // newLayout; 218841544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi 218941544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex; 219041544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi VK_QUEUE_FAMILY_IGNORED, // destQueueFamilyIndex; 219141544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi 219241544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi m_depthStencilAttachmentImage, // image; 219341544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi { // subresourceRange; 219441544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi (hasDepth ? (VkImageAspectFlags)VK_IMAGE_ASPECT_DEPTH_BIT : 0u) 219541544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi | (hasStencil ? (VkImageAspectFlags)VK_IMAGE_ASPECT_STENCIL_BIT : 0u), // aspect; 219641544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi 0, // baseMipLevel; 219741544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi 1, // mipLevels; 219841544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi 0, // baseArraySlice; 219941544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi 1 // arraySize; 220041544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi } 220141544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi }; 220258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 220341544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi srcStages |= VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT; 220441544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi dstStages |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; 220558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 220641544b37264478d36ae4c3e0c2bd11a0ad2fbd2cMika Isojärvi selfDeps.push_back(barrier); 220758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 220858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 220958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 221058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (!selfDeps.empty()) 221158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk.cmdPipelineBarrier(commandBuffer, srcStages, dstStages, VK_DEPENDENCY_BY_REGION_BIT, 0, DE_NULL, 0, DE_NULL, (deUint32)selfDeps.size(), &selfDeps[0]); 221258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 2213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (m_renderInfo.getRenderQuad()) 2214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkDeviceSize offset = 0; 2216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBuffer vertexBuffer = *m_vertexBuffer; 2217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline); 221958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 222058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (m_descriptorSet) 222158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 222258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkDescriptorSet descriptorSet = *m_descriptorSet; 222358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk.cmdBindDescriptorSets(commandBuffer, vk::VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipelineLayout, 0u, 1u, &descriptorSet, 0u, NULL); 222458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 222558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 2226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdBindVertexBuffers(commandBuffer, 0u, 1u, &vertexBuffer, &offset); 2227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdDraw(commandBuffer, 6u, 1u, 0u, 0u); 2228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 223258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const SubpassRenderInfo m_renderInfo; 223358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Move<VkCommandBuffer> m_commandBuffer; 223458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Move<VkPipeline> m_pipeline; 223558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Move<VkDescriptorSetLayout> m_descriptorSetLayout; 223658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Move<VkPipelineLayout> m_pipelineLayout; 223758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 223858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Move<VkShaderModule> m_vertexShaderModule; 223958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Move<VkShaderModule> m_fragmentShaderModule; 224058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 224158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Move<VkDescriptorPool> m_descriptorPool; 224258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Move<VkDescriptorSet> m_descriptorSet; 224358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Move<VkBuffer> m_vertexBuffer; 224458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi de::MovePtr<Allocation> m_vertexBufferMemory; 224558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<VkImage> m_colorAttachmentImages; 224658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkImage m_depthStencilAttachmentImage; 2247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 2248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid pushImageInitializationCommands (const DeviceInterface& vk, 225068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer commandBuffer, 2251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment>& attachmentInfo, 2252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<de::SharedPtr<AttachmentResources> >& attachmentResources, 2253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 queueIndex, 2254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& clearValues) 2255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkImageMemoryBarrier> initializeLayouts; 2258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 2260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!clearValues[attachmentNdx]) 2262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi continue; 2263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageMemoryBarrier barrier = 2265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2266ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType; 2267ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski DE_NULL, // pNext; 2268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2269ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski (VkAccessFlags)0, // srcAccessMask 2270ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski getAllMemoryReadFlags() | VK_ACCESS_TRANSFER_WRITE_BIT, // dstAccessMask 2271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2272ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski VK_IMAGE_LAYOUT_UNDEFINED, // oldLayout 2273ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // newLayout; 2274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2275ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski queueIndex, // srcQueueFamilyIndex; 2276ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski queueIndex, // destQueueFamilyIndex; 2277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2278ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski attachmentResources[attachmentNdx]->getImage(), // image; 2279ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski { // subresourceRange; 2280ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()), // aspect; 2281ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski 0, // baseMipLevel; 2282ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski 1, // mipLevels; 2283ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski 0, // baseArraySlice; 2284ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski 1 // arraySize; 2285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeLayouts.push_back(barrier); 2289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!initializeLayouts.empty()) 22925b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser vk.cmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, 22935b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 2294689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkMemoryBarrier*)DE_NULL, 2295689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkBufferMemoryBarrier*)DE_NULL, 2296689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)initializeLayouts.size(), &initializeLayouts[0]); 2297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 2300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!clearValues[attachmentNdx]) 2302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi continue; 2303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachmentInfo[attachmentNdx].getFormat()); 2305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasStencilComponent(format.order) || hasDepthComponent(format.order)) 2307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clearNan = tcu::Float32::nan().asFloat(); 2309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clearDepth = hasDepthComponent(format.order) ? clearValues[attachmentNdx]->depthStencil.depth : clearNan; 231058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 clearStencil = hasStencilComponent(format.order) ? clearValues[attachmentNdx]->depthStencil.stencil : 0xDEu; 2311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearDepthStencilValue depthStencil = 2312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearDepth, 2314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearStencil 2315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageSubresourceRange range = 2317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2318d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz (VkImageAspectFlags)((hasDepthComponent(format.order) ? VK_IMAGE_ASPECT_DEPTH_BIT : 0) 2319d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz | (hasStencilComponent(format.order) ? VK_IMAGE_ASPECT_STENCIL_BIT : 0)), 2320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 2321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1, 2322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 2323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 2324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 232668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdClearDepthStencilImage(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &depthStencil, 1, &range); 2327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageSubresourceRange range = 2331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 233258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask; 233358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0, // baseMipLevel; 233458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 1, // mipLevels; 233558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0, // baseArrayLayer; 233658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 1 // layerCount; 2337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearColorValue clearColor = clearValues[attachmentNdx]->color; 2339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 234068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdClearColorImage(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearColor, 1, &range); 2341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkImageMemoryBarrier> renderPassLayouts; 2346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 2348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 234958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageLayout oldLayout = clearValues[attachmentNdx] ? VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL : VK_IMAGE_LAYOUT_UNDEFINED; 235058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageMemoryBarrier barrier = 2351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2352ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType; 2353ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski DE_NULL, // pNext; 2354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2355ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski (oldLayout != VK_IMAGE_LAYOUT_UNDEFINED ? getAllMemoryWriteFlags() : (VkAccessFlags)0), // srcAccessMask 2356ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski getAllMemoryReadFlags() | getMemoryFlagsForLayout(attachmentInfo[attachmentNdx].getInitialLayout()), // dstAccessMask 2357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2358ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski oldLayout, // oldLayout 2359ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski attachmentInfo[attachmentNdx].getInitialLayout(), // newLayout; 2360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2361ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski queueIndex, // srcQueueFamilyIndex; 2362ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski queueIndex, // destQueueFamilyIndex; 2363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2364ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski attachmentResources[attachmentNdx]->getImage(), // image; 2365ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski { // subresourceRange; 2366ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()), // aspect; 2367ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski 0, // baseMipLevel; 2368ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski 1, // mipLevels; 2369ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski 0, // baseArraySlice; 2370ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski 1 // arraySize; 2371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderPassLayouts.push_back(barrier); 2375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!renderPassLayouts.empty()) 23785b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser vk.cmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, 23795b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 2380689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkMemoryBarrier*)DE_NULL, 2381689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkBufferMemoryBarrier*)DE_NULL, 2382689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)renderPassLayouts.size(), &renderPassLayouts[0]); 2383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 238658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid pushRenderPassCommands (const DeviceInterface& vk, 238758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkCommandBuffer commandBuffer, 238858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkRenderPass renderPass, 238958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkFramebuffer framebuffer, 239058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const vector<de::SharedPtr<SubpassRenderer> >& subpassRenderers, 239158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& renderPos, 239258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& renderSize, 239358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const vector<Maybe<VkClearValue> >& renderPassClearValues, 239458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi TestConfig::RenderTypes render) 2395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clearNan = tcu::Float32::nan().asFloat(); 2397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkClearValue> attachmentClearValues; 2398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassClearValues.size(); attachmentNdx++) 2400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderPassClearValues[attachmentNdx]) 2402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentClearValues.push_back(*renderPassClearValues[attachmentNdx]); 2403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentClearValues.push_back(makeClearValueColorF32(clearNan, clearNan, clearNan, clearNan)); 2405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkRect2D renderArea = 2409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2410689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { (deInt32)renderPos.x(), (deInt32)renderPos.y() }, 2411689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { renderSize.x(), renderSize.y() } 2412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < subpassRenderers.size(); subpassNdx++) 2415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 241668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSubpassContents contents = subpassRenderers[subpassNdx]->isSecondary() ? VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS : VK_SUBPASS_CONTENTS_INLINE; 2417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpassNdx == 0) 2419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi cmdBeginRenderPass(vk, commandBuffer, renderPass, framebuffer, renderArea, (deUint32)attachmentClearValues.size(), attachmentClearValues.empty() ? DE_NULL : &attachmentClearValues[0], contents); 2420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdNextSubpass(commandBuffer, contents); 2422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (render) 2424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 242568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos if (contents == VK_SUBPASS_CONTENTS_INLINE) 2426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpassRenderers[subpassNdx]->pushRenderCommands(vk, commandBuffer); 2428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 242968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos else if (contents == VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS) 2430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 243168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandBuffer cmd = subpassRenderers[subpassNdx]->getCommandBuffer(); 2432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdExecuteCommands(commandBuffer, 1, &cmd); 2433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Invalid contents"); 2436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdEndRenderPass(commandBuffer); 2440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid pushReadImagesToBuffers (const DeviceInterface& vk, 244468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer commandBuffer, 2445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 queueIndex, 2446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<de::SharedPtr<AttachmentResources> >& attachmentResources, 2448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment>& attachmentInfo, 2449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<bool>& isLazy, 2450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& targetSize) 2452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkImageMemoryBarrier> imageBarriers; 2455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 2457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isLazy[attachmentNdx]) 2459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi continue; 2460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2461ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski const VkImageLayout oldLayout = attachmentInfo[attachmentNdx].getFinalLayout(); 2462ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski const VkImageMemoryBarrier barrier = 2463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2464ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType 2465ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski DE_NULL, // pNext 2466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2467ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski getAllMemoryWriteFlags() | getMemoryFlagsForLayout(oldLayout), // srcAccessMask 2468ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski getAllMemoryReadFlags(), // dstAccessMask 2469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2470ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski oldLayout, // oldLayout 2471ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // newLayout 2472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2473ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski queueIndex, // srcQueueFamilyIndex 2474ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski queueIndex, // destQueueFamilyIndex 2475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2476ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski attachmentResources[attachmentNdx]->getImage(), // image 2477ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski { // subresourceRange 2478ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()), // aspect; 2479ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski 0, // baseMipLevel 2480ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski 1, // mipLevels 2481ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski 0, // baseArraySlice 2482ba01feddc2c4b2cafba566462732ac2f3e813c83Maciej Jesionowski 1 // arraySize 2483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi imageBarriers.push_back(barrier); 2487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!imageBarriers.empty()) 2490689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vk.cmdPipelineBarrier(commandBuffer, 2491689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos getAllPipelineStageFlags(), 2492689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos getAllPipelineStageFlags(), 2493689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (VkDependencyFlags)0, 2494689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkMemoryBarrier*)DE_NULL, 2495689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkBufferMemoryBarrier*)DE_NULL, 2496689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)imageBarriers.size(), &imageBarriers[0]); 2497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 2500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isLazy[attachmentNdx]) 2502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi continue; 2503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat::ChannelOrder order = mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order; 2505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBufferImageCopy rect = 2506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // bufferOffset 2508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // bufferRowLength 2509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // bufferImageHeight 2510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { // imageSubresource 25115489a504dfaafc62f5144efd9aaa299182d92428Pyry Haulos (vk::VkImageAspectFlags)getPrimaryImageAspect(mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order), // aspect 251294128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos 0, // mipLevel 2513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // arraySlice 2514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 // arraySize 2515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, 251694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos { 0, 0, 0 }, // imageOffset 2517689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { targetSize.x(), targetSize.y(), 1u } // imageExtent 2518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 252068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdCopyImageToBuffer(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, attachmentResources[attachmentNdx]->getBuffer(), 1, &rect); 2521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::TextureFormat::DS == order) 2523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBufferImageCopy stencilRect = 2525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 252658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0, // bufferOffset 252758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0, // bufferRowLength 252858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0, // bufferImageHeight 252968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { // imageSubresource 253068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_ASPECT_STENCIL_BIT, // aspect 253168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0, // mipLevel 253268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0, // arraySlice 253358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 1 // arraySize 2534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, 253558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 0, 0, 0 }, // imageOffset 253658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { targetSize.x(), targetSize.y(), 1u } // imageExtent 2537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 253968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdCopyImageToBuffer(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, attachmentResources[attachmentNdx]->getSecondaryBuffer(), 1, &stencilRect); 2540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2541c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2544c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkBufferMemoryBarrier> bufferBarriers; 2545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 2547c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2548c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isLazy[attachmentNdx]) 2549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi continue; 2550c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat::ChannelOrder order = mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order; 2552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBufferMemoryBarrier bufferBarrier = 2553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, 2555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 2556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 255768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryWriteFlags(), 255868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryReadFlags(), 2559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, 2561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, 2562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getBuffer(), 2564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 2565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getBufferSize() 2566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bufferBarriers.push_back(bufferBarrier); 2569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::TextureFormat::DS == order) 2571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBufferMemoryBarrier secondaryBufferBarrier = 2573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, 2575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 2576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 257768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryWriteFlags(), 257868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryReadFlags(), 2579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, 2581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, 2582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getSecondaryBuffer(), 2584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 2585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getSecondaryBufferSize() 2586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bufferBarriers.push_back(secondaryBufferBarrier); 2589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!bufferBarriers.empty()) 2593689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vk.cmdPipelineBarrier(commandBuffer, 2594689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos getAllPipelineStageFlags(), 2595689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos getAllPipelineStageFlags(), 2596689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (VkDependencyFlags)0, 2597689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkMemoryBarrier*)DE_NULL, 2598689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)bufferBarriers.size(), &bufferBarriers[0], 2599689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkImageMemoryBarrier*)DE_NULL); 2600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 260358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviclass PixelValue 260458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{ 260558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvipublic: 260658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi PixelValue (const Maybe<bool>& x = nothing<bool>(), 260758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Maybe<bool>& y = nothing<bool>(), 260858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Maybe<bool>& z = nothing<bool>(), 260958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Maybe<bool>& w = nothing<bool>()); 261058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 261158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi void setUndefined (size_t ndx); 261258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi void setValue (size_t ndx, bool value); 261358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Maybe<bool> getValue (size_t ndx) const; 261458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 261558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärviprivate: 261658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deUint16 m_status; 261758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi}; 261858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 261958a80a6102cf592f064b8094c59812081ee5d323Mika IsojärviPixelValue::PixelValue (const Maybe<bool>& x, 262058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Maybe<bool>& y, 262158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Maybe<bool>& z, 262258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Maybe<bool>& w) 262358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi : m_status (0) 2624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 262558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Maybe<bool> values[] = 262658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 262758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi x, y, z, w 262858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 2629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 263058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t ndx = 0; ndx < DE_LENGTH_OF_ARRAY(values); ndx++) 2631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 263258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (values[ndx]) 263358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi setValue(ndx, *values[ndx]); 263458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 263558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi setUndefined(ndx); 263658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 2637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 263858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(m_status <= 0xFFu); 263958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi} 264058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 264158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid PixelValue::setUndefined (size_t ndx) 264258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{ 264358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(ndx < 4); 264458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(m_status <= 0xFFu); 264558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 264658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_status &= (deUint16)~(0x1u << (deUint16)(ndx * 2)); 264758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(m_status <= 0xFFu); 264858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi} 264958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 265058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid PixelValue::setValue (size_t ndx, bool value) 265158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{ 265258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(ndx < 4); 265358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(m_status <= 0xFFu); 265458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 265558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_status |= (deUint16)(0x1u << (ndx * 2)); 265658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 265758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (value) 265858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_status |= (deUint16)(0x1u << (ndx * 2 + 1)); 265958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 266058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi m_status &= (deUint16)~(0x1u << (deUint16)(ndx * 2 + 1)); 266158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 266258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(m_status <= 0xFFu); 266358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi} 266458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 266558a80a6102cf592f064b8094c59812081ee5d323Mika IsojärviMaybe<bool> PixelValue::getValue (size_t ndx) const 266658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{ 266758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(ndx < 4); 266858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(m_status <= 0xFFu); 266958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 267058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if ((m_status & (0x1u << (deUint16)(ndx * 2))) != 0) 267158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 267258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return just((m_status & (0x1u << (deUint32)(ndx * 2 + 1))) != 0); 2673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 267558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return nothing<bool>(); 267658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi} 267758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 267858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid clearReferenceValues (vector<PixelValue>& values, 267958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& targetSize, 268058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& offset, 268158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& size, 268258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const BVec4& mask, 268358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const PixelValue& value) 268458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{ 268558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(targetSize.x() * targetSize.y() == (deUint32)values.size()); 268658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(offset.x() + size.x() <= targetSize.x()); 268758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(offset.y() + size.y() <= targetSize.y()); 268858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 268958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 y = offset.y(); y < offset.y() + size.y(); y++) 269058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 x = offset.x(); x < offset.x() + size.x(); x++) 2691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 269258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int compNdx = 0; compNdx < 4; compNdx++) 2693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 269458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (mask[compNdx]) 269558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 269658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (value.getValue(compNdx)) 269758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi values[x + y * targetSize.x()].setValue(compNdx, *value.getValue(compNdx)); 269858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 269958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi values[x + y * targetSize.x()].setUndefined(compNdx); 270058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 270158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 270258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 270358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi} 2704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 270558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid markUndefined (vector<PixelValue>& values, 270658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const BVec4& mask, 270758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& targetSize, 270858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& offset, 270958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& size) 271058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{ 271158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(targetSize.x() * targetSize.y() == (deUint32)values.size()); 271258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 271358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 y = offset.y(); y < offset.y() + size.y(); y++) 271458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 x = offset.x(); x < offset.x() + size.x(); x++) 271558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 271658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int compNdx = 0; compNdx < 4; compNdx++) 271758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 271858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (mask[compNdx]) 271958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi values[x + y * targetSize.x()].setUndefined(compNdx); 2720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 272158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 272258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi} 272358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 272458a80a6102cf592f064b8094c59812081ee5d323Mika IsojärviPixelValue clearValueToPixelValue (const VkClearValue& value, 272558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat& format) 272658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{ 272758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool isDepthAttachment = hasDepthComponent(format.order); 272858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool isStencilAttachment = hasStencilComponent(format.order); 272958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool isDepthOrStencilAttachment = isDepthAttachment || isStencilAttachment; 273058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi PixelValue pixelValue; 273158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 273258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (isDepthOrStencilAttachment) 273358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 273458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (isDepthAttachment) 2735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 273658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (value.depthStencil.depth == 1.0f) 273758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi pixelValue.setValue(0, true); 273858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else if (value.depthStencil.depth == 0.0f) 273958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi pixelValue.setValue(0, false); 274058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 274158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_FATAL("Unknown depth value"); 274258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 2743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 274458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (isStencilAttachment) 274558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 274658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (value.depthStencil.stencil == 0xFFu) 274758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi pixelValue.setValue(1, true); 274858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else if (value.depthStencil.stencil == 0x0u) 274958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi pixelValue.setValue(1, false); 275058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 275158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_FATAL("Unknown stencil value"); 2752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 275358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 275458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 275558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 275658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 275758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::BVec4 channelMask = tcu::getTextureFormatChannelMask(format); 275858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 275958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi switch (channelClass) 2760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 276158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 276258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int i = 0; i < 4; i++) 276358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 276458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (channelMask[i]) 276558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 276658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (value.color.int32[i] == 1) 276758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi pixelValue.setValue(i, true); 276858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else if (value.color.int32[i] == 0) 276958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi pixelValue.setValue(i, false); 277058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 277158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_FATAL("Unknown clear color value"); 277258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 277358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 277458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi break; 277558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 277658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 277758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int i = 0; i < 4; i++) 277858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 277958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (channelMask[i]) 278058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 278158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (value.color.uint32[i] == 1u) 278258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi pixelValue.setValue(i, true); 278358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else if (value.color.uint32[i] == 0u) 278458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi pixelValue.setValue(i, false); 278558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 278658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_FATAL("Unknown clear color value"); 278758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 278858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 278958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi break; 279058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 279158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 279258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 279358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 279458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int i = 0; i < 4; i++) 279558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 279658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (channelMask[i]) 279758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 279858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (value.color.float32[i] == 1.0f) 279958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi pixelValue.setValue(i, true); 280058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else if (value.color.float32[i] == 0.0f) 280158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi pixelValue.setValue(i, false); 280258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 280358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_FATAL("Unknown clear color value"); 280458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 280558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 280658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi break; 2807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 280858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi default: 280958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_FATAL("Unknown channel class"); 2810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 281358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return pixelValue; 2814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 281658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid renderReferenceValues (vector<vector<PixelValue> >& referenceAttachments, 2817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPassInfo, 2818c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& targetSize, 2819c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& imageClearValues, 2820c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& renderPassClearValues, 2821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassRenderInfo>& subpassRenderInfo, 2822c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderPos, 2823c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderSize) 2824c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses = renderPassInfo.getSubpasses(); 2826c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<bool> attachmentUsed (renderPassInfo.getAttachments().size(), false); 2827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi referenceAttachments.resize(renderPassInfo.getAttachments().size()); 2829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 2831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 283258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment attachment = renderPassInfo.getAttachments()[attachmentNdx]; 283358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 283458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<PixelValue>& reference = referenceAttachments[attachmentNdx]; 2835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 283658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi reference.resize(targetSize.x() * targetSize.y()); 2837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (imageClearValues[attachmentNdx]) 283958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi clearReferenceValues(reference, targetSize, UVec2(0, 0), targetSize, BVec4(true), clearValueToPixelValue(*imageClearValues[attachmentNdx], format)); 2840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++) 2843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = subpasses[subpassNdx]; 2845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassRenderInfo& renderInfo = subpassRenderInfo[subpassNdx]; 2846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& colorAttachments = subpass.getColorAttachments(); 2847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Apply load op if attachment was used for the first time 2849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < colorAttachments.size(); attachmentNdx++) 2850c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 attachmentIndex = colorAttachments[attachmentNdx].getAttachment(); 2852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!attachmentUsed[attachmentIndex]) 2854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 285558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment& attachment = renderPassInfo.getAttachments()[attachmentIndex]; 285658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<PixelValue>& reference = referenceAttachments[attachmentIndex]; 285758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 2858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 285958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(!tcu::hasDepthComponent(format.order)); 286058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(!tcu::hasStencilComponent(format.order)); 2861c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2862c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 286358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi clearReferenceValues(reference, targetSize, renderPos, renderSize, BVec4(true), clearValueToPixelValue(*renderPassClearValues[attachmentIndex], format)); 2864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 286558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi markUndefined(reference, BVec4(true), targetSize, renderPos, renderSize); 2866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentUsed[attachmentIndex] = true; 2868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 287194128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos // Apply load op to depth/stencil attachment if it was used for the first time 287258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 2873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 attachmentIndex = subpass.getDepthStencilAttachment().getAttachment(); 2875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2876c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Apply load op if attachment was used for the first time 2877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!attachmentUsed[attachmentIndex]) 2878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 287958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment& attachment = renderPassInfo.getAttachments()[attachmentIndex]; 288058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<PixelValue>& reference = referenceAttachments[attachmentIndex]; 288158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 2882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 288358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (tcu::hasDepthComponent(format.order)) 2884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 288658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi clearReferenceValues(reference, targetSize, renderPos, renderSize, BVec4(true, false, false, false), clearValueToPixelValue(*renderPassClearValues[attachmentIndex], format)); 2887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 288858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi markUndefined(reference, BVec4(true, false, false, false), targetSize, renderPos, renderSize); 2889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 289158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (tcu::hasStencilComponent(format.order)) 2892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachment.getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 289458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi clearReferenceValues(reference, targetSize, renderPos, renderSize, BVec4(false, true, false, false), clearValueToPixelValue(*renderPassClearValues[attachmentIndex], format)); 2895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (attachment.getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 289658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi markUndefined(reference, BVec4(false, true, false, false), targetSize, renderPos, renderSize); 289758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 2898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 289958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachmentUsed[attachmentIndex] = true; 2900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t colorClearNdx = 0; colorClearNdx < renderInfo.getColorClears().size(); colorClearNdx++) 2904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 290558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const ColorClear& colorClear = renderInfo.getColorClears()[colorClearNdx]; 290658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 offset = colorClear.getOffset(); 290758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 size = colorClear.getSize(); 290858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentIndex = subpass.getColorAttachments()[colorClearNdx].getAttachment(); 290958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment& attachment = renderPassInfo.getAttachments()[attachmentIndex]; 291058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 291158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<PixelValue>& reference = referenceAttachments[attachmentIndex]; 291258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkClearValue value; 2913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color = colorClear.getColor(); 2915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 291658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi clearReferenceValues(reference, targetSize, offset, size, BVec4(true), clearValueToPixelValue(value, format)); 2917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.getDepthStencilClear()) 2920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 292158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const DepthStencilClear& dsClear = *renderInfo.getDepthStencilClear(); 292258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 offset = dsClear.getOffset(); 292358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 size = dsClear.getSize(); 292458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentIndex = subpass.getDepthStencilAttachment().getAttachment(); 292558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment& attachment = renderPassInfo.getAttachments()[attachmentIndex]; 292658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 292758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool hasStencil = tcu::hasStencilComponent(format.order); 292858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool hasDepth = tcu::hasDepthComponent(format.order); 292958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<PixelValue>& reference = referenceAttachments[attachmentIndex]; 293058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VkClearValue value; 2931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 293258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi value.depthStencil.depth = dsClear.getDepth(); 293358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi value.depthStencil.stencil = dsClear.getStencil(); 2934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 293558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi clearReferenceValues(reference, targetSize, offset, size, BVec4(hasDepth, hasStencil, false, false), clearValueToPixelValue(value, format)); 2936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2938c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.getRenderQuad()) 2939c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderQuad& renderQuad = *renderInfo.getRenderQuad(); 294158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Vec2 posA = renderQuad.getCornerA(); 294258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Vec2 posB = renderQuad.getCornerB(); 2943c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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); 2944c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec2 p = Vec2((float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y()) / Vec2(2.0f); 294558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const IVec2 posAI (deRoundFloatToInt32(origin.x() + (p.x() * posA.x())), 294658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deRoundFloatToInt32(origin.y() + (p.y() * posA.y()))); 294758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const IVec2 posBI (deRoundFloatToInt32(origin.x() + (p.x() * posB.x())), 294858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deRoundFloatToInt32(origin.y() + (p.y() * posB.y()))); 2949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 295058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(posAI.x() < posBI.x()); 295158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(posAI.y() < posBI.y()); 2952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 295358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (subpass.getInputAttachments().empty()) 295458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 295558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentRefNdx = 0; attachmentRefNdx < subpass.getColorAttachments().size(); attachmentRefNdx++) 295658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 295758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentIndex = subpass.getColorAttachments()[attachmentRefNdx].getAttachment(); 295858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment& attachment = renderPassInfo.getAttachments()[attachmentIndex]; 295958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 296058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::BVec4 channelMask = tcu::getTextureFormatChannelMask(format); 296158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<PixelValue>& reference = referenceAttachments[attachmentIndex]; 296258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 296358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int y = posAI.y(); y < (int)posBI.y(); y++) 296458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int x = posAI.x(); x < (int)posBI.x(); x++) 296558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 296658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int compNdx = 0; compNdx < 4; compNdx++) 296758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 296858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t index = subpassNdx + attachmentIndex + compNdx; 296958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const BoolOp op = boolOpFromIndex(index); 297058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool boolX = x % 2 == (int)(index % 2); 297158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool boolY = y % 2 == (int)((index / 2) % 2); 297258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 297358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (channelMask[compNdx]) 297458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi reference[x + y * targetSize.x()].setValue(compNdx, performBoolOp(op, boolX, boolY)); 297558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 297658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 297758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 2978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 297958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 2980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 298158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentIndex = subpass.getDepthStencilAttachment().getAttachment(); 298258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment& attachment = renderPassInfo.getAttachments()[attachmentIndex]; 298358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 298458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<PixelValue>& reference = referenceAttachments[attachmentIndex]; 2985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 298658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int y = posAI.y(); y < (int)posBI.y(); y++) 298758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int x = posAI.x(); x < (int)posBI.x(); x++) 298858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 298958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (tcu::hasDepthComponent(format.order)) 299058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 299158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t index = subpassNdx + 1; 299258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const BoolOp op = boolOpFromIndex(index); 299358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool boolX = x % 2 == (int)(index % 2); 299458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool boolY = y % 2 == (int)((index / 2) % 2); 299558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 299658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi reference[x + y * targetSize.x()].setValue(0, performBoolOp(op, boolX, boolY)); 299758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 299858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 299958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (tcu::hasStencilComponent(format.order)) 300058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 300158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t index = subpassNdx; 300258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi reference[x + y * targetSize.x()].setValue(1, (index % 2) == 0); 300358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 300458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 3005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 300758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 3008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 300958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi size_t outputComponentCount = 0; 301058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<Maybe<bool> > inputs; 3011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(posAI.x() < posBI.x()); 3013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(posAI.y() < posBI.y()); 3014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 301558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentRefNdx = 0; attachmentRefNdx < subpass.getColorAttachments().size(); attachmentRefNdx++) 3016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 301758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentIndex = subpass.getColorAttachments()[attachmentRefNdx].getAttachment(); 301858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment& attachment = renderPassInfo.getAttachments()[attachmentIndex]; 301958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 302058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const int componentCount = tcu::getNumUsedChannels(format.order); 3021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 302258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi outputComponentCount += (size_t)componentCount; 3023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 302558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 302658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi outputComponentCount++; 3027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 302858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int y = posAI.y(); y < (int)posBI.y(); y++) 302958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int x = posAI.x(); x < (int)posBI.x(); x++) 303058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 303158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t inputAttachmentNdx = 0; inputAttachmentNdx < subpass.getInputAttachments().size(); inputAttachmentNdx++) 303258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 303358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentIndex = subpass.getInputAttachments()[inputAttachmentNdx].getAttachment(); 303458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment& attachment = renderPassInfo.getAttachments()[attachmentIndex]; 303558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 303658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const int componentCount = tcu::getNumUsedChannels(format.order); 3037c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 303858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int compNdx = 0; compNdx < componentCount; compNdx++) 303958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi inputs.push_back(referenceAttachments[attachmentIndex][x + y * targetSize.x()].getValue(compNdx)); 304058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 3041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 304258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t inputsPerOutput = inputs.size() >= outputComponentCount 304358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ? ((inputs.size() / outputComponentCount) 304458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi + ((inputs.size() % outputComponentCount) != 0 ? 1 : 0)) 304558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi : 1; 3046c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 304758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi size_t outputValueNdx = 0; 3048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 304958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentRefNdx = 0; attachmentRefNdx < subpass.getColorAttachments().size(); attachmentRefNdx++) 305058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 305158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentIndex = subpass.getColorAttachments()[attachmentRefNdx].getAttachment(); 305258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment& attachment = renderPassInfo.getAttachments()[attachmentIndex]; 305358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 305458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<PixelValue>& reference = referenceAttachments[attachmentIndex]; 305558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const int componentCount = tcu::getNumUsedChannels(format.order); 305658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 305758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int compNdx = 0; compNdx < componentCount; compNdx++) 305858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 305958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t index = subpassNdx + attachmentIndex + outputValueNdx; 306058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const BoolOp op = boolOpFromIndex(index); 306158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool boolX = x % 2 == (int)(index % 2); 306258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool boolY = y % 2 == (int)((index / 2) % 2); 306358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Maybe<bool> output = tcu::just(performBoolOp(op, boolX, boolY)); 306458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 306558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t i = 0; i < inputsPerOutput; i++) 306658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 306758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (!output) 306858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi break; 306958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else if (!inputs[((outputValueNdx + compNdx) * inputsPerOutput + i) % inputs.size()]) 307058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi output = tcu::nothing<bool>(); 307158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 307258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi output = (*output) == (*inputs[((outputValueNdx + compNdx) * inputsPerOutput + i) % inputs.size()]); 307358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 307458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 307558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (output) 307658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi reference[x + y * targetSize.x()].setValue(compNdx, *output); 307758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 307858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi reference[x + y * targetSize.x()].setUndefined(compNdx); 307958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 308058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 308158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi outputValueNdx += componentCount; 308258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 3083c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 308458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 308558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 308658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentIndex = subpass.getDepthStencilAttachment().getAttachment(); 308758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<PixelValue>& reference = referenceAttachments[attachmentIndex]; 308858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t index = subpassNdx + attachmentIndex; 308958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const BoolOp op = boolOpFromIndex(index); 309058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool boolX = x % 2 == (int)(index % 2); 309158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool boolY = y % 2 == (int)((index / 2) % 2); 309258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Maybe<bool> output = tcu::just(performBoolOp(op, boolX, boolY)); 309358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 309458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t i = 0; i < inputsPerOutput; i++) 309558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 309658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (!output) 309758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi break; 309858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else if (inputs[(outputValueNdx * inputsPerOutput + i) % inputs.size()]) 309958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi output = (*output) == (*inputs[(outputValueNdx * inputsPerOutput + i) % inputs.size()]); 310058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 310158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi output = tcu::nothing<bool>(); 310258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 310358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 310458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (output) 310558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi reference[x + y * targetSize.x()].setValue(0, *output); 310658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 310758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi reference[x + y * targetSize.x()].setUndefined(0); 310858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 3109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 311058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi inputs.clear(); 311158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 3112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 311358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 311458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 311558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentIndex = subpass.getDepthStencilAttachment().getAttachment(); 311658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment& attachment = renderPassInfo.getAttachments()[attachmentIndex]; 311758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 311858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<PixelValue>& reference = referenceAttachments[attachmentIndex]; 3119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 312058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (tcu::hasStencilComponent(format.order)) 312158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 312258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int y = posAI.y(); y < (int)posBI.y(); y++) 312358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int x = posAI.x(); x < (int)posBI.x(); x++) 312458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 312558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t index = subpassNdx; 312658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi reference[x + y * targetSize.x()].setValue(1, (index % 2) == 0); 312758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 312858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 312958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 313058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 3131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 313458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi // Mark all attachments that were used but not stored as undefined 313558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentIndex = 0; attachmentIndex < renderPassInfo.getAttachments().size(); attachmentIndex++) 3136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 313758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment attachment = renderPassInfo.getAttachments()[attachmentIndex]; 313858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 313958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<PixelValue>& reference = referenceAttachments[attachmentIndex]; 314058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool isStencilAttachment = hasStencilComponent(format.order); 314158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool isDepthOrStencilAttachment = hasDepthComponent(format.order) || isStencilAttachment; 3142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 314358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (attachmentUsed[attachmentIndex] && renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE) 3144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 314558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (isDepthOrStencilAttachment) 314658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi markUndefined(reference, BVec4(true, false, false, false), targetSize, renderPos, renderSize); 314758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 314858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi markUndefined(reference, BVec4(true), targetSize, renderPos, renderSize); 3149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 315158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (attachmentUsed[attachmentIndex] && isStencilAttachment && renderPassInfo.getAttachments()[attachmentIndex].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE) 315258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi markUndefined(reference, BVec4(false, true, false, false), targetSize, renderPos, renderSize); 3153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 315658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid renderReferenceImagesFromValues (vector<tcu::TextureLevel>& referenceImages, 315758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const vector<vector<PixelValue> >& referenceValues, 315858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2& targetSize, 315958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const RenderPass& renderPassInfo) 3160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 316158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi referenceImages.resize(referenceValues.size()); 3162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 316358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 3164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 316558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment attachment = renderPassInfo.getAttachments()[attachmentNdx]; 316658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 316758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const vector<PixelValue>& reference = referenceValues[attachmentNdx]; 316858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool hasDepth = tcu::hasDepthComponent(format.order); 316958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool hasStencil = tcu::hasStencilComponent(format.order); 317058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool hasDepthOrStencil = hasDepth || hasStencil; 317158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi tcu::TextureLevel& referenceImage = referenceImages[attachmentNdx]; 3172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 317358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi referenceImage.setStorage(format, targetSize.x(), targetSize.y()); 3174d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz 317558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (hasDepthOrStencil) 3176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 317758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (hasDepth) 3178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 317958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const PixelBufferAccess depthAccess (tcu::getEffectiveDepthStencilAccess(referenceImage.getAccess(), tcu::Sampler::MODE_DEPTH)); 3180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 318158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 y = 0; y < targetSize.y(); y++) 318258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 x = 0; x < targetSize.x(); x++) 3183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 318458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (reference[x + y * targetSize.x()].getValue(0)) 3185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 318658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (*reference[x + y * targetSize.x()].getValue(0)) 318758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi depthAccess.setPixDepth(1.0f, x, y); 318858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 318958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi depthAccess.setPixDepth(0.0f, x, y); 3190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 319158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else // Fill with 3x3 grid 319258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi depthAccess.setPixDepth(((x / 3) % 2) == ((y / 3) % 2) ? 0.33f : 0.66f, x, y); 3193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 319658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (hasStencil) 3197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 319858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const PixelBufferAccess stencilAccess (tcu::getEffectiveDepthStencilAccess(referenceImage.getAccess(), tcu::Sampler::MODE_STENCIL)); 3199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 320058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 y = 0; y < targetSize.y(); y++) 320158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 x = 0; x < targetSize.x(); x++) 3202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 320358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (reference[x + y * targetSize.x()].getValue(1)) 3204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 320558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (*reference[x + y * targetSize.x()].getValue(1)) 320658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi stencilAccess.setPixStencil(0xFFu, x, y); 320758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 320858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi stencilAccess.setPixStencil(0x0u, x, y); 3209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 321058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else // Fill with 3x3 grid 321158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi stencilAccess.setPixStencil(((x / 3) % 2) == ((y / 3) % 2) ? 85 : 170, x, y); 3212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 321558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 3216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 321758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 y = 0; y < targetSize.y(); y++) 321858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 x = 0; x < targetSize.x(); x++) 3219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 322058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi tcu::Vec4 color; 3221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 322258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int compNdx = 0; compNdx < 4; compNdx++) 3223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 322458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (reference[x + y * targetSize.x()].getValue(compNdx)) 3225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 322658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (*reference[x + y * targetSize.x()].getValue(compNdx)) 322758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi color[compNdx] = 1.0f; 322858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 322958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi color[compNdx] = 0.0f; 3230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 323158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else // Fill with 3x3 grid 323258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi color[compNdx] = ((compNdx + (x / 3)) % 2) == ((y / 3) % 2) ? 0.33f : 0.66f; 3233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 323558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi referenceImage.getAccess().setPixel(color, x, y); 323658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 3237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 324158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvibool verifyColorAttachment (const vector<PixelValue>& reference, 324258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const ConstPixelBufferAccess& result, 324358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const PixelBufferAccess& errorImage) 3244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 324558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Vec4 red (1.0f, 0.0f, 0.0f, 1.0f); 324658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Vec4 green (0.0f, 1.0f, 0.0f, 1.0f); 324758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bool ok = true; 3248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 324958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(result.getWidth() * result.getHeight() == (int)reference.size()); 325058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(result.getWidth() == errorImage.getWidth()); 325158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(result.getHeight() == errorImage.getHeight()); 3252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 325358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int y = 0; y < result.getHeight(); y++) 325458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int x = 0; x < result.getWidth(); x++) 3255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 325658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Vec4 resultColor = result.getPixel(x, y); 325758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const PixelValue& referenceValue = reference[x + y * result.getWidth()]; 325858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bool pixelOk = true; 3259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 326058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int compNdx = 0; compNdx < 4; compNdx++) 3261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 326258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Maybe<bool> maybeValue = referenceValue.getValue(compNdx); 3263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 326458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (maybeValue) 326558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 326658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool value = *maybeValue; 3267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 326858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if ((value && (resultColor[compNdx] != 1.0f)) 326958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi || (!value && resultColor[compNdx] != 0.0f)) 327058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi pixelOk = false; 327158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 3272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 327458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (!pixelOk) 3275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 327658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi errorImage.setPixel(red, x, y); 327758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ok = false; 3278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 327958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 328058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi errorImage.setPixel(green, x, y); 3281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 328258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 328358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return ok; 3284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 328658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvibool verifyDepthAttachment (const vector<PixelValue>& reference, 328758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const ConstPixelBufferAccess& result, 328858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const PixelBufferAccess& errorImage) 3289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 329058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Vec4 red (1.0f, 0.0f, 0.0f, 1.0f); 329158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Vec4 green (0.0f, 1.0f, 0.0f, 1.0f); 329258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bool ok = true; 3293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 329458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(result.getWidth() * result.getHeight() == (int)reference.size()); 329558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(result.getWidth() == errorImage.getWidth()); 329658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(result.getHeight() == errorImage.getHeight()); 3297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 329858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int y = 0; y < result.getHeight(); y++) 329958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int x = 0; x < result.getWidth(); x++) 3300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 330158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bool pixelOk = true; 3302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 330358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const float resultDepth = result.getPixDepth(x, y); 330458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const PixelValue& referenceValue = reference[x + y * result.getWidth()]; 330558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Maybe<bool> maybeValue = referenceValue.getValue(0); 3306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 330758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (maybeValue) 330858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 330958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool value = *maybeValue; 3310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 331158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if ((value && (resultDepth != 1.0f)) 331258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi || (!value && resultDepth != 0.0f)) 331358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi pixelOk = false; 3314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 331658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (!pixelOk) 3317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 331858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi errorImage.setPixel(red, x, y); 331958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ok = false; 3320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 332158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 332258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi errorImage.setPixel(green, x, y); 3323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 332558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return ok; 332658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi} 3327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 332858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvibool verifyStencilAttachment (const vector<PixelValue>& reference, 332958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const ConstPixelBufferAccess& result, 333058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const PixelBufferAccess& errorImage) 333158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{ 333258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Vec4 red (1.0f, 0.0f, 0.0f, 1.0f); 333358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Vec4 green (0.0f, 1.0f, 0.0f, 1.0f); 333458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bool ok = true; 3335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 333658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(result.getWidth() * result.getHeight() == (int)reference.size()); 333758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(result.getWidth() == errorImage.getWidth()); 333858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_ASSERT(result.getHeight() == errorImage.getHeight()); 3339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 334058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int y = 0; y < result.getHeight(); y++) 334158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (int x = 0; x < result.getWidth(); x++) 3342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 334358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi bool pixelOk = true; 3344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 334558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 resultStencil = result.getPixStencil(x, y); 334658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const PixelValue& referenceValue = reference[x + y * result.getWidth()]; 334758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Maybe<bool> maybeValue = referenceValue.getValue(1); 3348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 334958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (maybeValue) 3350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 335158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool value = *maybeValue; 3352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 335358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if ((value && (resultStencil != 0xFFu)) 335458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi || (!value && resultStencil != 0x0u)) 335558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi pixelOk = false; 3356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 335858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (!pixelOk) 335958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 336058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi errorImage.setPixel(red, x, y); 336158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ok = false; 336258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 336358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 336458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi errorImage.setPixel(green, x, y); 3365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 336658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 336758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return ok; 3368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool logAndVerifyImages (TestLog& log, 3371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DeviceInterface& vk, 3372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 3373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<de::SharedPtr<AttachmentResources> >& attachmentResources, 3374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<bool>& attachmentIsLazy, 3375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPassInfo, 3376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& renderPassClearValues, 3377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& imageClearValues, 3378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassRenderInfo>& subpassRenderInfo, 3379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& targetSize, 3380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig& config) 3381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 338258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<vector<PixelValue> > referenceValues; 3383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<tcu::TextureLevel> referenceAttachments; 3384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool isOk = true; 3385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 338658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi log << TestLog::Message << "Reference images fill undefined pixels with 3x3 grid pattern." << TestLog::EndMessage; 3387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 338858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi renderReferenceValues(referenceValues, renderPassInfo, targetSize, imageClearValues, renderPassClearValues, subpassRenderInfo, config.renderPos, config.renderSize); 338958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi renderReferenceImagesFromValues(referenceAttachments, referenceValues, targetSize, renderPassInfo); 3390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 3392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!attachmentIsLazy[attachmentNdx]) 3394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachment = renderPassInfo.getAttachments()[attachmentNdx]; 3396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 3397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order) && tcu::hasStencilComponent(format.order)) 3399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 340058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat depthFormat = getDepthCopyFormat(attachment.getFormat()); 340158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkDeviceSize depthBufferSize = targetSize.x() * targetSize.y() * depthFormat.getPixelSize(); 340258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi void* const depthPtr = attachmentResources[attachmentNdx]->getResultMemory().getHostPtr(); 3403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3404bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz const tcu::TextureFormat stencilFormat = getStencilCopyFormat(attachment.getFormat()); 3405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkDeviceSize stencilBufferSize = targetSize.x() * targetSize.y() * stencilFormat.getPixelSize(); 3406a3e06bac8ee2c4ccac086f1bfc3c2e833d9f154fJeff Bolz void* const stencilPtr = attachmentResources[attachmentNdx]->getSecondaryResultMemory().getHostPtr(); 3407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 340858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkMappedMemoryRange ranges[] = 3409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // sType; 3412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 3413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getResultMemory().getMemory(), // mem; 3414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getResultMemory().getOffset(), // offset; 3415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi depthBufferSize // size; 3416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, 3417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // sType; 3419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 3420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getSecondaryResultMemory().getMemory(), // mem; 3421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getSecondaryResultMemory().getOffset(), // offset; 3422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stencilBufferSize // size; 3423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.invalidateMappedMemoryRanges(device, 2u, ranges)); 3426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 342858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const ConstPixelBufferAccess depthAccess (depthFormat, targetSize.x(), targetSize.y(), 1, depthPtr); 342958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const ConstPixelBufferAccess stencilAccess (stencilFormat, targetSize.x(), targetSize.y(), 1, stencilPtr); 343058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi tcu::TextureLevel depthErrorImage (tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y()); 343158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi tcu::TextureLevel stencilErrorImage (tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y()); 3432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("Attachment" + de::toString(attachmentNdx) + "Depth", "Attachment " + de::toString(attachmentNdx) + " Depth", depthAccess); 3434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("Attachment" + de::toString(attachmentNdx) + "Stencil", "Attachment " + de::toString(attachmentNdx) + " Stencil", stencilAccess); 3435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess()); 3437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 343858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE 343958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi && !verifyDepthAttachment(referenceValues[attachmentNdx], depthAccess, depthErrorImage.getAccess())) 3440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 344158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi log << TestLog::Image("DepthAttachmentError" + de::toString(attachmentNdx), "Depth Attachment Error " + de::toString(attachmentNdx), depthErrorImage.getAccess()); 344258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi isOk = false; 344358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 344458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 344558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE 344658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi && !verifyStencilAttachment(referenceValues[attachmentNdx], stencilAccess, stencilErrorImage.getAccess())) 344758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 344858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi log << TestLog::Image("StencilAttachmentError" + de::toString(attachmentNdx), "Stencil Attachment Error " + de::toString(attachmentNdx), stencilErrorImage.getAccess()); 3449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi isOk = false; 3450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkDeviceSize bufferSize = targetSize.x() * targetSize.y() * format.getPixelSize(); 3456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void* const ptr = attachmentResources[attachmentNdx]->getResultMemory().getHostPtr(); 3457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 345858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkMappedMemoryRange range = 3459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // sType; 3461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 3462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getResultMemory().getMemory(), // mem; 3463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getResultMemory().getOffset(), // offset; 3464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bufferSize // size; 3465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.invalidateMappedMemoryRanges(device, 1u, &range)); 3467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 346858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (tcu::hasDepthComponent(format.order)) 346958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 347058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const ConstPixelBufferAccess access (format, targetSize.x(), targetSize.y(), 1, ptr); 347158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi tcu::TextureLevel errorImage (tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y()); 347258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 347358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi log << TestLog::Image("Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx), access); 347458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess()); 347558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 347658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if ((renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE || renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE) 347758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi && !verifyDepthAttachment(referenceValues[attachmentNdx], access, errorImage.getAccess())) 347858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 347958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi log << TestLog::Image("AttachmentError" + de::toString(attachmentNdx), "Attachment Error " + de::toString(attachmentNdx), errorImage.getAccess()); 348058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi isOk = false; 348158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 348258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 348358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else if (tcu::hasStencilComponent(format.order)) 348458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 348558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const ConstPixelBufferAccess access (format, targetSize.x(), targetSize.y(), 1, ptr); 348658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi tcu::TextureLevel errorImage (tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y()); 348758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 348858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi log << TestLog::Image("Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx), access); 348958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess()); 349058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 349158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if ((renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE || renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE) 349258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi && !verifyStencilAttachment(referenceValues[attachmentNdx], access, errorImage.getAccess())) 349358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 349458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi log << TestLog::Image("AttachmentError" + de::toString(attachmentNdx), "Attachment Error " + de::toString(attachmentNdx), errorImage.getAccess()); 349558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi isOk = false; 349658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 349758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 349858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 3499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const ConstPixelBufferAccess access (format, targetSize.x(), targetSize.y(), 1, ptr); 3501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel errorImage (tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y()); 3502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx), access); 3504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess()); 3505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if ((renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE || renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE) 350758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi && !verifyColorAttachment(referenceValues[attachmentNdx], access, errorImage.getAccess())) 3508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("AttachmentError" + de::toString(attachmentNdx), "Attachment Error " + de::toString(attachmentNdx), errorImage.getAccess()); 3510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi isOk = false; 3511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return isOk; 3518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 352058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvistd::string getInputAttachmentType (VkFormat vkFormat) 352158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{ 352258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(vkFormat); 352358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 352458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 352558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi switch (channelClass) 352658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 352758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 352858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return "isubpassInput"; 352958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 353058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 353158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return "usubpassInput"; 353258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 353358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 353458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 353558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 353658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return "subpassInput"; 353758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 353858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi default: 353958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_FATAL("Unknown channel class"); 354058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return ""; 354158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 354258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi} 354358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 3544c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string getAttachmentType (VkFormat vkFormat) 3545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(vkFormat); 3547c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 3548c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (channelClass) 3550c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 3552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return "ivec4"; 3553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 3555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return "uvec4"; 3556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 3558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 3559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 3560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return "vec4"; 3561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 3563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown channel class"); 3564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return ""; 3565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid createTestShaders (SourceCollections& dst, TestConfig config) 3569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (config.renderTypes & TestConfig::RENDERTYPES_DRAW) 3571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses = config.renderPass.getSubpasses(); 3573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++) 3575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 357658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Subpass& subpass = subpasses[subpassNdx]; 357758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deUint32 inputAttachmentBinding = 0; 3578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi std::ostringstream vertexShader; 3579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi std::ostringstream fragmentShader; 3580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vertexShader << "#version 310 es\n" 358258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << "layout(location = 0) in highp vec2 a_position;\n" 3583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "void main (void) {\n" 358458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << "\tgl_Position = vec4(a_position, 1.0, 1.0);\n" 3585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "}\n"; 3586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi fragmentShader << "#version 310 es\n" 358858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << "precision highp float;\n"; 358958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 359058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getInputAttachments().size(); attachmentNdx++) 359158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 359258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentIndex = subpass.getInputAttachments()[attachmentNdx].getAttachment(); 359358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment attachment = config.renderPass.getAttachments()[attachmentIndex]; 359458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 359558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool isDepthFormat = tcu::hasDepthComponent(format.order); 359658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool isStencilFormat = tcu::hasStencilComponent(format.order); 359758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 359858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (isDepthFormat || isStencilFormat) 359958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 360058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (isDepthFormat) 360158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 360258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "layout(input_attachment_index = " << attachmentNdx << ", set=0, binding=" << inputAttachmentBinding << ") uniform highp subpassInput i_depth" << attachmentNdx << ";\n"; 360358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi inputAttachmentBinding++; 360458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 360558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 360658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (isStencilFormat) 360758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 360858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "layout(input_attachment_index = " << attachmentNdx << ", set=0, binding=" << inputAttachmentBinding << ") uniform highp usubpassInput i_stencil" << attachmentNdx << ";\n"; 360958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi inputAttachmentBinding++; 361058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 361158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 361258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 361358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 361458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const std::string attachmentType = getInputAttachmentType(attachment.getFormat()); 361558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 361658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "layout(input_attachment_index = " << attachmentNdx << ", set=0, binding=" << inputAttachmentBinding << ") uniform highp " << attachmentType << " i_color" << attachmentNdx << ";\n"; 361758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi inputAttachmentBinding++; 361858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 361958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 3620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++) 3622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const std::string attachmentType = getAttachmentType(config.renderPass.getAttachments()[subpass.getColorAttachments()[attachmentNdx].getAttachment()].getFormat()); 3624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi fragmentShader << "layout(location = " << attachmentNdx << ") out highp " << attachmentType << " o_color" << attachmentNdx << ";\n"; 3625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 362758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "void main (void) {\n"; 3628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 362958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (subpass.getInputAttachments().empty()) 363058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 363158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++) 363258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 363358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentIndex = subpass.getColorAttachments()[attachmentNdx].getAttachment(); 363458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const std::string attachmentType = getAttachmentType(config.renderPass.getAttachments()[attachmentIndex].getFormat()); 363558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 363658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "\to_color" << attachmentNdx << " = " << attachmentType << "(vec4("; 363758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 363858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t compNdx = 0; compNdx < 4; compNdx++) 363958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 364058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t index = subpassNdx + attachmentIndex + compNdx; 364158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const BoolOp op = boolOpFromIndex(index); 364258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 364358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (compNdx > 0) 364458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << ",\n\t\t"; 364558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 364658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "((int(gl_FragCoord.x) % 2 == " << (index % 2) 364758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << ") " << boolOpToString(op) << " (" 364858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << "int(gl_FragCoord.y) % 2 == " << ((index / 2) % 2) 364958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << ") ? 1.0 : 0.0)"; 365058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 365158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 365258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "));\n"; 365358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 365458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 365558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 365658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 365758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t index = subpassNdx + 1; 365858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const BoolOp op = boolOpFromIndex(index); 365958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 366058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "\tgl_FragDepth = ((int(gl_FragCoord.x) % 2 == " << (index % 2) 366158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << ") " << boolOpToString(op) << " (" 366258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << "int(gl_FragCoord.y) % 2 == " << ((index / 2) % 2) 366358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << ") ? 1.0 : 0.0);\n"; 366458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 366558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 366658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 3667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 366858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi size_t inputComponentCount = 0; 366958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi size_t outputComponentCount = 0; 367058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 367158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getInputAttachments().size(); attachmentNdx++) 367258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 367358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentIndex = subpass.getInputAttachments()[attachmentNdx].getAttachment(); 367458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment attachment = config.renderPass.getAttachments()[attachmentIndex]; 367558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 367658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t componentCount = (size_t)tcu::getNumUsedChannels(format.order); 367758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 367858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi inputComponentCount += componentCount; 367958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 368058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 368158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++) 368258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 368358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentIndex = subpass.getColorAttachments()[attachmentNdx].getAttachment(); 368458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment attachment = config.renderPass.getAttachments()[attachmentIndex]; 368558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 368658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t componentCount = (size_t)tcu::getNumUsedChannels(format.order); 368758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 368858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi outputComponentCount += componentCount; 368958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 369058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 369158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 369258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi outputComponentCount++; 369358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 369458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t inputsPerOutput = inputComponentCount >= outputComponentCount 369558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ? ((inputComponentCount / outputComponentCount) 369658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi + ((inputComponentCount % outputComponentCount) != 0 ? 1 : 0)) 369758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi : 1; 369858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 369958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "\tbool inputs[" << inputComponentCount << "];\n" 370058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi "\tbool outputs[" << outputComponentCount << "];\n"; 370158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 370258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi size_t inputValueNdx = 0; 370358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 370458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getInputAttachments().size(); attachmentNdx++) 370558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 370658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const char* const components[] = 370758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 370858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi "x", "y", "z", "w" 370958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 371058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentIndex = subpass.getInputAttachments()[attachmentNdx].getAttachment(); 371158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment attachment = config.renderPass.getAttachments()[attachmentIndex]; 371258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 371358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t componentCount = (size_t)tcu::getNumUsedChannels(format.order); 371458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool isDepthFormat = tcu::hasDepthComponent(format.order); 371558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool isStencilFormat = tcu::hasStencilComponent(format.order); 371658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 371758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (isDepthFormat || isStencilFormat) 371858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 371958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (isDepthFormat) 372058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 372158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "\tinputs[" << inputValueNdx << "] = 1.0 == float(subpassLoad(i_depth" << attachmentNdx << ").x);\n"; 372258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi inputValueNdx++; 372358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 372458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 372558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (isStencilFormat) 372658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 372758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "\tinputs[" << inputValueNdx << "] = 255u == subpassLoad(i_stencil" << attachmentNdx << ").x;\n"; 372858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi inputValueNdx++; 372958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 373058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 373158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 373258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 373358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t compNdx = 0; compNdx < componentCount; compNdx++) 373458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 373558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "\tinputs[" << inputValueNdx << "] = 1.0 == float(subpassLoad(i_color" << attachmentNdx << ")." << components[compNdx] << ");\n"; 373658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi inputValueNdx++; 373758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 373858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 373958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 374058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 374158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi size_t outputValueNdx = 0; 374258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 374358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++) 374458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 374558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentIndex = subpass.getColorAttachments()[attachmentNdx].getAttachment(); 374658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment attachment = config.renderPass.getAttachments()[attachmentIndex]; 374758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const std::string attachmentType = getAttachmentType(config.renderPass.getAttachments()[attachmentIndex].getFormat()); 374858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 374958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t componentCount = (size_t)tcu::getNumUsedChannels(format.order); 375058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 375158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t compNdx = 0; compNdx < componentCount; compNdx++) 375258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 375358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t index = subpassNdx + attachmentIndex + outputValueNdx; 375458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const BoolOp op = boolOpFromIndex(index); 375558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 375658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "\toutputs[" << outputValueNdx + compNdx << "] = " 375758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << "(int(gl_FragCoord.x) % 2 == " << (index % 2) 375858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << ") " << boolOpToString(op) << " (" 375958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << "int(gl_FragCoord.y) % 2 == " << ((index / 2) % 2) 376058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << ");\n"; 376158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 376258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t i = 0; i < inputsPerOutput; i++) 376358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "\toutputs[" << outputValueNdx + compNdx << "] = outputs[" << outputValueNdx + compNdx << "] == inputs[" << ((outputValueNdx + compNdx) * inputsPerOutput + i) % inputComponentCount << "];\n"; 376458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 376558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 376658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "\to_color" << attachmentNdx << " = " << attachmentType << "("; 376758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 376858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t compNdx = 0; compNdx < 4; compNdx++) 376958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 377058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (compNdx > 0) 377158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << ", "; 377258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 377358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (compNdx < componentCount) 377458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "outputs[" << outputValueNdx + compNdx << "]"; 377558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 377658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "0"; 377758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 377858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 377958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi outputValueNdx += componentCount; 378058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 378158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << ");\n"; 378258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 378358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 378458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 378558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 378658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentIndex = subpass.getDepthStencilAttachment().getAttachment(); 378758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const size_t index = subpassNdx + attachmentIndex; 378858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const BoolOp op = boolOpFromIndex(index); 378958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 379058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "\toutputs[" << outputValueNdx << "] = " 379158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << "(int(gl_FragCoord.x) % 2 == " << (index % 2) 379258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << ") " << boolOpToString(op) << " (" 379358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << "int(gl_FragCoord.y) % 2 == " << ((index / 2) % 2) 379458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi << ");\n"; 379558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 379658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t i = 0; i < inputsPerOutput; i++) 379758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "\toutputs[" << outputValueNdx << "] = outputs[" << outputValueNdx << "] == inputs[" << (outputValueNdx * inputsPerOutput + i) % inputComponentCount << "];\n"; 379858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 379958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi fragmentShader << "\tgl_FragDepth = outputs[" << outputValueNdx << "] ? 1.0 : 0.0;"; 380058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 3801c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi fragmentShader << "}\n"; 3804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dst.glslSources.add(de::toString(subpassNdx) + "-vert") << glu::VertexSource(vertexShader.str()); 3806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dst.glslSources.add(de::toString(subpassNdx) + "-frag") << glu::FragmentSource(fragmentShader.str()); 3807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3808c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3809c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeAttachmentIsLazy (vector<bool>& attachmentIsLazy, const vector<Attachment>& attachments, TestConfig::ImageMemory imageMemory) 3812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3813c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool lastAttachmentWasLazy = false; 3814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++) 3816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachments[attachmentNdx].getLoadOp() != VK_ATTACHMENT_LOAD_OP_LOAD 3818c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && attachments[attachmentNdx].getStoreOp() != VK_ATTACHMENT_STORE_OP_STORE 3819c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && attachments[attachmentNdx].getStencilLoadOp() != VK_ATTACHMENT_LOAD_OP_LOAD 3820c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && attachments[attachmentNdx].getStencilStoreOp() != VK_ATTACHMENT_STORE_OP_STORE) 3821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3822c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (imageMemory == TestConfig::IMAGEMEMORY_LAZY || (imageMemory & TestConfig::IMAGEMEMORY_LAZY && !lastAttachmentWasLazy)) 3823c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3824c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentIsLazy.push_back(true); 3825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lastAttachmentWasLazy = true; 3826c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (imageMemory & TestConfig::IMAGEMEMORY_STRICT) 3828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentIsLazy.push_back(false); 3830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lastAttachmentWasLazy = false; 3831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3832c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3833c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown imageMemory"); 3834c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentIsLazy.push_back(false); 3837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 38405b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasserenum AttachmentRefType 38415b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{ 38425b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser ATTACHMENTREFTYPE_COLOR, 38435b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser ATTACHMENTREFTYPE_DEPTH_STENCIL, 38445b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser ATTACHMENTREFTYPE_INPUT, 38455b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser ATTACHMENTREFTYPE_RESOLVE, 38465b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser}; 38475b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 384858a80a6102cf592f064b8094c59812081ee5d323Mika IsojärviVkImageUsageFlags getImageUsageFromLayout (VkImageLayout layout) 38495b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{ 38505b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser switch (layout) 38515b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser { 38525b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case VK_IMAGE_LAYOUT_GENERAL: 38535b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case VK_IMAGE_LAYOUT_PREINITIALIZED: 38545b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser return 0; 385558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 38565b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: 38575b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser return VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 385858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 38595b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: 38605b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL: 38615b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser return VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; 386258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 38635b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: 38645b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser return VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; 386558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 38665b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: 38675b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser return VK_IMAGE_USAGE_TRANSFER_SRC_BIT; 386858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 38695b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: 38705b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser return VK_IMAGE_USAGE_TRANSFER_DST_BIT; 387158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 38725b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser default: 38735b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser DE_FATAL("Unexpected image layout"); 38745b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser return 0; 38755b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser } 38765b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser} 38775b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 38785b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasservoid getImageUsageFromAttachmentReferences(vector<VkImageUsageFlags>& attachmentImageUsage, AttachmentRefType refType, size_t count, const AttachmentReference* references) 38795b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{ 38805b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser for (size_t referenceNdx = 0; referenceNdx < count; ++referenceNdx) 38815b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser { 38825b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser const deUint32 attachment = references[referenceNdx].getAttachment(); 38835b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 38845b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser if (attachment != VK_ATTACHMENT_UNUSED) 38855b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser { 38865b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser VkImageUsageFlags usage; 38875b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 38885b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser switch (refType) 38895b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser { 38905b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case ATTACHMENTREFTYPE_COLOR: 38915b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case ATTACHMENTREFTYPE_RESOLVE: 38925b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 38935b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser break; 389458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 38955b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case ATTACHMENTREFTYPE_DEPTH_STENCIL: 38965b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; 38975b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser break; 389858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 38995b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case ATTACHMENTREFTYPE_INPUT: 39005b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser usage = VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; 39015b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser break; 390258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 39035b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser default: 39045b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser DE_FATAL("Unexpected attachment reference type"); 39055b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser usage = 0; 39065b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser break; 39075b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser } 39085b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 39095b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser attachmentImageUsage[attachment] |= usage; 39105b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser } 39115b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser } 39125b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser} 39135b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 39145b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasservoid getImageUsageFromAttachmentReferences(vector<VkImageUsageFlags>& attachmentImageUsage, AttachmentRefType refType, const vector<AttachmentReference>& references) 39155b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{ 39165b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser if (!references.empty()) 39175b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser { 39185b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser getImageUsageFromAttachmentReferences(attachmentImageUsage, refType, references.size(), &references[0]); 39195b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser } 39205b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser} 39215b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 3922277e50dc77528b67562f54c5813b6370e355b614Mais Alnasservoid initializeAttachmentImageUsage (Context &context, vector<VkImageUsageFlags>& attachmentImageUsage, const RenderPass& renderPassInfo, const vector<bool>& attachmentIsLazy, const vector<Maybe<VkClearValue> >& clearValues) 39235b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{ 39245b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser attachmentImageUsage.resize(renderPassInfo.getAttachments().size(), VkImageUsageFlags(0)); 39255b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 39265b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); ++subpassNdx) 39275b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser { 39285b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser const Subpass& subpass = renderPassInfo.getSubpasses()[subpassNdx]; 39295b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 39305b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser getImageUsageFromAttachmentReferences(attachmentImageUsage, ATTACHMENTREFTYPE_COLOR, subpass.getColorAttachments()); 39315b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser getImageUsageFromAttachmentReferences(attachmentImageUsage, ATTACHMENTREFTYPE_DEPTH_STENCIL, 1, &subpass.getDepthStencilAttachment()); 39325b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser getImageUsageFromAttachmentReferences(attachmentImageUsage, ATTACHMENTREFTYPE_INPUT, subpass.getInputAttachments()); 39335b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser getImageUsageFromAttachmentReferences(attachmentImageUsage, ATTACHMENTREFTYPE_RESOLVE, subpass.getResolveAttachments()); 39345b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser } 39355b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 39365b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 39375b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser { 39385b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser const Attachment& attachment = renderPassInfo.getAttachments()[attachmentNdx]; 393958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(context.getInstanceInterface(), context.getPhysicalDevice(), attachment.getFormat()); 394058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkFormatFeatureFlags supportedFeatures = formatProperties.optimalTilingFeatures; 3941277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser 3942277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser if ((supportedFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) != 0) 3943277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser attachmentImageUsage[attachmentNdx] |= VK_IMAGE_USAGE_SAMPLED_BIT; 3944277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser 3945277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser if ((supportedFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) != 0) 3946277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser attachmentImageUsage[attachmentNdx] |= VK_IMAGE_USAGE_STORAGE_BIT; 3947277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser 39485b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser attachmentImageUsage[attachmentNdx] |= getImageUsageFromLayout(attachment.getInitialLayout()); 39495b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser attachmentImageUsage[attachmentNdx] |= getImageUsageFromLayout(attachment.getFinalLayout()); 39505b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 39515b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser if (!attachmentIsLazy[attachmentNdx]) 39525b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser { 39535b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser if (clearValues[attachmentNdx]) 39545b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser attachmentImageUsage[attachmentNdx] |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; 39555b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 39565b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser attachmentImageUsage[attachmentNdx] |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; 39575b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser } 39585b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser } 39595b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser} 39605b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 3961c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassIsSecondary (vector<bool>& subpassIsSecondary, const vector<Subpass>& subpasses, TestConfig::CommandBufferTypes commandBuffer) 3962c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3963c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool lastSubpassWasSecondary = false; 3964c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3965c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++) 3966c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3967c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (commandBuffer == TestConfig::COMMANDBUFFERTYPES_SECONDARY || (commandBuffer & TestConfig::COMMANDBUFFERTYPES_SECONDARY && !lastSubpassWasSecondary)) 3968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpassIsSecondary.push_back(true); 3970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lastSubpassWasSecondary = true; 3971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (commandBuffer & TestConfig::COMMANDBUFFERTYPES_INLINE) 3973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpassIsSecondary.push_back(false); 3975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lastSubpassWasSecondary = false; 3976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown commandBuffer"); 3979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeImageClearValues (de::Random& rng, vector<Maybe<VkClearValue> >& clearValues, const vector<Attachment>& attachments, const vector<bool>& isLazy) 3983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++) 3985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3986c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!isLazy[attachmentNdx]) 3987c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues.push_back(just(randomClearValue(attachments[attachmentNdx], rng))); 3988c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3989c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues.push_back(nothing<VkClearValue>()); 3990c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3991c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3992c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeRenderPassClearValues (de::Random& rng, vector<Maybe<VkClearValue> >& clearValues, const vector<Attachment>& attachments) 3994c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3995c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++) 3996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachments[attachmentNdx].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR 3998c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || attachments[attachmentNdx].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 3999c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues.push_back(just(randomClearValue(attachments[attachmentNdx], rng))); 4001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 4003c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues.push_back(nothing<VkClearValue>()); 4004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassClearValues (de::Random& rng, vector<vector<VkClearColorValue> >& clearValues, const RenderPass& renderPass) 4008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues.resize(renderPass.getSubpasses().size()); 4010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < renderPass.getSubpasses().size(); subpassNdx++) 4012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = renderPass.getSubpasses()[subpassNdx]; 4014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& colorAttachments = subpass.getColorAttachments(); 4015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues[subpassNdx].resize(colorAttachments.size()); 4017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentRefNdx = 0; attachmentRefNdx < colorAttachments.size(); attachmentRefNdx++) 4019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& attachmentRef = colorAttachments[attachmentRefNdx]; 4021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = renderPass.getAttachments()[attachmentRef.getAttachment()]; 4022c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues[subpassNdx][attachmentRefNdx] = randomColorClearValue(attachment, rng); 4024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4026c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid logSubpassRenderInfo (TestLog& log, 4029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassRenderInfo& info) 4030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Viewport, offset: " << info.getViewportOffset() << ", size: " << info.getViewportSize() << TestLog::EndMessage; 4032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4033c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (info.isSecondary()) 4034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Subpass uses secondary command buffers" << TestLog::EndMessage; 4035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 4036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Subpass uses inlined commands" << TestLog::EndMessage; 4037c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (deUint32 attachmentNdx = 0; attachmentNdx < info.getColorClears().size(); attachmentNdx++) 4039c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const ColorClear& colorClear = info.getColorClears()[attachmentNdx]; 4041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Clearing color attachment " << attachmentNdx 4043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ". Offset: " << colorClear.getOffset() 4044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ", Size: " << colorClear.getSize() 4045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ", Color: " << clearColorToString(info.getColorAttachment(attachmentNdx).getFormat(), colorClear.getColor()) << TestLog::EndMessage; 4046c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4047c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (info.getDepthStencilClear()) 4049c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4050c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DepthStencilClear& depthStencilClear = *info.getDepthStencilClear(); 4051c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4052c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Clearing depth stencil attachment" 4053c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ". Offset: " << depthStencilClear.getOffset() 4054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ", Size: " << depthStencilClear.getSize() 4055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ", Depth: " << depthStencilClear.getDepth() 4056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ", Stencil: " << depthStencilClear.getStencil() << TestLog::EndMessage; 4057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4058c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (info.getRenderQuad()) 4060c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderQuad& renderQuad = *info.getRenderQuad(); 4062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 406358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi log << TestLog::Message << "Rendering grid quad to " << renderQuad.getCornerA() << " -> " << renderQuad.getCornerB() << TestLog::EndMessage; 4064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 406758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid logTestCaseInfo (TestLog& log, 406858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const TestConfig& config, 406958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const vector<bool>& attachmentIsLazy, 407058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const vector<Maybe<VkClearValue> >& imageClearValues, 407158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const vector<Maybe<VkClearValue> >& renderPassClearValues, 407258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const vector<SubpassRenderInfo>& subpassRenderInfo) 4073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPass = config.renderPass; 4075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi logRenderPassInfo(log, renderPass); 4077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4078c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(attachmentIsLazy.size() == renderPass.getAttachments().size()); 4079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(imageClearValues.size() == renderPass.getAttachments().size()); 4080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(renderPassClearValues.size() == renderPass.getAttachments().size()); 4081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "TargetSize: " << config.targetSize << TestLog::EndMessage; 4083c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Render area, Offset: " << config.renderPos << ", Size: " << config.renderSize << TestLog::EndMessage; 4084c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentIsLazy.size(); attachmentNdx++) 4086c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4087c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection section (log, "Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx)); 4088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4089c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachmentIsLazy[attachmentNdx]) 4090c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Is lazy." << TestLog::EndMessage; 4091c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4092c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (imageClearValues[attachmentNdx]) 4093c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Image is cleared to " << clearValueToString(renderPass.getAttachments()[attachmentNdx].getFormat(), *imageClearValues[attachmentNdx]) << " before rendering." << TestLog::EndMessage; 4094c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4095c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderPass.getAttachments()[attachmentNdx].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR && renderPassClearValues[attachmentNdx]) 4096c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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; 4097c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4098c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4099c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < renderPass.getSubpasses().size(); subpassNdx++) 4100c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection section (log, "Subpass" + de::toString(subpassNdx), "Subpass " + de::toString(subpassNdx)); 4102c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4103c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi logSubpassRenderInfo(log, subpassRenderInfo[subpassNdx]); 4104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 410758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvifloat roundToViewport (float x, deUint32 offset, deUint32 size) 410858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{ 410958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const float origin = (float)(offset) + ((float(size) / 2.0f)); 411058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const float p = (float)(size) / 2.0f; 411158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deInt32 xi = deRoundFloatToInt32(origin + (p * x)); 411258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 411358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return (((float)xi) - origin) / p; 411458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi} 411558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 4116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassRenderInfo (vector<SubpassRenderInfo>& renderInfos, de::Random& rng, const RenderPass& renderPass, const TestConfig& config) 4117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::CommandBufferTypes commandBuffer = config.commandBufferTypes; 4119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses = renderPass.getSubpasses(); 4120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool lastSubpassWasSecondary = false; 4121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (deUint32 subpassNdx = 0; subpassNdx < (deUint32)subpasses.size(); subpassNdx++) 4123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = subpasses[subpassNdx]; 4125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool subpassIsSecondary = commandBuffer == TestConfig::COMMANDBUFFERTYPES_SECONDARY 4126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || (commandBuffer & TestConfig::COMMANDBUFFERTYPES_SECONDARY && !lastSubpassWasSecondary) ? true : false; 4127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 viewportSize ((config.renderSize * UVec2(2)) / UVec2(3)); 4128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 viewportOffset (config.renderPos.x() + (subpassNdx % 2) * (config.renderSize.x() / 3), 4129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi config.renderPos.y() + ((subpassNdx / 2) % 2) * (config.renderSize.y() / 3)); 4130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<ColorClear> colorClears; 4132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<DepthStencilClear> depthStencilClear; 4133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<RenderQuad> renderQuad; 4134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lastSubpassWasSecondary = subpassIsSecondary; 4136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (config.renderTypes & TestConfig::RENDERTYPES_CLEAR) 4138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4139c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& colorAttachments = subpass.getColorAttachments(); 4140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentRefNdx = 0; attachmentRefNdx < colorAttachments.size(); attachmentRefNdx++) 4142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& attachmentRef = colorAttachments[attachmentRefNdx]; 4144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = renderPass.getAttachments()[attachmentRef.getAttachment()]; 4145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 size ((viewportSize * UVec2(2)) / UVec2(3)); 4146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 offset (viewportOffset.x() + ((deUint32)attachmentRefNdx % 2u) * (viewportSize.x() / 3u), 4147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi viewportOffset.y() + (((deUint32)attachmentRefNdx / 2u) % 2u) * (viewportSize.y() / 3u)); 4148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearColorValue color = randomColorClearValue(attachment, rng); 4149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorClears.push_back(ColorClear(offset, size, color)); 4151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 4154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 415558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const Attachment& attachment = renderPass.getAttachments()[subpass.getDepthStencilAttachment().getAttachment()]; 415658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 size ((viewportSize * UVec2(2)) / UVec2(3)); 415758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 offset (viewportOffset.x() + ((deUint32)colorAttachments.size() % 2u) * (viewportSize.x() / 3u), 415858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi viewportOffset.y() + (((deUint32)colorAttachments.size() / 2u) % 2u) * (viewportSize.y() / 3u)); 415958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkClearValue value = randomClearValue(attachment, rng); 4160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi depthStencilClear = tcu::just(DepthStencilClear(offset, size, value.depthStencil.depth, value.depthStencil.stencil)); 4162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (config.renderTypes & TestConfig::RENDERTYPES_DRAW) 4166b9617e4c1cb9b0b2e199527315b68c3ee96a3fb9Michael Stokes { 416758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const float w = (subpassNdx % 2) == 0 ? 1.0f : 1.25f; 416858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const float h = (subpassNdx % 2) == 0 ? 1.25f : 1.0f; 416958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 417058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const float x0 = roundToViewport((subpassNdx % 2) == 0 ? 1.0f - w : -1.0f, viewportOffset.x(), viewportSize.x()); 417158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const float x1 = roundToViewport((subpassNdx % 2) == 0 ? 1.0f : -1.0f + w, viewportOffset.x(), viewportSize.x()); 417258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 417358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const float y0 = roundToViewport(((subpassNdx / 2) % 2) == 0 ? 1.0f - h : -1.0f, viewportOffset.y(), viewportSize.y()); 417458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const float y1 = roundToViewport(((subpassNdx / 2) % 2) == 0 ? 1.0f : -1.0f + h, viewportOffset.y(), viewportSize.y()); 417558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 417658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi renderQuad = tcu::just(RenderQuad(tcu::Vec2(x0, y0), tcu::Vec2(x1, y1))); 4177b9617e4c1cb9b0b2e199527315b68c3ee96a3fb9Michael Stokes } 4178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderInfos.push_back(SubpassRenderInfo(renderPass, subpassNdx, subpassIsSecondary, viewportOffset, viewportSize, renderQuad, colorClears, depthStencilClear)); 4180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkTextureFormatSupport (TestLog& log, 4184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const InstanceInterface& vk, 4185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPhysicalDevice device, 4186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment>& attachments) 4187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool supported = true; 4189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++) 4191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = attachments[attachmentNdx]; 4193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 4194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool isDepthOrStencilAttachment = hasDepthComponent(format.order) || hasStencilComponent(format.order); 4195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkFormatFeatureFlags flags = isDepthOrStencilAttachment? VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT : VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT; 4196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkFormatProperties properties; 4197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 419868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.getPhysicalDeviceFormatProperties(device, attachment.getFormat(), &properties); 4199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if ((properties.optimalTilingFeatures & flags) != flags) 4201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi supported = false; 4203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Format: " << attachment.getFormat() << " not supported as " << (isDepthOrStencilAttachment ? "depth stencil attachment" : "color attachment") << TestLog::EndMessage; 4204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!supported) 4208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TCU_THROW(NotSupportedError, "Format not supported"); 4209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvitcu::TestStatus renderPassTest (Context& context, TestConfig config) 4212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSize = config.targetSize; 4214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPos = config.renderPos; 4215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSize = config.renderSize; 4216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPassInfo = config.renderPass; 4217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestLog& log = context.getTestContext().getLog(); 4219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::Random rng (config.seed); 4220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<bool> attachmentIsLazy; 42225b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser vector<VkImageUsageFlags> attachmentImageUsage; 4223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Maybe<VkClearValue> > imageClearValues; 4224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Maybe<VkClearValue> > renderPassClearValues; 4225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<bool> subpassIsSecondary; 4227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassRenderInfo> subpassRenderInfo; 4228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<vector<VkClearColorValue> > subpassColorClearValues; 4229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeAttachmentIsLazy(attachmentIsLazy, renderPassInfo.getAttachments(), config.imageMemory); 4231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeImageClearValues(rng, imageClearValues, renderPassInfo.getAttachments(), attachmentIsLazy); 4232277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser initializeAttachmentImageUsage(context, attachmentImageUsage, renderPassInfo, attachmentIsLazy, imageClearValues); 4233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeRenderPassClearValues(rng, renderPassClearValues, renderPassInfo.getAttachments()); 4234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeSubpassIsSecondary(subpassIsSecondary, renderPassInfo.getSubpasses(), config.commandBufferTypes); 4236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeSubpassClearValues(rng, subpassColorClearValues, renderPassInfo); 4237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeSubpassRenderInfo(subpassRenderInfo, rng, renderPassInfo, config); 4238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi logTestCaseInfo(log, config, attachmentIsLazy, imageClearValues, renderPassClearValues, subpassRenderInfo); 4240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkTextureFormatSupport(log, context.getInstanceInterface(), context.getPhysicalDevice(), config.renderPass.getAttachments()); 4242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 424486abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi const vk::VkPhysicalDeviceProperties properties = vk::getPhysicalDeviceProperties(context.getInstanceInterface(), context.getPhysicalDevice()); 424586abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi 424686abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi log << TestLog::Message << "Max color attachments: " << properties.limits.maxColorAttachments << TestLog::EndMessage; 424786abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi 424886abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++) 424986abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi { 425086abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi if (renderPassInfo.getSubpasses()[subpassNdx].getColorAttachments().size() > (size_t)properties.limits.maxColorAttachments) 425186abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi TCU_THROW(NotSupportedError, "Subpass uses more than maxColorAttachments."); 425286abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi } 425386abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi } 425486abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi 425586abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi { 4256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkDevice device = context.getDevice(); 4257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DeviceInterface& vk = context.getDeviceInterface(); 4258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkQueue queue = context.getUniversalQueue(); 4259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 queueIndex = context.getUniversalQueueFamilyIndex(); 4260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Allocator& allocator = context.getDefaultAllocator(); 4261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Unique<VkRenderPass> renderPass (createRenderPass(vk, device, renderPassInfo)); 426368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkCommandPool> commandBufferPool (createCommandPool(vk, device, queueIndex, 0)); 426468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkCommandBuffer> initializeImagesCommandBuffer (allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY)); 426568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkCommandBuffer> renderCommandBuffer (allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY)); 426668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkCommandBuffer> readImagesToBuffersCommandBuffer (allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY)); 4267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<de::SharedPtr<AttachmentResources> > attachmentResources; 4269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<de::SharedPtr<SubpassRenderer> > subpassRenderers; 427058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<VkImage> attachmentImages; 4271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkImageView> attachmentViews; 427258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<pair<VkImageView, VkImageView> > inputAttachmentViews; 4273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 4275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachmentInfo = renderPassInfo.getAttachments()[attachmentNdx]; 4277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 42785b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser attachmentResources.push_back(de::SharedPtr<AttachmentResources>(new AttachmentResources(vk, device, allocator, queueIndex, targetSize, attachmentInfo, attachmentImageUsage[attachmentNdx]))); 4279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentViews.push_back(attachmentResources[attachmentNdx]->getAttachmentView()); 428058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachmentImages.push_back(attachmentResources[attachmentNdx]->getImage()); 428158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 428258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi inputAttachmentViews.push_back(attachmentResources[attachmentNdx]->getInputAttachmentViews()); 4283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 428568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos beginCommandBuffer(vk, *initializeImagesCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0); 4286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pushImageInitializationCommands(vk, *initializeImagesCommandBuffer, renderPassInfo.getAttachments(), attachmentResources, queueIndex, imageClearValues); 4287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi endCommandBuffer(vk, *initializeImagesCommandBuffer); 4288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Unique<VkFramebuffer> framebuffer (createFramebuffer(vk, device, *renderPass, targetSize, attachmentViews)); 4291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++) 429358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpassRenderers.push_back(de::SharedPtr<SubpassRenderer>(new SubpassRenderer(context, vk, device, allocator, *renderPass, *framebuffer, *commandBufferPool, queueIndex, attachmentImages, inputAttachmentViews, subpassRenderInfo[subpassNdx], config.renderPass.getAttachments()))); 4294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 429568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos beginCommandBuffer(vk, *renderCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0); 4296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pushRenderPassCommands(vk, *renderCommandBuffer, *renderPass, *framebuffer, subpassRenderers, renderPos, renderSize, renderPassClearValues, config.renderTypes); 4297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi endCommandBuffer(vk, *renderCommandBuffer); 4298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 429968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos beginCommandBuffer(vk, *readImagesToBuffersCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0); 4300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pushReadImagesToBuffers(vk, *readImagesToBuffersCommandBuffer, queueIndex, attachmentResources, renderPassInfo.getAttachments(), attachmentIsLazy, targetSize); 4301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi endCommandBuffer(vk, *readImagesToBuffersCommandBuffer); 4302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 430368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandBuffer commandBuffers[] = 4304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *initializeImagesCommandBuffer, 4306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *renderCommandBuffer, 4307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *readImagesToBuffersCommandBuffer 4308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Unique<VkFence> fence (createFence(vk, device, 0u)); 4310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueSubmit(vk, queue, DE_LENGTH_OF_ARRAY(commandBuffers), commandBuffers, *fence); 4312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi waitForFences(vk, device, 1, &fence.get(), VK_TRUE, ~0ull); 4313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (logAndVerifyImages(log, vk, device, attachmentResources, attachmentIsLazy, renderPassInfo, renderPassClearValues, imageClearValues, subpassRenderInfo, targetSize, config)) 4317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return tcu::TestStatus::pass("Pass"); 4318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 4319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return tcu::TestStatus::fail("Result verification failed"); 4320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 432318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvistatic const VkFormat s_coreColorFormats[] = 4324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 432568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FORMAT_R5G6B5_UNORM_PACK16, 4326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8_UNORM, 4327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8_SNORM, 4328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8_UINT, 4329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8_SINT, 4330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8_UNORM, 4331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8_SNORM, 4332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8_UINT, 4333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8_SINT, 4334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8B8A8_UNORM, 4335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8B8A8_SNORM, 4336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8B8A8_UINT, 4337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8B8A8_SINT, 4338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8B8A8_SRGB, 433918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A8B8G8R8_UNORM_PACK32, 434018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A8B8G8R8_SNORM_PACK32, 434118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A8B8G8R8_UINT_PACK32, 434218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A8B8G8R8_SINT_PACK32, 434318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A8B8G8R8_SRGB_PACK32, 434418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_B8G8R8A8_UNORM, 434518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_B8G8R8A8_SRGB, 434618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A2R10G10B10_UNORM_PACK32, 434718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A2B10G10R10_UNORM_PACK32, 434818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A2B10G10R10_UINT_PACK32, 4349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16_UNORM, 4350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16_SNORM, 4351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16_UINT, 4352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16_SINT, 4353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16_SFLOAT, 4354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16_UNORM, 4355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16_SNORM, 4356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16_UINT, 4357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16_SINT, 4358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16_SFLOAT, 4359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16B16A16_UNORM, 4360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16B16A16_SNORM, 4361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16B16A16_UINT, 4362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16B16A16_SINT, 4363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16B16A16_SFLOAT, 4364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32_UINT, 4365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32_SINT, 4366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32_SFLOAT, 4367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32_UINT, 4368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32_SINT, 4369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32_SFLOAT, 4370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32B32A32_UINT, 4371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32B32A32_SINT, 4372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32B32A32_SFLOAT 4373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 4374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 437518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvistatic const VkFormat s_coreDepthStencilFormats[] = 4376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_D16_UNORM, 437818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 437968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FORMAT_X8_D24_UNORM_PACK32, 4380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_D32_SFLOAT, 438118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 438218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_D24_UNORM_S8_UINT, 438318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_D32_SFLOAT_S8_UINT 4384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 4385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 438658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid addAttachmentTests (tcu::TestCaseGroup* group) 4387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 438886abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi const deUint32 attachmentCounts[] = { 1, 3, 4, 8 }; 4389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp loadOps[] = 4390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_LOAD, 4392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE 4394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp storeOps[] = 4397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4399775c33feeee3a8a7cfe1a51447424d4160083fffscygan VK_ATTACHMENT_STORE_OP_DONT_CARE 4400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 440200d994858ab64bb5e1c6cb534bb049dcbb9269descygan const VkImageLayout initialAndFinalColorLayouts[] = 4403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, 4405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 440600d994858ab64bb5e1c6cb534bb049dcbb9269descygan VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 440700d994858ab64bb5e1c6cb534bb049dcbb9269descygan VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, 440800d994858ab64bb5e1c6cb534bb049dcbb9269descygan VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL 440900d994858ab64bb5e1c6cb534bb049dcbb9269descygan }; 441000d994858ab64bb5e1c6cb534bb049dcbb9269descygan 441100d994858ab64bb5e1c6cb534bb049dcbb9269descygan const VkImageLayout initialAndFinalDepthStencilLayouts[] = 441200d994858ab64bb5e1c6cb534bb049dcbb9269descygan { 441300d994858ab64bb5e1c6cb534bb049dcbb9269descygan VK_IMAGE_LAYOUT_GENERAL, 4414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 4415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, 4416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 441768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, 441868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL 4419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayouts[] = 4422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, 4424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL 4425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout depthStencilLayouts[] = 4428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, 4430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL 4431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::RenderTypes renderCommands[] = 4434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_NONE, 4436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_CLEAR, 4437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_DRAW, 4438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW, 4439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::CommandBufferTypes commandBuffers[] = 4442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_INLINE, 4444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_SECONDARY, 4445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_INLINE|TestConfig::COMMANDBUFFERTYPES_SECONDARY 4446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::ImageMemory imageMemories[] = 4449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_STRICT, 4451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_LAZY, 4452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_STRICT|TestConfig::IMAGEMEMORY_LAZY 4453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSizes[] = 4456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(64, 64), 4458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(63, 65) 4459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPositions[] = 4462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(0, 0), 4464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(3, 17) 4465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSizes[] = 4468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(32, 32), 4470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(60, 47) 4471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 447358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi tcu::TestContext& testCtx = group->getTestContext(); 447458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi de::Random rng (1433774382u); 4475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentCountNdx = 0; attachmentCountNdx < DE_LENGTH_OF_ARRAY(attachmentCounts); attachmentCountNdx++) 4477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 attachmentCount = attachmentCounts[attachmentCountNdx]; 4479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 testCaseCount = (attachmentCount == 1 ? 100 : 200); 4480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> attachmentCountGroup (new tcu::TestCaseGroup(testCtx, de::toString(attachmentCount).c_str(), de::toString(attachmentCount).c_str())); 4481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t testCaseNdx = 0; testCaseNdx < testCaseCount; testCaseNdx++) 4483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool useDepthStencil = rng.getBool(); 4485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout depthStencilLayout = VK_IMAGE_LAYOUT_GENERAL; 4486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Attachment> attachments; 4487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 4488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount; attachmentNdx++) 4490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 449168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT; 449218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkFormat format = rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreColorFormats), DE_ARRAY_END(s_coreColorFormats)); 4493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp loadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 4494c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp storeOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 4495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 449600d994858ab64bb5e1c6cb534bb049dcbb9269descygan const VkImageLayout initialLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts)); 449700d994858ab64bb5e1c6cb534bb049dcbb9269descygan const VkImageLayout finalizeLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts)); 4498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 4499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp stencilLoadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 4501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp stencilStoreOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 4502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout)); 4504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout)); 4505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (useDepthStencil) 4508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 450958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT; 451058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkFormat format = rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreDepthStencilFormats), DE_ARRAY_END(s_coreDepthStencilFormats)); 451158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentLoadOp loadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 451258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentStoreOp storeOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 4513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 451458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageLayout initialLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalDepthStencilLayouts), DE_ARRAY_END(initialAndFinalDepthStencilLayouts)); 451558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageLayout finalizeLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalDepthStencilLayouts), DE_ARRAY_END(initialAndFinalDepthStencilLayouts)); 4516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 451758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentLoadOp stencilLoadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 451858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentStoreOp stencilStoreOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 4519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi depthStencilLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(depthStencilLayouts), DE_ARRAY_END(depthStencilLayouts)); 4521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout)); 4522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::RenderTypes render = rng.choose<TestConfig::RenderTypes>(DE_ARRAY_BEGIN(renderCommands), DE_ARRAY_END(renderCommands)); 4526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::CommandBufferTypes commandBuffer = rng.choose<TestConfig::CommandBufferTypes>(DE_ARRAY_BEGIN(commandBuffers), DE_ARRAY_END(commandBuffers)); 4527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::ImageMemory imageMemory = rng.choose<TestConfig::ImageMemory>(DE_ARRAY_BEGIN(imageMemories), DE_ARRAY_END(imageMemories)); 452858a80a6102cf592f064b8094c59812081ee5d323Mika 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<deUint32>())); 4529c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassDependency> deps; 4530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const string testCaseName = de::toString(attachmentCountNdx * testCaseCount + testCaseNdx); 4532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (attachments, subpasses, deps); 4533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSize = rng.choose<UVec2>(DE_ARRAY_BEGIN(targetSizes), DE_ARRAY_END(targetSizes)); 4534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPos = rng.choose<UVec2>(DE_ARRAY_BEGIN(renderPositions), DE_ARRAY_END(renderPositions)); 4535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSize = rng.choose<UVec2>(DE_ARRAY_BEGIN(renderSizes), DE_ARRAY_END(renderSizes)); 4536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(attachmentCountGroup.get(), testCaseName.c_str(), testCaseName.c_str(), createTestShaders, renderPassTest, TestConfig(renderPass, render, commandBuffer, imageMemory, targetSize, renderPos, renderSize, 1293809)); 4538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4541c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi group->addChild(attachmentCountGroup.release()); 4542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 454358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi} 454458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 454558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvitemplate<typename T> 454658a80a6102cf592f064b8094c59812081ee5d323Mika IsojärviT chooseRandom (de::Random& rng, const set<T>& values) 454758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi{ 454858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi size_t ndx = ((size_t)rng.getUint32()) % values.size(); 454958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi typename set<T>::const_iterator iter = values.begin(); 455058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 455158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (; ndx > 0; ndx--) 455258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi iter++; 4553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 455458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi return *iter; 4555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 455758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid addAttachmentAllocationTests (tcu::TestCaseGroup* group) 4558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 attachmentCounts[] = { 4, 8 }; 4560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp loadOps[] = 4561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_LOAD, 4563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE 4565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp storeOps[] = 4568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE 4571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 457324fb688e68b85c2752c5ab81d8292a1fed1e9addscygan const VkImageLayout initialAndFinalColorLayouts[] = 4574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, 4576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 457724fb688e68b85c2752c5ab81d8292a1fed1e9addscygan VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 457824fb688e68b85c2752c5ab81d8292a1fed1e9addscygan VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, 457924fb688e68b85c2752c5ab81d8292a1fed1e9addscygan VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL 458024fb688e68b85c2752c5ab81d8292a1fed1e9addscygan }; 458124fb688e68b85c2752c5ab81d8292a1fed1e9addscygan 458258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageLayout initialAndFinalDepthStencilLayouts[] = 458358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 458458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_GENERAL, 458558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 458658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, 458758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 458858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, 458958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL 459058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 459158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 4592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayouts[] = 4593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, 4595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 4596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi enum AllocationType 4599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Each pass uses one more attachmen than previous one 4601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_GROW, 4602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Each pass uses one less attachment than previous one 4603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_SHRINK, 4604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Each pass drops one attachment and picks up new one 4605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_ROLL, 4606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Start by growing and end by shrinking 460758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ALLOCATIONTYPE_GROW_SHRINK, 460858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi // Each subpass has single input and single output attachment 460958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ALLOCATIONTYPE_IO_CHAIN, 461058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi // Each subpass has multiple inputs and multiple outputs attachment 461158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ALLOCATIONTYPE_IO_GENERIC 4612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AllocationType allocationTypes[] = 4615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_GROW, 4617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_SHRINK, 4618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_ROLL, 461958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ALLOCATIONTYPE_GROW_SHRINK, 462058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ALLOCATIONTYPE_IO_CHAIN, 462158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ALLOCATIONTYPE_IO_GENERIC 4622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const char* const allocationTypeStr[] = 4625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi "grow", 4627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi "shrink", 4628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi "roll", 462958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi "grow_shrink", 463058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi "input_output_chain", 463158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi "input_output", 4632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::RenderTypes renderCommands[] = 4635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_NONE, 4637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_CLEAR, 4638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_DRAW, 4639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW, 4640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::CommandBufferTypes commandBuffers[] = 4643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_INLINE, 4645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_SECONDARY, 4646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_INLINE|TestConfig::COMMANDBUFFERTYPES_SECONDARY 4647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::ImageMemory imageMemories[] = 4650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_STRICT, 4652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_LAZY, 4653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_STRICT|TestConfig::IMAGEMEMORY_LAZY 4654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSizes[] = 4657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(64, 64), 4659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(63, 65) 4660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPositions[] = 4663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(0, 0), 4665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(3, 17) 4666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4668c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSizes[] = 4669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(32, 32), 4671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(60, 47) 4672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 467458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi tcu::TestContext& testCtx = group->getTestContext(); 4675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::Random rng (3700649827u); 4676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t allocationTypeNdx = 0; allocationTypeNdx < DE_LENGTH_OF_ARRAY(allocationTypes); allocationTypeNdx++) 4678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AllocationType allocationType = allocationTypes[allocationTypeNdx]; 4680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const size_t testCaseCount = 100; 4681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> allocationTypeGroup (new tcu::TestCaseGroup(testCtx, allocationTypeStr[allocationTypeNdx], allocationTypeStr[allocationTypeNdx])); 4682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t testCaseNdx = 0; testCaseNdx < testCaseCount; testCaseNdx++) 4684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 468558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (allocationType == ALLOCATIONTYPE_IO_GENERIC) 4686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 468758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentCount = 4u + rng.getUint32() % 31u; 468858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 subpassCount = 4u + rng.getUint32() % 31u; 468958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<Attachment> attachments; 4690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 469158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi set<deUint32> definedAttachments; 4692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 469358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<Subpass> subpasses; 469458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi set<deUint32> colorAttachments; 469558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi set<deUint32> depthStencilAttachments; 4696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 469758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 attachmentIndex = 0; attachmentIndex < attachmentCount; attachmentIndex++) 4698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 469958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool isDepthStencilAttachment = rng.getFloat() < 0.01f; 470058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT; 470158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentLoadOp loadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 470258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentStoreOp storeOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 470358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 470458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageLayout initialLayout = isDepthStencilAttachment 470558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ? rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalDepthStencilLayouts), DE_ARRAY_END(initialAndFinalDepthStencilLayouts)) 470658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi : rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts)); 470758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageLayout finalizeLayout = isDepthStencilAttachment 470858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ? rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalDepthStencilLayouts), DE_ARRAY_END(initialAndFinalDepthStencilLayouts)) 470958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi : rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts)); 471058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 471158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentLoadOp stencilLoadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 471258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentStoreOp stencilStoreOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 471358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 471458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (isDepthStencilAttachment) 4715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 471658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkFormat format = rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreDepthStencilFormats), DE_ARRAY_END(s_coreDepthStencilFormats)); 471758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 471858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (loadOp == VK_ATTACHMENT_LOAD_OP_LOAD || loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR 471958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi || stencilLoadOp == VK_ATTACHMENT_LOAD_OP_LOAD || stencilLoadOp == VK_ATTACHMENT_LOAD_OP_CLEAR) 472058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi definedAttachments.insert(attachmentIndex); 4721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 472258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi depthStencilAttachments.insert(attachmentIndex); 472358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 472458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout)); 4725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 472658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 472758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 472858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkFormat format = rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreColorFormats), DE_ARRAY_END(s_coreColorFormats)); 472958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 473058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (loadOp == VK_ATTACHMENT_LOAD_OP_LOAD || loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR) 473158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi definedAttachments.insert(attachmentIndex); 4732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 473358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi colorAttachments.insert(attachmentIndex); 473458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 473558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout)); 473658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 4737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 473858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<Maybe<deUint32> > lastUseOfAttachment (attachments.size(), nothing<deUint32>()); 473958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<SubpassDependency> deps; 474058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 474158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 subpassIndex = 0; subpassIndex < subpassCount; subpassIndex++) 4742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 474358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 colorAttachmentCount = depthStencilAttachments.empty() 474458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ? 1 + rng.getUint32() % de::min(4u, (deUint32)colorAttachments.size()) 474558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi : rng.getUint32() % (de::min(4u, (deUint32)colorAttachments.size()) + 1u); 474658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 inputAttachmentCount = rng.getUint32() % (deUint32)(de::min<size_t>(4, definedAttachments.size()) + 1); 474758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool useDepthStencilAttachment = !depthStencilAttachments.empty() && (colorAttachmentCount == 0 || rng.getBool()); 474858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi std::vector<deUint32> subpassColorAttachments (colorAttachmentCount); 474958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi std::vector<deUint32> subpassInputAttachments (inputAttachmentCount); 475058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi Maybe<deUint32> depthStencilAttachment (useDepthStencilAttachment 475158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi ? just(chooseRandom(rng, depthStencilAttachments)) 475258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi : nothing<deUint32>()); 475358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi std::vector<deUint32> subpassPreserveAttachments; 475458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 475558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi rng.choose(colorAttachments.begin(), colorAttachments.end(), subpassColorAttachments.begin(), colorAttachmentCount); 475658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi rng.choose(definedAttachments.begin(), definedAttachments.end(), subpassInputAttachments.begin(), inputAttachmentCount); 475758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 475858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t colorAttachmentNdx = 0; colorAttachmentNdx < subpassColorAttachments.size(); colorAttachmentNdx++) 475958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi definedAttachments.insert(subpassColorAttachments[colorAttachmentNdx]); 476058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 476158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (depthStencilAttachment) 476258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi definedAttachments.insert(*depthStencilAttachment); 4763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 476558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi std::vector<AttachmentReference> inputAttachmentReferences; 476658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi std::vector<AttachmentReference> colorAttachmentReferences; 476758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentReference depthStencilAttachmentReference (VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL); 476858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 476958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t colorAttachmentNdx = 0; colorAttachmentNdx < subpassColorAttachments.size(); colorAttachmentNdx++) 477058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 477158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 colorAttachmentIndex = subpassColorAttachments[colorAttachmentNdx]; 477258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi // \todo [mika 2016-08-25] Check if attachment is not used as input attachment and use other image layouts 477358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageLayout subpassLayout = VK_IMAGE_LAYOUT_GENERAL; 477458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 477558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (lastUseOfAttachment[colorAttachmentIndex]) 477658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 477758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool byRegion = rng.getBool(); 477858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 477958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deps.push_back(SubpassDependency(*lastUseOfAttachment[colorAttachmentIndex], subpassIndex, 478058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 478158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 478258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 478358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 478458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 478558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 478658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 478758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 478858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 478958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 479058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, 479158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, 479258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 479358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi byRegion ? (VkDependencyFlags)VK_DEPENDENCY_BY_REGION_BIT : 0u)); 479458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 479558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 479658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi lastUseOfAttachment[colorAttachmentIndex] = just(subpassIndex); 479758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 479858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)subpassColorAttachments[colorAttachmentNdx], subpassLayout)); 479958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 480058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 480158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t inputAttachmentNdx = 0; inputAttachmentNdx < subpassInputAttachments.size(); inputAttachmentNdx++) 480258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 480358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 inputAttachmentIndex = subpassInputAttachments[inputAttachmentNdx]; 480458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi // \todo [mika 2016-08-25] Check if attachment is not used as color attachment and use other image layouts 480558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageLayout subpassLayout = VK_IMAGE_LAYOUT_GENERAL; 480658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 480758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if(lastUseOfAttachment[inputAttachmentIndex]) 480858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 480958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if(*lastUseOfAttachment[inputAttachmentIndex] == subpassIndex) 481058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 481158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deps.push_back(SubpassDependency(subpassIndex, subpassIndex, 481258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 481358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 481458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 481558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 481658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 481758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 481858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 481958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 482058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 482158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 482258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, 482358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, 482458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 482558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_DEPENDENCY_BY_REGION_BIT)); 482658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 482758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 482858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 482958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool byRegion = rng.getBool(); 483058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 483158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deps.push_back(SubpassDependency(*lastUseOfAttachment[inputAttachmentIndex], subpassIndex, 483258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 483358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 483458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 483558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 483658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 483758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 483858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 483958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 484058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 484158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 484258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, 484358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, 484458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 484558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi byRegion ? (VkDependencyFlags)VK_DEPENDENCY_BY_REGION_BIT : 0u)); 484658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 484758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 484858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi lastUseOfAttachment[inputAttachmentIndex] = just(subpassIndex); 484958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 485058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi inputAttachmentReferences.push_back(AttachmentReference((deUint32)subpassInputAttachments[inputAttachmentNdx], subpassLayout)); 485158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 485258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 485358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 485458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (depthStencilAttachment) 485558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 485658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi // \todo [mika 2016-08-25] Check if attachment is not used as input attachment and use other image layouts 485758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (lastUseOfAttachment[*depthStencilAttachment]) 485858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 485958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if(*lastUseOfAttachment[*depthStencilAttachment] == subpassIndex) 486058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 486158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deps.push_back(SubpassDependency(subpassIndex, subpassIndex, 486258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 486358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 486458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 486558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 486658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 486758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 486858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 486958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 487058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 487158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 487258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, 487358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, 487458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 487558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_DEPENDENCY_BY_REGION_BIT)); 487658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 487758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 487858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 487958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool byRegion = rng.getBool(); 488058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 488158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deps.push_back(SubpassDependency(*lastUseOfAttachment[*depthStencilAttachment], subpassIndex, 488258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 488358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 488458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 488558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 488658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 488758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 488858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 488958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 489058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 489158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 489258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, 489358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, 489458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 489558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi byRegion ? (VkDependencyFlags)VK_DEPENDENCY_BY_REGION_BIT : 0u)); 489658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 489758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 489858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 489958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi lastUseOfAttachment[*depthStencilAttachment] = just(subpassIndex); 490058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi depthStencilAttachmentReference = AttachmentReference(*depthStencilAttachment, VK_IMAGE_LAYOUT_GENERAL); 490158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 490258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 490358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi depthStencilAttachmentReference = AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL); 490458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 490558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32> preserveAttachments; 490658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (deUint32 attachmentIndex = 0; attachmentIndex < (deUint32)attachments.size(); attachmentIndex++) 490758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 490858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (lastUseOfAttachment[attachmentIndex] && (*lastUseOfAttachment[attachmentIndex]) != subpassIndex) 490958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi preserveAttachments.push_back(attachmentIndex); 491058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 491158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 491258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, 491358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi inputAttachmentReferences, 491458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi colorAttachmentReferences, 491558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 491658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi depthStencilAttachmentReference, 491758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi preserveAttachments)); 4918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 492158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const TestConfig::RenderTypes render = rng.choose<TestConfig::RenderTypes>(DE_ARRAY_BEGIN(renderCommands), DE_ARRAY_END(renderCommands)); 492258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const TestConfig::CommandBufferTypes commandBuffer = rng.choose<TestConfig::CommandBufferTypes>(DE_ARRAY_BEGIN(commandBuffers), DE_ARRAY_END(commandBuffers)); 492358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const TestConfig::ImageMemory imageMemory = rng.choose<TestConfig::ImageMemory>(DE_ARRAY_BEGIN(imageMemories), DE_ARRAY_END(imageMemories)); 4924c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 492558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const string testCaseName = de::toString(testCaseNdx); 492658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 targetSize = rng.choose<UVec2>(DE_ARRAY_BEGIN(targetSizes), DE_ARRAY_END(targetSizes)); 492758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 renderPos = rng.choose<UVec2>(DE_ARRAY_BEGIN(renderPositions), DE_ARRAY_END(renderPositions)); 492858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 renderSize = rng.choose<UVec2>(DE_ARRAY_BEGIN(renderSizes), DE_ARRAY_END(renderSizes)); 4929c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 493058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const RenderPass renderPass (attachments, subpasses, deps); 4931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 493258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addFunctionCaseWithPrograms<TestConfig>(allocationTypeGroup.get(), testCaseName.c_str(), testCaseName.c_str(), createTestShaders, renderPassTest, TestConfig(renderPass, render, commandBuffer, imageMemory, targetSize, renderPos, renderSize, 80329)); 4933c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 493558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 4936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 493758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const deUint32 attachmentCount = rng.choose<deUint32>(DE_ARRAY_BEGIN(attachmentCounts), DE_ARRAY_END(attachmentCounts)); 493858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<Attachment> attachments; 493958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<Subpass> subpasses; 494058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 494158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount; attachmentNdx++) 4942c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 494358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT; 494458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkFormat format = rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreColorFormats), DE_ARRAY_END(s_coreColorFormats)); 494558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentLoadOp loadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 494658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentStoreOp storeOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 4947c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 494858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageLayout initialLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts)); 494958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageLayout finalizeLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts)); 4950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 495158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentLoadOp stencilLoadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 495258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentStoreOp stencilStoreOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 4953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 495458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout)); 4955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4956c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 495758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi if (allocationType == ALLOCATIONTYPE_GROW) 4958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 495958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++) 496058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 496158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 496258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 496358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpassNdx + 1; attachmentNdx++) 496458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 496558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 496658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 496758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout)); 496858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 4969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 497058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, 497158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 497258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi colorAttachmentReferences, 497358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 497458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 497558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())); 497658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 497758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 497858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else if (allocationType == ALLOCATIONTYPE_SHRINK) 497958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 498058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++) 4981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 498258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 498358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 498458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < (attachmentCount - subpassNdx); attachmentNdx++) 498558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 498658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 4987c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 498858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout)); 498958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 499058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 499158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, 499258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 499358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi colorAttachmentReferences, 499458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 499558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 499658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())); 4997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 499858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 499958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else if (allocationType == ALLOCATIONTYPE_ROLL) 500058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 500158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t subpassNdx = 0; subpassNdx < attachmentCount / 2; subpassNdx++) 500258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 500358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 5004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 500558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount / 2; attachmentNdx++) 500658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 500758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 500858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 500958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)(subpassNdx + attachmentNdx), subpassLayout)); 501058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 501158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 501258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, 501358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 501458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi colorAttachmentReferences, 501558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 501658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 501758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())); 501858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 5019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 502058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else if (allocationType == ALLOCATIONTYPE_GROW_SHRINK) 502158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 502258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++) 502358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 502458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 5025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 502658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpassNdx + 1; attachmentNdx++) 502758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 502858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 5029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 503058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout)); 503158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 503258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 503358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, 503458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 503558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi colorAttachmentReferences, 503658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 503758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 503858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())); 503958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 5040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 504158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++) 504258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 504358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 504458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 504558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < (attachmentCount - subpassNdx); attachmentNdx++) 504658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 504758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 5048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 504958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout)); 505058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 505158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 505258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, 505358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 505458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi colorAttachmentReferences, 505558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 505658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 505758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())); 505858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 505958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 506058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else if (allocationType == ALLOCATIONTYPE_IO_CHAIN) 5061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 506258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, 506358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 506458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)))), 506558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 506658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 506758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())); 506858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 506958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t subpassNdx = 1; subpassNdx < attachmentCount; subpassNdx++) 507058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 507158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, 507258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(1, AttachmentReference((deUint32)(subpassNdx - 1), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)), 507358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(1, AttachmentReference((deUint32)(subpassNdx), rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)))), 507458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 507558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 507658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())); 507758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 5078c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 507958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi else 508058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi DE_FATAL("Unknown allocation type"); 5081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 508258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 508358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const TestConfig::RenderTypes render = rng.choose<TestConfig::RenderTypes>(DE_ARRAY_BEGIN(renderCommands), DE_ARRAY_END(renderCommands)); 508458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const TestConfig::CommandBufferTypes commandBuffer = rng.choose<TestConfig::CommandBufferTypes>(DE_ARRAY_BEGIN(commandBuffers), DE_ARRAY_END(commandBuffers)); 508558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const TestConfig::ImageMemory imageMemory = rng.choose<TestConfig::ImageMemory>(DE_ARRAY_BEGIN(imageMemories), DE_ARRAY_END(imageMemories)); 508658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 508758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const string testCaseName = de::toString(testCaseNdx); 508858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 targetSize = rng.choose<UVec2>(DE_ARRAY_BEGIN(targetSizes), DE_ARRAY_END(targetSizes)); 508958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 renderPos = rng.choose<UVec2>(DE_ARRAY_BEGIN(renderPositions), DE_ARRAY_END(renderPositions)); 509058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 renderSize = rng.choose<UVec2>(DE_ARRAY_BEGIN(renderSizes), DE_ARRAY_END(renderSizes)); 509158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 509258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<SubpassDependency> deps; 509358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 509458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t subpassNdx = 0; subpassNdx < subpasses.size() - 1; subpassNdx++) 509558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 509658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const bool byRegion = rng.getBool(); 509758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deps.push_back(SubpassDependency((deUint32)subpassNdx, (deUint32)subpassNdx + 1, 509858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 509958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 510058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 510158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 510258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 510358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 510458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 510558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 510658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 510758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 510858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, 510958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, 511058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 511158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi byRegion ? (VkDependencyFlags)VK_DEPENDENCY_BY_REGION_BIT : 0u)); 511258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 5113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 511458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const RenderPass renderPass (attachments, subpasses, deps); 511558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 511658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addFunctionCaseWithPrograms<TestConfig>(allocationTypeGroup.get(), testCaseName.c_str(), testCaseName.c_str(), createTestShaders, renderPassTest, TestConfig(renderPass, render, commandBuffer, imageMemory, targetSize, renderPos, renderSize, 80329)); 511758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 5118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 5119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 5120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi group->addChild(allocationTypeGroup.release()); 5121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 5122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 5123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 512458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid addSimpleTests (tcu::TestCaseGroup* group) 5125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 512658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 targetSize (64, 64); 512758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 renderPos (0, 0); 512858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 renderSize (64, 64); 5129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // color 5131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 5132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(1, Attachment(VK_FORMAT_R8G8B8A8_UNORM, 513368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 5134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 5135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 5136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 5137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 5138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 5139c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 5140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 5141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 5142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 5144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 514658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())), 5147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 5148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 514958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group, "color", "Single color attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 5150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 5151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // depth 5153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 515468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const RenderPass renderPass (vector<Attachment>(1, Attachment(VK_FORMAT_X8_D24_UNORM_PACK32, 515568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 5156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 5157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 5158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 5159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 5160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 5161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)), 5162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 5163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 5164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 516858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())), 5169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 5170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 517158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group, "depth", "Single depth attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 5172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 5173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // stencil 5175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 5176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(1, Attachment(VK_FORMAT_S8_UINT, 517768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 5178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 5179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 5180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 5181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 5182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 5183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)), 5184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 5185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 5186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 519058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())), 5191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 5192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 519358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group, "stencil", "Single stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 5194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 5195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // depth_stencil 5197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 5198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(1, Attachment(VK_FORMAT_D24_UNORM_S8_UINT, 519968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 5200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 5201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 5202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 5203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 5204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 5205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)), 5206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 5207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 5208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 521258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())), 5213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 5214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 521558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group, "depth_stencil", "Single depth stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 5216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 5217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // color_depth 5219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 5220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachments[] = 5221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 5222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment(VK_FORMAT_R8G8B8A8_UNORM, 522368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 5224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 5225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 5226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 5227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 5228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 5229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL), 523068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos Attachment(VK_FORMAT_X8_D24_UNORM_PACK32, 523168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 5232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 5233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 5234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 5235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 5236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 5237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 5238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 5239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)), 5241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 5242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 5243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 5245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 524758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())), 5248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 5249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 525058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group, "color_depth", "Color and depth attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 5251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 5252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // color_stencil 5254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 5255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachments[] = 5256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 5257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment(VK_FORMAT_R8G8B8A8_UNORM, 525868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 5259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 5260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 5261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 5262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 5263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 5264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL), 5265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment(VK_FORMAT_S8_UINT, 526668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 5267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 5268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 5269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 5270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 5271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 5272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 5273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 5274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)), 5276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 5277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 5278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 5280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 528258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())), 5283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 5284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 528658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group, "color_stencil", "Color and stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 5287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 5288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // color_depth_stencil 5290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 5291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachments[] = 5292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 5293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment(VK_FORMAT_R8G8B8A8_UNORM, 529468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 5295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 5296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 5297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 5298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 5299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 5300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL), 5301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment(VK_FORMAT_D24_UNORM_S8_UINT, 530268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 5303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 5304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 5305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 5306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 5307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 5308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 5309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 5310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)), 5312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 5313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 5314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 5316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 531858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())), 5319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 5320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 532158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group, "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)); 5322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 5323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 5324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string formatToName (VkFormat format) 5326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 5327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const std::string formatStr = de::toString(format); 5328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const std::string prefix = "VK_FORMAT_"; 5329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(formatStr.substr(0, prefix.length()) == prefix); 5331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return de::toLower(formatStr.substr(prefix.length())); 5333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 5334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 533558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvivoid addFormatTests (tcu::TestCaseGroup* group) 5336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 533758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi tcu::TestContext& testCtx = group->getTestContext(); 533858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 533958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 targetSize (64, 64); 534058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 renderPos (0, 0); 534158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const UVec2 renderSize (64, 64); 5342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 534358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const struct 534458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 534558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const char* const str; 534658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentStoreOp op; 534758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } storeOps[] = 534858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 534958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { "store", VK_ATTACHMENT_STORE_OP_STORE }, 535058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { "dont_care", VK_ATTACHMENT_STORE_OP_DONT_CARE } 535158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi }; 5352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const struct 5354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 5355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const char* const str; 5356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp op; 5357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } loadOps[] = 5358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 5359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "clear", VK_ATTACHMENT_LOAD_OP_CLEAR }, 5360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "load", VK_ATTACHMENT_LOAD_OP_LOAD }, 5361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "dont_care", VK_ATTACHMENT_LOAD_OP_DONT_CARE } 5362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 5363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const struct 5365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 5366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const char* const str; 5367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::RenderTypes types; 5368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } renderTypes[] = 5369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 5370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "clear", TestConfig::RENDERTYPES_CLEAR }, 5371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "draw", TestConfig::RENDERTYPES_DRAW }, 5372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "clear_draw", TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW } 5373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 5374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 537518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi // Color formats 537618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_coreColorFormats); formatNdx++) 5377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 537818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkFormat format = s_coreColorFormats[formatNdx]; 5379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> formatGroup (new tcu::TestCaseGroup(testCtx, formatToName(format).c_str(), de::toString(format).c_str())); 5380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t loadOpNdx = 0; loadOpNdx < DE_LENGTH_OF_ARRAY(loadOps); loadOpNdx++) 5382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 5383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp loadOp = loadOps[loadOpNdx].op; 5384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> loadOpGroup (new tcu::TestCaseGroup(testCtx, loadOps[loadOpNdx].str, loadOps[loadOpNdx].str)); 5385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypes); renderTypeNdx++) 5387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 5388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(1, Attachment(format, 538968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 5390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi loadOp, 5391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 5392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 5393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 5394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 5395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 5396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 5397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 5398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 5400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 5401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 540258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())), 5403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 540418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 540518cca0001c3ce503dcc339c839ed85be639e11e5Mika 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)); 540618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi } 540718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 540818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi formatGroup->addChild(loadOpGroup.release()); 540918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi } 541018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 541158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 541258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi de::MovePtr<tcu::TestCaseGroup> inputGroup (new tcu::TestCaseGroup(testCtx, "input", "Test attachment format as input")); 541358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 541458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t loadOpNdx = 0; loadOpNdx < DE_LENGTH_OF_ARRAY(loadOps); loadOpNdx++) 541558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 541658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentLoadOp loadOp = loadOps[loadOpNdx].op; 541758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi de::MovePtr<tcu::TestCaseGroup> loadOpGroup (new tcu::TestCaseGroup(testCtx, loadOps[loadOpNdx].str, loadOps[loadOpNdx].str)); 541858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 541958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t storeOpNdx = 0; storeOpNdx < DE_LENGTH_OF_ARRAY(storeOps); storeOpNdx++) 542058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 542158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentStoreOp storeOp = storeOps[storeOpNdx].op; 542258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi de::MovePtr<tcu::TestCaseGroup> storeOpGroup (new tcu::TestCaseGroup(testCtx, storeOps[storeOpNdx].str, storeOps[storeOpNdx].str)); 542358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 542458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypes); renderTypeNdx++) 542558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 542658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 542758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<Attachment> attachments; 542858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<Subpass> subpasses; 542958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<SubpassDependency> deps; 543058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 543158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachments.push_back(Attachment(format, 543258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_SAMPLE_COUNT_1_BIT, 543358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi loadOp, 543458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi storeOp, 543558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 543658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 543758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 543858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)); 543958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 544058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachments.push_back(Attachment(vk::VK_FORMAT_R8G8B8A8_UNORM, 544158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_SAMPLE_COUNT_1_BIT, 544258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 544358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 544458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 544558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 544658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 544758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)); 544858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 544958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 545058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0u, 545158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 545258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 545358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 545458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 545558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())); 545658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 545758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0u, 545858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)), 545958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(1, AttachmentReference(1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 546058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 546158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 546258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())); 546358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 546458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deps.push_back(SubpassDependency(0, 1, 546558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 546658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 546758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 546858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 546958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, 547058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, 547158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_DEPENDENCY_BY_REGION_BIT)); 547258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 547358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 547458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const RenderPass renderPass (attachments, subpasses, deps); 547558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 547658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addFunctionCaseWithPrograms<TestConfig>(storeOpGroup.get(), renderTypes[renderTypeNdx].str, renderTypes[renderTypeNdx].str, createTestShaders, renderPassTest, TestConfig(renderPass, renderTypes[renderTypeNdx].types, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 89246)); 547758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 547858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 547958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 548058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<Attachment> attachments; 548158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<Subpass> subpasses; 548258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<SubpassDependency> deps; 548358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 548458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachments.push_back(Attachment(format, 548558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_SAMPLE_COUNT_1_BIT, 548658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi loadOp, 548758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi storeOp, 548858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 548958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 549058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 549158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)); 549258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 549358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 549458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0u, 549558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 549658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 549758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 549858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 549958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())); 550058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 550158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0u, 550258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_GENERAL)), 550358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_GENERAL)), 550458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 550558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 550658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())); 550758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 550858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deps.push_back(SubpassDependency(0, 1, 550958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 551058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 551158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 551258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, 551358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, 551458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_DEPENDENCY_BY_REGION_BIT)); 551558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 551658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 551758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const RenderPass renderPass (attachments, subpasses, deps); 551858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 551958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addFunctionCaseWithPrograms<TestConfig>(storeOpGroup.get(), string("self_dep_") + renderTypes[renderTypeNdx].str, string("self_dep_") + renderTypes[renderTypeNdx].str, createTestShaders, renderPassTest, TestConfig(renderPass, renderTypes[renderTypeNdx].types, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 89246)); 552058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 552158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 552258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 552358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 552458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi loadOpGroup->addChild(storeOpGroup.release()); 552558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 552658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 552758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi inputGroup->addChild(loadOpGroup.release()); 552858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 552958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 553058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi formatGroup->addChild(inputGroup.release()); 553158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 553258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 553318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi group->addChild(formatGroup.release()); 553418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi } 553518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 553618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi // Depth stencil formats 553718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_coreDepthStencilFormats); formatNdx++) 553818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi { 55399475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi const VkFormat vkFormat = s_coreDepthStencilFormats[formatNdx]; 55409475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi de::MovePtr<tcu::TestCaseGroup> formatGroup (new tcu::TestCaseGroup(testCtx, formatToName(vkFormat).c_str(), de::toString(vkFormat).c_str())); 554118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 554218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi for (size_t loadOpNdx = 0; loadOpNdx < DE_LENGTH_OF_ARRAY(loadOps); loadOpNdx++) 554318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi { 554418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkAttachmentLoadOp loadOp = loadOps[loadOpNdx].op; 554518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi de::MovePtr<tcu::TestCaseGroup> loadOpGroup (new tcu::TestCaseGroup(testCtx, loadOps[loadOpNdx].str, loadOps[loadOpNdx].str)); 554618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 554718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi for (size_t renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypes); renderTypeNdx++) 554818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi { 55499475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi const tcu::TextureFormat format = mapVkFormat(vkFormat); 55509475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi const bool isStencilAttachment = hasStencilComponent(format.order); 55519475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi const bool isDepthAttachment = hasDepthComponent(format.order); 55529475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi const RenderPass renderPass (vector<Attachment>(1, Attachment(vkFormat, 555318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_SAMPLE_COUNT_1_BIT, 55549475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi isDepthAttachment ? loadOp : VK_ATTACHMENT_LOAD_OP_DONT_CARE, 55559475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi isDepthAttachment ? VK_ATTACHMENT_STORE_OP_STORE :VK_ATTACHMENT_STORE_OP_DONT_CARE, 55569475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi isStencilAttachment ? loadOp : VK_ATTACHMENT_LOAD_OP_DONT_CARE, 55579475e8deec9763bcbf2aba58fbf05ffbf53e41fdMika Isojärvi isStencilAttachment ? VK_ATTACHMENT_STORE_OP_STORE :VK_ATTACHMENT_STORE_OP_DONT_CARE, 555818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 555918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)), 556018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 556118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 0u, 556218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<AttachmentReference>(), 556318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<AttachmentReference>(), 556418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<AttachmentReference>(), 556518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 556658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())), 556718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<SubpassDependency>()); 5568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5569c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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)); 5570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 5571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi formatGroup->addChild(loadOpGroup.release()); 5573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 5574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 557558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 557658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi de::MovePtr<tcu::TestCaseGroup> inputGroup (new tcu::TestCaseGroup(testCtx, "input", "Test attachment format as input")); 557758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 557858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t loadOpNdx = 0; loadOpNdx < DE_LENGTH_OF_ARRAY(loadOps); loadOpNdx++) 557958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 558058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentLoadOp loadOp = loadOps[loadOpNdx].op; 558158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi de::MovePtr<tcu::TestCaseGroup> loadOpGroup (new tcu::TestCaseGroup(testCtx, loadOps[loadOpNdx].str, loadOps[loadOpNdx].str)); 558258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 558358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t storeOpNdx = 0; storeOpNdx < DE_LENGTH_OF_ARRAY(storeOps); storeOpNdx++) 558458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 558558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const VkAttachmentStoreOp storeOp = storeOps[storeOpNdx].op; 558658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi de::MovePtr<tcu::TestCaseGroup> storeOpGroup (new tcu::TestCaseGroup(testCtx, storeOps[storeOpNdx].str, storeOps[storeOpNdx].str)); 558758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 558858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi for (size_t renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypes); renderTypeNdx++) 558958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 559058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 559158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<Attachment> attachments; 559258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<Subpass> subpasses; 559358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<SubpassDependency> deps; 559458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 559558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachments.push_back(Attachment(vkFormat, 559658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_SAMPLE_COUNT_1_BIT, 559758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi loadOp, 559858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi storeOp, 559958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 560058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 560158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 560258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)); 560358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 560458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachments.push_back(Attachment(vk::VK_FORMAT_R8G8B8A8_UNORM, 560558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_SAMPLE_COUNT_1_BIT, 560658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 560758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 560858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 560958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 561058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 561158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)); 561258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 561358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 561458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0u, 561558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 561658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 561758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 561858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 561958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())); 562058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 562158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0u, 562258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)), 562358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(1, AttachmentReference(1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 562458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 562558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 562658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())); 562758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 562858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deps.push_back(SubpassDependency(0, 1, 562958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 563058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 563158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 563258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, 563358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, 563458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0u)); 563558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 563658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deps.push_back(SubpassDependency(1, 1, 563758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 563858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 563958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 564058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, 564158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, 564258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_DEPENDENCY_BY_REGION_BIT)); 564358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 564458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const RenderPass renderPass (attachments, subpasses, deps); 564558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 564658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addFunctionCaseWithPrograms<TestConfig>(storeOpGroup.get(), renderTypes[renderTypeNdx].str, renderTypes[renderTypeNdx].str, createTestShaders, renderPassTest, TestConfig(renderPass, renderTypes[renderTypeNdx].types, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 89246)); 564758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 564858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 564958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 565058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<Attachment> attachments; 565158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<Subpass> subpasses; 565258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<SubpassDependency> deps; 565358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 565458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi attachments.push_back(Attachment(vkFormat, 565558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_SAMPLE_COUNT_1_BIT, 565658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi loadOp, 565758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi storeOp, 565858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 565958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 566058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 566158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)); 566258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 566358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 566458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0u, 566558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 566658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 566758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 566858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 566958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())); 567058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 567158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 0u, 567258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_GENERAL)), 567358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 567458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<AttachmentReference>(), 567558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi AttachmentReference(0, VK_IMAGE_LAYOUT_GENERAL), 567658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vector<deUint32>())); 567758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 567858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi deps.push_back(SubpassDependency(0, 1, 567958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | vk::VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 568058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 568158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 568258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, 568358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, 568458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi vk::VK_DEPENDENCY_BY_REGION_BIT)); 568558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 568658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi { 568758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi const RenderPass renderPass (attachments, subpasses, deps); 568858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 568958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addFunctionCaseWithPrograms<TestConfig>(storeOpGroup.get(), string("self_dep_") + renderTypes[renderTypeNdx].str, string("self_dep_") + renderTypes[renderTypeNdx].str, createTestShaders, renderPassTest, TestConfig(renderPass, renderTypes[renderTypeNdx].types, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 89246)); 569058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 569158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 569258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 569358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 569458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi loadOpGroup->addChild(storeOpGroup.release()); 569558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 569658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 569758a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi inputGroup->addChild(loadOpGroup.release()); 569858a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 569958a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 570058a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi formatGroup->addChild(inputGroup.release()); 570158a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi } 570258a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi 5703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi group->addChild(formatGroup.release()); 5704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 5705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 5706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} // anonymous 5708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvitcu::TestCaseGroup* createRenderPassTests (tcu::TestContext& testCtx) 5710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 5711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> renderpassTests (new tcu::TestCaseGroup(testCtx, "renderpass", "RenderPass Tests")); 5712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 571358a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addTestGroup(renderpassTests.get(), "simple", "Simple basic render pass tests", addSimpleTests); 571458a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addTestGroup(renderpassTests.get(), "formats", "Tests for different image formats.", addFormatTests); 571558a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addTestGroup(renderpassTests.get(), "attachment", "Attachment format and count tests with load and store ops and image layouts", addAttachmentTests); 571658a80a6102cf592f064b8094c59812081ee5d323Mika Isojärvi addTestGroup(renderpassTests.get(), "attachment_allocation", "Attachment allocation tests", addAttachmentAllocationTests); 5717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return renderpassTests.release(); 5719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 5720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 5721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} // vkt 5722