vktRenderPassTests.cpp revision 978d3d585aa549eb1e729b51e9d85fc6477240f9
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" 27c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 28c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkDefs.hpp" 29c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkDeviceUtil.hpp" 30c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkImageUtil.hpp" 31c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkMemUtil.hpp" 32c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkPlatform.hpp" 33c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkPrograms.hpp" 34c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkQueryUtil.hpp" 35c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkRef.hpp" 36c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkRefUtil.hpp" 37c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkStrUtil.hpp" 38c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "vkTypeUtil.hpp" 39c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 40c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuTestLog.hpp" 41c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuResultCollector.hpp" 42c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuFormatUtil.hpp" 43c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuTextureUtil.hpp" 44c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuFloat.hpp" 45c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuMaybe.hpp" 46c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "tcuVectorUtil.hpp" 47c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 48c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deUniquePtr.hpp" 49c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deSharedPtr.hpp" 50c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deStringUtil.hpp" 51c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deSTLUtil.hpp" 52c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include "deRandom.hpp" 53c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 54c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi#include <limits> 55c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 56c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing namespace vk; 57c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 58c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::Maybe; 59c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::nothing; 60c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::just; 61c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::TestLog; 62c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::Vec2; 63c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::IVec2; 64c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::UVec2; 65c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::IVec4; 66c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::UVec4; 67c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::Vec4; 68c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::BVec4; 69c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::ConstPixelBufferAccess; 70c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing tcu::PixelBufferAccess; 71c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 72c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing de::UniquePtr; 73c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 74c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing std::vector; 75c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviusing std::string; 76c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 77c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvinamespace vkt 78c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 79c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvinamespace 80c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 81c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvienum 82c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 83c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi STENCIL_VALUE = 84u, 84c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Limit integer values that are representable as floats 85c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi MAX_INTEGER_VALUE = ((1u<<22u)-1u) 86c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 87c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 88c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi// Utility functions using flattened structs 89c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkFence> createFence (const DeviceInterface& vk, VkDevice device, VkFenceCreateFlags flags) 90c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 91c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkFenceCreateInfo pCreateInfo = 92c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 93c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, 94c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 95c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 96c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi flags 97c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 98955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createFence(vk, device, &pCreateInfo); 99c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 100c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 10168e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkFramebuffer> createFramebuffer (const DeviceInterface& vk, 10268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDevice device, 10368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkFramebufferCreateFlags pCreateInfo_flags, 10468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkRenderPass pCreateInfo_renderPass, 10568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_attachmentCount, 10668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkImageView* pCreateInfo_pAttachments, 10768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_width, 10868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_height, 10968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_layers) 110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkFramebufferCreateInfo pCreateInfo = 112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, 114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 11568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_flags, 116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_renderPass, 117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_attachmentCount, 118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_pAttachments, 119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_width, 120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_height, 121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_layers, 122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 123955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createFramebuffer(vk, device, &pCreateInfo); 124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 12668e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkImage> createImage (const DeviceInterface& vk, 12768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDevice device, 12868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageCreateFlags pCreateInfo_flags, 12968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageType pCreateInfo_imageType, 13068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkFormat pCreateInfo_format, 13168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkExtent3D pCreateInfo_extent, 13268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_mipLevels, 13368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_arrayLayers, 13468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSampleCountFlagBits pCreateInfo_samples, 13568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageTiling pCreateInfo_tiling, 13668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageUsageFlags pCreateInfo_usage, 13768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSharingMode pCreateInfo_sharingMode, 13868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_queueFamilyCount, 13968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const deUint32* pCreateInfo_pQueueFamilyIndices, 14068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout pCreateInfo_initialLayout) 141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageCreateInfo pCreateInfo = 143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, 145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 14668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_flags, 147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_imageType, 148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_format, 149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_extent, 150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_mipLevels, 15168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_arrayLayers, 152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_samples, 153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_tiling, 154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_usage, 155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_sharingMode, 156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_queueFamilyCount, 157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_pQueueFamilyIndices, 158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_initialLayout 159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 160955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createImage(vk, device, &pCreateInfo); 161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid bindBufferMemory (const DeviceInterface& vk, VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memOffset) 164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.bindBufferMemory(device, buffer, mem, memOffset)); 166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid bindImageMemory (const DeviceInterface& vk, VkDevice device, VkImage image, VkDeviceMemory mem, VkDeviceSize memOffset) 169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.bindImageMemory(device, image, mem, memOffset)); 171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 173c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImageView> createImageView (const DeviceInterface& vk, 174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 17568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageViewCreateFlags pCreateInfo_flags, 176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImage pCreateInfo_image, 177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageViewType pCreateInfo_viewType, 178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkFormat pCreateInfo_format, 17968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkComponentMapping pCreateInfo_components, 18068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageSubresourceRange pCreateInfo_subresourceRange) 181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageViewCreateInfo pCreateInfo = 183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, 185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 18668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_flags, 187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_image, 188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_viewType, 189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_format, 19068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_components, 191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_subresourceRange, 192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 193955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createImageView(vk, device, &pCreateInfo); 194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 19668e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkBuffer> createBuffer (const DeviceInterface& vk, 19768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDevice device, 19868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkBufferCreateFlags pCreateInfo_flags, 19968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDeviceSize pCreateInfo_size, 20068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkBufferUsageFlags pCreateInfo_usage, 20168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSharingMode pCreateInfo_sharingMode, 20268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_queueFamilyCount, 20368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const deUint32* pCreateInfo_pQueueFamilyIndices) 204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBufferCreateInfo pCreateInfo = 206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, 208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 20968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_flags, 210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_size, 211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_usage, 212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_sharingMode, 213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_queueFamilyCount, 214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_pQueueFamilyIndices, 215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 216955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createBuffer(vk, device, &pCreateInfo); 217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 21968e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkCommandPool> createCommandPool (const DeviceInterface& vk, 22068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDevice device, 22168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandPoolCreateFlags pCreateInfo_flags, 22268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pCreateInfo_queueFamilyIndex) 223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 22468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandPoolCreateInfo pCreateInfo = 225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 22668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, 227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_flags, 229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_queueFamilyIndex, 230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 231955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return createCommandPool(vk, device, &pCreateInfo); 232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 23468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid cmdBeginRenderPass (const DeviceInterface& vk, 23568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer cmdBuffer, 23668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkRenderPass pRenderPassBegin_renderPass, 23768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkFramebuffer pRenderPassBegin_framebuffer, 23868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkRect2D pRenderPassBegin_renderArea, 23968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos deUint32 pRenderPassBegin_clearValueCount, 24068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkClearValue* pRenderPassBegin_pAttachmentClearValues, 24168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSubpassContents contents) 242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkRenderPassBeginInfo pRenderPassBegin = 244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, 246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pRenderPassBegin_renderPass, 248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pRenderPassBegin_framebuffer, 249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pRenderPassBegin_renderArea, 25068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pRenderPassBegin_clearValueCount, 251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pRenderPassBegin_pAttachmentClearValues, 252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdBeginRenderPass(cmdBuffer, &pRenderPassBegin, contents); 254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 25668e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosMove<VkCommandBuffer> allocateCommandBuffer (const DeviceInterface& vk, 25768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDevice device, 25868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandPool pCreateInfo_commandPool, 25968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBufferLevel pCreateInfo_level) 260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 261955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos const VkCommandBufferAllocateInfo pAllocateInfo = 262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 26368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, 264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 26568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCreateInfo_commandPool, 266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pCreateInfo_level, 26768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // bufferCount 268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 269955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos return allocateCommandBuffer(vk, device, &pAllocateInfo); 270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 27268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid beginCommandBuffer (const DeviceInterface& vk, 27368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer cmdBuffer, 27468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBufferUsageFlags pBeginInfo_flags, 275689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VkRenderPass pInheritanceInfo_renderPass, 276689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos deUint32 pInheritanceInfo_subpass, 277689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VkFramebuffer pInheritanceInfo_framebuffer, 278689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VkBool32 pInheritanceInfo_occlusionQueryEnable, 279689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VkQueryControlFlags pInheritanceInfo_queryFlags, 280689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VkQueryPipelineStatisticFlags pInheritanceInfo_pipelineStatistics) 281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 282689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkCommandBufferInheritanceInfo pInheritanceInfo = 283689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { 284689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, 285689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos DE_NULL, 286689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos pInheritanceInfo_renderPass, 287689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos pInheritanceInfo_subpass, 288689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos pInheritanceInfo_framebuffer, 289689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos pInheritanceInfo_occlusionQueryEnable, 290689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos pInheritanceInfo_queryFlags, 291689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos pInheritanceInfo_pipelineStatistics, 292689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos }; 293689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkCommandBufferBeginInfo pBeginInfo = 294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 29568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, 296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pBeginInfo_flags, 298689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos &pInheritanceInfo, 299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.beginCommandBuffer(cmdBuffer, &pBeginInfo)); 301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 30368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid endCommandBuffer (const DeviceInterface& vk, VkCommandBuffer cmdBuffer) 304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.endCommandBuffer(cmdBuffer)); 306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 30868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosvoid queueSubmit (const DeviceInterface& vk, VkQueue queue, deUint32 cmdBufferCount, const VkCommandBuffer* pCmdBuffers, VkFence fence) 309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 31068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSubmitInfo submitInfo = 31168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 31268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_SUBMIT_INFO, 31368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, 31468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // waitSemaphoreCount 31568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (const VkSemaphore*)DE_NULL, // pWaitSemaphores 316689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (const VkPipelineStageFlags*)DE_NULL, 31768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos cmdBufferCount, // commandBufferCount 31868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos pCmdBuffers, 31968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // signalSemaphoreCount 32068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (const VkSemaphore*)DE_NULL, // pSignalSemaphores 32168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }; 32268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_CHECK(vk.queueSubmit(queue, 1u, &submitInfo, fence)); 323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid waitForFences (const DeviceInterface& vk, VkDevice device, deUint32 fenceCount, const VkFence* pFences, VkBool32 waitAll, deUint64 timeout) 326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.waitForFences(device, fenceCount, pFences, waitAll, timeout)); 328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 330c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkImageAspectFlags getImageAspectFlags (VkFormat vkFormat) 331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(vkFormat); 333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST == 21); 335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (format.order) 337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::DS: 339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; 340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::D: 342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return VK_IMAGE_ASPECT_DEPTH_BIT; 343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::S: 345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return VK_IMAGE_ASPECT_STENCIL_BIT; 346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return VK_IMAGE_ASPECT_COLOR_BIT; 349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 35268e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkAccessFlags getAllMemoryReadFlags (void) 353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 35468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_ACCESS_TRANSFER_READ_BIT 35568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_UNIFORM_READ_BIT 35668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_HOST_READ_BIT 35768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_INDEX_READ_BIT 35868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_SHADER_READ_BIT 35968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT 36068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_INDIRECT_COMMAND_READ_BIT 36168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT 36268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT 36368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; 364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 36668e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkAccessFlags getAllMemoryWriteFlags (void) 367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 36868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_ACCESS_TRANSFER_WRITE_BIT 36968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_HOST_WRITE_BIT 37068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_SHADER_WRITE_BIT 37168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT 37268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; 373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 375c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkPipelineStageFlags getAllPipelineStageFlags (void) 376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 37768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT 378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_TRANSFER_BIT 379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT 380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT 381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT 382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_VERTEX_INPUT_BIT 383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT 384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 38568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT 386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT 388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; 390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass AttachmentReference 393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference (deUint32 attachment, 396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout layout) 397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_attachment (attachment) 398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_layout (layout) 399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getAttachment (void) const { return m_attachment; } 403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout getImageLayout (void) const { return m_layout; } 404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 m_attachment; 407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout m_layout; 408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass Subpass 411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Subpass (VkPipelineBindPoint pipelineBindPoint, 414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkSubpassDescriptionFlags flags, 415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& inputAttachments, 416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& colorAttachments, 417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& resolveAttachments, 418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference depthStencilAttachment, 419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& preserveAttachments) 420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_pipelineBindPoint (pipelineBindPoint) 421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_flags (flags) 422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_inputAttachments (inputAttachments) 423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_colorAttachments (colorAttachments) 424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_resolveAttachments (resolveAttachments) 425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_depthStencilAttachment (depthStencilAttachment) 426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_preserveAttachments (preserveAttachments) 427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineBindPoint getPipelineBindPoint (void) const { return m_pipelineBindPoint; } 431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkSubpassDescriptionFlags getFlags (void) const { return m_flags; } 432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& getInputAttachments (void) const { return m_inputAttachments; } 433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& getColorAttachments (void) const { return m_colorAttachments; } 434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& getResolveAttachments (void) const { return m_resolveAttachments; } 435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& getDepthStencilAttachment (void) const { return m_depthStencilAttachment; } 436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& getPreserveAttachments (void) const { return m_preserveAttachments; } 437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineBindPoint m_pipelineBindPoint; 440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkSubpassDescriptionFlags m_flags; 441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> m_inputAttachments; 443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> m_colorAttachments; 444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> m_resolveAttachments; 445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference m_depthStencilAttachment; 446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> m_preserveAttachments; 448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassDependency 451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi SubpassDependency (deUint32 srcPass, 454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 dstPass, 455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags srcStageMask, 457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags dstStageMask, 458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 45968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags outputMask, 46068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags inputMask, 461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 46268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDependencyFlags flags) 463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_srcPass (srcPass) 464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_dstPass (dstPass) 465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_srcStageMask (srcStageMask) 467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_dstStageMask (dstStageMask) 468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_outputMask (outputMask) 470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_inputMask (inputMask) 47168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos , m_flags (flags) 472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getSrcPass (void) const { return m_srcPass; } 476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getDstPass (void) const { return m_dstPass; } 477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags getSrcStageMask (void) const { return m_srcStageMask; } 479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags getDstStageMask (void) const { return m_dstStageMask; } 480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 48168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags getOutputMask (void) const { return m_outputMask; } 48268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags getInputMask (void) const { return m_inputMask; } 483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 48468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDependencyFlags getFlags (void) const { return m_flags; } 485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 m_srcPass; 488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 m_dstPass; 489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags m_srcStageMask; 491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineStageFlags m_dstStageMask; 492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 49368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags m_outputMask; 49468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAccessFlags m_inputMask; 49568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkDependencyFlags m_flags; 496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass Attachment 499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment (VkFormat format, 50268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSampleCountFlagBits samples, 503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkAttachmentLoadOp loadOp, 505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkAttachmentStoreOp storeOp, 506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkAttachmentLoadOp stencilLoadOp, 508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkAttachmentStoreOp stencilStoreOp, 509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout initialLayout, 511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout finalLayout) 512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_format (format) 513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_samples (samples) 514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_loadOp (loadOp) 516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_storeOp (storeOp) 517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_stencilLoadOp (stencilLoadOp) 519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_stencilStoreOp (stencilStoreOp) 520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_initialLayout (initialLayout) 522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_finalLayout (finalLayout) 523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 52668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkFormat getFormat (void) const { return m_format; } 52768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSampleCountFlagBits getSamples (void) const { return m_samples; } 528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 52968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentLoadOp getLoadOp (void) const { return m_loadOp; } 53068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentStoreOp getStoreOp (void) const { return m_storeOp; } 531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 53368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentLoadOp getStencilLoadOp (void) const { return m_stencilLoadOp; } 53468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentStoreOp getStencilStoreOp (void) const { return m_stencilStoreOp; } 535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 53668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout getInitialLayout (void) const { return m_initialLayout; } 53768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout getFinalLayout (void) const { return m_finalLayout; } 538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 54068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkFormat m_format; 54168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSampleCountFlagBits m_samples; 542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 54368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentLoadOp m_loadOp; 54468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentStoreOp m_storeOp; 545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 54668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentLoadOp m_stencilLoadOp; 54768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkAttachmentStoreOp m_stencilStoreOp; 548c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 54968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout m_initialLayout; 55068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkImageLayout m_finalLayout; 551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass RenderPass 554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RenderPass (const vector<Attachment>& attachments, 557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses, 558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassDependency>& dependencies) 559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_attachments (attachments) 560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_subpasses (subpasses) 561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_dependencies (dependencies) 562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment>& getAttachments (void) const { return m_attachments; } 566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& getSubpasses (void) const { return m_subpasses; } 567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassDependency>& getDependencies (void) const { return m_dependencies; } 568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment> m_attachments; 571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass> m_subpasses; 572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassDependency> m_dependencies; 573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistruct TestConfig 576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi enum RenderTypes 578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RENDERTYPES_NONE = 0, 580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RENDERTYPES_CLEAR = (1<<1), 581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RENDERTYPES_DRAW = (1<<2) 582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi enum CommandBufferTypes 585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi COMMANDBUFFERTYPES_INLINE = (1<<0), 587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi COMMANDBUFFERTYPES_SECONDARY = (1<<1) 588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi enum ImageMemory 591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi IMAGEMEMORY_STRICT = (1<<0), 593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi IMAGEMEMORY_LAZY = (1<<1) 594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig (const RenderPass& renderPass_, 597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RenderTypes renderTypes_, 598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi CommandBufferTypes commandBufferTypes_, 599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ImageMemory imageMemory_, 600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& targetSize_, 601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderPos_, 602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderSize_, 603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 seed_) 604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : renderPass (renderPass_) 605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , renderTypes (renderTypes_) 606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , commandBufferTypes (commandBufferTypes_) 607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , imageMemory (imageMemory_) 608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , targetSize (targetSize_) 609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , renderPos (renderPos_) 610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , renderSize (renderSize_) 611c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , seed (seed_) 612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RenderPass renderPass; 616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RenderTypes renderTypes; 617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi CommandBufferTypes commandBufferTypes; 618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ImageMemory imageMemory; 619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 targetSize; 620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 renderPos; 621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 renderSize; 622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 seed; 623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 625c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::RenderTypes operator| (TestConfig::RenderTypes a, TestConfig::RenderTypes b) 626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return (TestConfig::RenderTypes)(((deUint32)a) | ((deUint32)b)); 628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 630c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::CommandBufferTypes operator| (TestConfig::CommandBufferTypes a, TestConfig::CommandBufferTypes b) 631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return (TestConfig::CommandBufferTypes)(((deUint32)a) | ((deUint32)b)); 633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 635c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviTestConfig::ImageMemory operator| (TestConfig::ImageMemory a, TestConfig::ImageMemory b) 636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return (TestConfig::ImageMemory)(((deUint32)a) | ((deUint32)b)); 638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid logRenderPassInfo (TestLog& log, 641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPass) 642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection section (log, "RenderPass", "RenderPass"); 644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection attachmentsSection (log, "Attachments", "Attachments"); 647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment>& attachments = renderPass.getAttachments(); 648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++) 650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection attachmentSection (log, "Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx)); 652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = attachments[attachmentNdx]; 653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Format: " << attachment.getFormat() << TestLog::EndMessage; 655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Samples: " << attachment.getSamples() << TestLog::EndMessage; 656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "LoadOp: " << attachment.getLoadOp() << TestLog::EndMessage; 658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "StoreOp: " << attachment.getStoreOp() << TestLog::EndMessage; 659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "StencilLoadOp: " << attachment.getStencilLoadOp() << TestLog::EndMessage; 661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "StencilStoreOp: " << attachment.getStencilStoreOp() << TestLog::EndMessage; 662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "InitialLayout: " << attachment.getInitialLayout() << TestLog::EndMessage; 664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "FinalLayout: " << attachment.getFinalLayout() << TestLog::EndMessage; 665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 668c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection subpassesSection (log, "Subpasses", "Subpasses"); 670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses = renderPass.getSubpasses(); 671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++) 673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection subpassSection (log, "Subpass" + de::toString(subpassNdx), "Subpass " + de::toString(subpassNdx)); 675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = subpasses[subpassNdx]; 676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& inputAttachments = subpass.getInputAttachments(); 678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& colorAttachments = subpass.getColorAttachments(); 679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& resolveAttachments = subpass.getResolveAttachments(); 680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& preserveAttachments = subpass.getPreserveAttachments(); 681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!inputAttachments.empty()) 683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection inputAttachmentsSection (log, "Inputs", "Inputs"); 685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t inputNdx = 0; inputNdx < inputAttachments.size(); inputNdx++) 687c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection inputAttachmentSection (log, "Input" + de::toString(inputNdx), "Input " + de::toString(inputNdx)); 689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& inputAttachment = inputAttachments[inputNdx]; 690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Attachment: " << inputAttachment.getAttachment() << TestLog::EndMessage; 692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Layout: " << inputAttachment.getImageLayout() << TestLog::EndMessage; 693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection depthStencilAttachmentSection (log, "DepthStencil", "DepthStencil"); 699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& depthStencilAttachment = subpass.getDepthStencilAttachment(); 700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Attachment: " << depthStencilAttachment.getAttachment() << TestLog::EndMessage; 702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Layout: " << depthStencilAttachment.getImageLayout() << TestLog::EndMessage; 703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!colorAttachments.empty()) 706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection colorAttachmentsSection (log, "Colors", "Colors"); 708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t colorNdx = 0; colorNdx < colorAttachments.size(); colorNdx++) 710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection colorAttachmentSection (log, "Color" + de::toString(colorNdx), "Color " + de::toString(colorNdx)); 712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& colorAttachment = colorAttachments[colorNdx]; 713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Attachment: " << colorAttachment.getAttachment() << TestLog::EndMessage; 715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Layout: " << colorAttachment.getImageLayout() << TestLog::EndMessage; 716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!resolveAttachments.empty()) 720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection resolveAttachmentsSection (log, "Resolves", "Resolves"); 722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t resolveNdx = 0; resolveNdx < resolveAttachments.size(); resolveNdx++) 724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection resolveAttachmentSection (log, "Resolve" + de::toString(resolveNdx), "Resolve " + de::toString(resolveNdx)); 726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& resolveAttachment = resolveAttachments[resolveNdx]; 727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Attachment: " << resolveAttachment.getAttachment() << TestLog::EndMessage; 729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Layout: " << resolveAttachment.getImageLayout() << TestLog::EndMessage; 730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!preserveAttachments.empty()) 734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection preserveAttachmentsSection (log, "Preserves", "Preserves"); 736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t preserveNdx = 0; preserveNdx < preserveAttachments.size(); preserveNdx++) 738c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection preserveAttachmentSection (log, "Preserve" + de::toString(preserveNdx), "Preserve " + de::toString(preserveNdx)); 740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& preserveAttachment = preserveAttachments[preserveNdx]; 741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Attachment: " << preserveAttachment.getAttachment() << TestLog::EndMessage; 743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Layout: " << preserveAttachment.getImageLayout() << TestLog::EndMessage; 744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 747c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 750c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!renderPass.getDependencies().empty()) 751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection dependenciesSection (log, "Dependencies", "Dependencies"); 753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t depNdx = 0; depNdx < renderPass.getDependencies().size(); depNdx++) 755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection dependencySection (log, "Dependency" + de::toString(depNdx), "Dependency " + de::toString(depNdx)); 757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassDependency& dep = renderPass.getDependencies()[depNdx]; 758c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 759c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Source: " << dep.getSrcPass() << TestLog::EndMessage; 760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Destination: " << dep.getDstPass() << TestLog::EndMessage; 761c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Source Stage Mask: " << dep.getSrcStageMask() << TestLog::EndMessage; 763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Destination Stage Mask: " << dep.getDstStageMask() << TestLog::EndMessage; 764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Input Mask: " << dep.getInputMask() << TestLog::EndMessage; 766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Output Mask: " << dep.getOutputMask() << TestLog::EndMessage; 76768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos log << TestLog::Message << "Dependency Flags: " << getDependencyFlagsStr(dep.getFlags()) << TestLog::EndMessage; 768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 769c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 772c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string clearColorToString (VkFormat vkFormat, VkClearColorValue value) 773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(vkFormat); 775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 776c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::BVec4 channelMask = tcu::getTextureFormatChannelMask(format); 777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi std::ostringstream stream; 779c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "("; 781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 782c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (channelClass) 783c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 784c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 785c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int i = 0; i < 4; i++) 786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (i > 0) 788c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ", "; 789c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 790c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (channelMask[i]) 791c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << value.int32[i]; 792c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 793c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "Undef"; 794c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 795c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 796c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 797c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 798c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int i = 0; i < 4; i++) 799c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 800c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (i > 0) 801c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ", "; 802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (channelMask[i]) 804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << value.uint32[i]; 805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "Undef"; 807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 808c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 809c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 813c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int i = 0; i < 4; i++) 814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (i > 0) 816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ", "; 817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 818c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (channelMask[i]) 819c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << value.float32[i]; 820c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "Undef"; 822c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 823c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 824c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 826c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown channel class"); 827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ")"; 830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return stream.str(); 832c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 833c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 834c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string clearValueToString (VkFormat vkFormat, VkClearValue value) 835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(vkFormat); 837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order) || tcu::hasDepthComponent(format.order)) 839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi std::ostringstream stream; 841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "("; 843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order)) 845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "stencil: " << value.depthStencil.stencil; 846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order) && tcu::hasDepthComponent(format.order)) 848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ", "; 849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 850c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order)) 851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << "depth: " << value.depthStencil.depth; 852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stream << ")"; 854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return stream.str(); 856c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 857c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return clearColorToString(vkFormat, value.color); 859c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 860c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 861c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkClearColorValue randomColorClearValue (const Attachment& attachment, de::Random& rng) 862c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 863c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clearNan = tcu::Float32::nan().asFloat(); 864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 865c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::BVec4 channelMask = tcu::getTextureFormatChannelMask(format); 867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkClearColorValue clearColor; 868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (channelClass) 870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::IVec4 valueMin = tcu::getFormatMinIntValue(format); 874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::IVec4 valueMax = tcu::getFormatMaxIntValue(format); 875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 876c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int ndx = 0; ndx < 4; ndx++) 877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!channelMask[ndx]) 879c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearColor.int32[ndx] = std::numeric_limits<deInt32>::min(); 880c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearColor.uint32[ndx] = rng.getInt(valueMin[ndx], valueMax[ndx]); 882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec4 valueMax = tcu::getFormatMaxUintValue(format); 889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int ndx = 0; ndx < 4; ndx++) 891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!channelMask[ndx]) 893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearColor.uint32[ndx] = std::numeric_limits<deUint32>::max(); 894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearColor.uint32[ndx] = rng.getUint32() % valueMax[ndx]; 896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo formatInfo = tcu::getTextureFormatInfo(format); 905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int ndx = 0; ndx < 4; ndx++) 907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!channelMask[ndx]) 909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearColor.float32[ndx] = clearNan; 910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearColor.float32[ndx] = formatInfo.valueMin[ndx] + rng.getFloat() * (formatInfo.valueMax[ndx] - formatInfo.valueMin[ndx]); 912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown channel class"); 918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return clearColor; 921c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 922c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 923c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkAttachmentDescription createAttachmentDescription (const Attachment& attachment) 924c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 925c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentDescription attachmentDescription = 926c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 92768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0, // flags 928c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 92968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachment.getFormat(), // format 93068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachment.getSamples(), // samples 931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 93268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachment.getLoadOp(), // loadOp 93368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachment.getStoreOp(), // storeOp 934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 93568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachment.getStencilLoadOp(), // stencilLoadOp 93668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachment.getStencilStoreOp(), // stencilStoreOp 937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 93868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachment.getInitialLayout(), // initialLayout 93968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachment.getFinalLayout(), // finalLayout 940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 941c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 942c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return attachmentDescription; 943c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 944c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 945c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkAttachmentReference createAttachmentReference (const AttachmentReference& referenceInfo) 946c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 947c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentReference reference = 948c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi referenceInfo.getAttachment(), // attachment; 950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi referenceInfo.getImageLayout() // layout; 951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return reference; 954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 956c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkSubpassDescription createSubpassDescription (const Subpass& subpass, 957689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vector<VkAttachmentReference>* attachmentReferenceLists, 958689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vector<deUint32>* preserveAttachmentReferences) 959c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 96068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vector<VkAttachmentReference>& inputAttachmentReferences = attachmentReferenceLists[0]; 96168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vector<VkAttachmentReference>& colorAttachmentReferences = attachmentReferenceLists[1]; 96268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vector<VkAttachmentReference>& resolveAttachmentReferences = attachmentReferenceLists[2]; 96368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vector<VkAttachmentReference>& depthStencilAttachmentReferences = attachmentReferenceLists[3]; 964c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 965c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++) 966c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.push_back(createAttachmentReference(subpass.getColorAttachments()[attachmentNdx])); 967c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getInputAttachments().size(); attachmentNdx++) 969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi inputAttachmentReferences.push_back(createAttachmentReference(subpass.getInputAttachments()[attachmentNdx])); 970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getResolveAttachments().size(); attachmentNdx++) 972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi resolveAttachmentReferences.push_back(createAttachmentReference(subpass.getResolveAttachments()[attachmentNdx])); 973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 97468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos depthStencilAttachmentReferences.push_back(createAttachmentReference(subpass.getDepthStencilAttachment())); 97568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getPreserveAttachments().size(); attachmentNdx++) 977689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos preserveAttachmentReferences->push_back(subpass.getPreserveAttachments()[attachmentNdx].getAttachment()); 978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(resolveAttachmentReferences.empty() || colorAttachmentReferences.size() == resolveAttachmentReferences.size()); 980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 98268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSubpassDescription subpassDescription = 983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 984689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos subpass.getFlags(), // flags; 985689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos subpass.getPipelineBindPoint(), // pipelineBindPoint; 986c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 987689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)inputAttachmentReferences.size(), // inputCount; 988689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos inputAttachmentReferences.empty() ? DE_NULL : &inputAttachmentReferences[0], // inputAttachments; 989c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 990689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)colorAttachmentReferences.size(), // colorCount; 991689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos colorAttachmentReferences.empty() ? DE_NULL : &colorAttachmentReferences[0], // colorAttachments; 992689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos resolveAttachmentReferences.empty() ? DE_NULL : &resolveAttachmentReferences[0], // resolveAttachments; 993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 994689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos &depthStencilAttachmentReferences[0], // pDepthStencilAttachment; 995689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)preserveAttachmentReferences->size(), // preserveCount; 996689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos preserveAttachmentReferences->empty() ? DE_NULL : &(*preserveAttachmentReferences)[0] // preserveAttachments; 997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 998c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 99968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return subpassDescription; 1000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1003c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkSubpassDependency createSubpassDependency (const SubpassDependency& dependencyInfo) 1004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkSubpassDependency dependency = 1006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dependencyInfo.getSrcPass(), // srcSubpass; 1008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dependencyInfo.getDstPass(), // destSubpass; 1009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dependencyInfo.getSrcStageMask(), // srcStageMask; 1011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dependencyInfo.getDstStageMask(), // destStageMask; 1012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dependencyInfo.getOutputMask(), // outputMask; 1014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dependencyInfo.getInputMask(), // inputMask; 1015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 101668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos dependencyInfo.getFlags() // dependencyFlags; 1017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return dependency; 1020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1022c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkRenderPass> createRenderPass (const DeviceInterface& vk, 1023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPassInfo) 1025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1026689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const size_t perSubpassAttachmentReferenceLists = 4; 1027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkAttachmentDescription> attachments; 1028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkSubpassDescription> subpasses; 1029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkSubpassDependency> dependencies; 1030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<vector<VkAttachmentReference> > attachmentReferenceLists(renderPassInfo.getSubpasses().size() * perSubpassAttachmentReferenceLists); 1031689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vector<vector<deUint32> > preserveAttachments(renderPassInfo.getSubpasses().size()); 1032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1033c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 1034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachments.push_back(createAttachmentDescription(renderPassInfo.getAttachments()[attachmentNdx])); 1035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++) 1037689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos subpasses.push_back(createSubpassDescription(renderPassInfo.getSubpasses()[subpassNdx], &(attachmentReferenceLists[subpassNdx * perSubpassAttachmentReferenceLists]), &preserveAttachments[subpassNdx])); 1038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1039c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t depNdx = 0; depNdx < renderPassInfo.getDependencies().size(); depNdx++) 1040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dependencies.push_back(createSubpassDependency(renderPassInfo.getDependencies()[depNdx])); 1041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 104368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkRenderPassCreateInfo createInfo = 104468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 104568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, 104668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, 104768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkRenderPassCreateFlags)0u, 104868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (deUint32)attachments.size(), 104968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (attachments.empty() ? DE_NULL : &attachments[0]), 105068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (deUint32)subpasses.size(), 105168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (subpasses.empty() ? DE_NULL : &subpasses[0]), 105268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (deUint32)dependencies.size(), 105368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (dependencies.empty() ? DE_NULL : &dependencies[0]) 105468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }; 105568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 105668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return createRenderPass(vk, device, &createInfo); 1057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1058c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1060c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkFramebuffer> createFramebuffer (const DeviceInterface& vk, 1061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkRenderPass renderPass, 1063c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 1064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<VkImageView>& attachments) 1065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 106668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return createFramebuffer(vk, device, 0u, renderPass, (deUint32)attachments.size(), attachments.empty() ? DE_NULL : &attachments[0], size.x(), size.y(), 1u); 1067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1069c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImage> createAttachmentImage (const DeviceInterface& vk, 1070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1071c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 queueIndex, 1072c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 1073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkFormat format, 107468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkSampleCountFlagBits samples, 1075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageUsageFlags usageFlags, 1076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout layout) 1077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1078689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos const VkExtent3D size_ = { size.x(), size.y(), 1u }; 1079775c33feeee3a8a7cfe1a51447424d4160083fffscygan VkImageUsageFlags targetUsageFlags = 0; 1080775c33feeee3a8a7cfe1a51447424d4160083fffscygan const tcu::TextureFormat textureFormat = mapVkFormat(format); 108194128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos 10829cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan if (tcu::hasDepthComponent(textureFormat.order) || tcu::hasStencilComponent(textureFormat.order)) 1083775c33feeee3a8a7cfe1a51447424d4160083fffscygan { 10849cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan targetUsageFlags |= vk::VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; 1085775c33feeee3a8a7cfe1a51447424d4160083fffscygan } 108694128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos else 1087775c33feeee3a8a7cfe1a51447424d4160083fffscygan { 10889cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan targetUsageFlags |= vk::VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 1089775c33feeee3a8a7cfe1a51447424d4160083fffscygan } 10909cfe9b4b870704f81620ec1e5c53d3c0144ad8f7scygan 109168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return createImage(vk, device, 109268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkImageCreateFlags)0, 109368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_TYPE_2D, 109468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos format, 109568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos size_, 109668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u /* mipLevels */, 109768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u /* arraySize */, 109868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos samples, 109968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_TILING_OPTIMAL, 110068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos usageFlags | targetUsageFlags, 110168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SHARING_MODE_EXCLUSIVE, 110268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1, 110368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos &queueIndex, 110468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos layout); 1105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<Allocation> createImageMemory (const DeviceInterface& vk, 1108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Allocator& allocator, 1110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImage image, 1111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool lazy) 1112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<Allocation> allocation (allocator.allocate(getImageMemoryRequirements(vk, device, image), lazy ? MemoryRequirement::LazilyAllocated : MemoryRequirement::Any)); 1114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bindImageMemory(vk, device, image, allocation->getMemory(), allocation->getOffset()); 1115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return allocation; 1116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1118c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkImageView> createImageAttachmentView (const DeviceInterface& vk, 1119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImage image, 1121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkFormat format, 1122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageAspectFlags aspect) 1123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageSubresourceRange range = 1125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi aspect, 1127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 1128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1, 1129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 1130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 1131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 113368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return createImageView(vk, device, 0u, image, VK_IMAGE_VIEW_TYPE_2D, format, makeComponentMappingRGBA(), range); 1134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1136c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVkClearValue randomClearValue (const Attachment& attachment, de::Random& rng) 1137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clearNan = tcu::Float32::nan().asFloat(); 1139c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 1140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order) || tcu::hasDepthComponent(format.order)) 1142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkClearValue clearValue; 1144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValue.depthStencil.depth = clearNan; 1146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValue.depthStencil.stencil = 255; 1147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order)) 1149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValue.depthStencil.stencil = rng.getInt(0, 255); 1150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order)) 1152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValue.depthStencil.depth = rng.getFloat(); 1153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return clearValue; 1155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 1157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkClearValue clearValue; 1159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValue.color = randomColorClearValue(attachment, rng); 1161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return clearValue; 1163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass AttachmentResources 1167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 1169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentResources (const DeviceInterface& vk, 1170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Allocator& allocator, 1172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 queueIndex, 1173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 1174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachmentInfo, 11755b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser VkImageUsageFlags usageFlags) 11765b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser : m_image (createAttachmentImage(vk, device, queueIndex, size, attachmentInfo.getFormat(), attachmentInfo.getSamples(), usageFlags, VK_IMAGE_LAYOUT_UNDEFINED)) 11775b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser , m_imageMemory (createImageMemory(vk, device, allocator, *m_image, ((usageFlags & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) != 0))) 1178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_attachmentView (createImageAttachmentView(vk, device, *m_image, attachmentInfo.getFormat(), getImageAspectFlags(attachmentInfo.getFormat()))) 1179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 11805b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser if ((usageFlags & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) == 0) 1181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachmentInfo.getFormat()); 1183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order) && tcu::hasStencilComponent(format.order)) 1185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1186bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz const tcu::TextureFormat depthFormat = getDepthCopyFormat(attachmentInfo.getFormat()); 1187bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz const tcu::TextureFormat stencilFormat = getStencilCopyFormat(attachmentInfo.getFormat()); 1188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_bufferSize = size.x() * size.y() * depthFormat.getPixelSize(); 1190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_secondaryBufferSize = size.x() * size.y() * stencilFormat.getPixelSize(); 1191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 119268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_buffer = createBuffer(vk, device, 0, m_bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex); 1193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_bufferMemory = allocator.allocate(getBufferMemoryRequirements(vk, device, *m_buffer), MemoryRequirement::HostVisible); 1194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bindBufferMemory(vk, device, *m_buffer, m_bufferMemory->getMemory(), m_bufferMemory->getOffset()); 1196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 119768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_secondaryBuffer = createBuffer(vk, device, 0, m_secondaryBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex); 1198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_secondaryBufferMemory = allocator.allocate(getBufferMemoryRequirements(vk, device, *m_secondaryBuffer), MemoryRequirement::HostVisible); 1199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bindBufferMemory(vk, device, *m_secondaryBuffer, m_secondaryBufferMemory->getMemory(), m_secondaryBufferMemory->getOffset()); 1201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 1203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_bufferSize = size.x() * size.y() * format.getPixelSize(); 1205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 120668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_buffer = createBuffer(vk, device, 0, m_bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_SHARING_MODE_EXCLUSIVE, 1, &queueIndex); 1207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_bufferMemory = allocator.allocate(getBufferMemoryRequirements(vk, device, *m_buffer), MemoryRequirement::HostVisible); 1208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bindBufferMemory(vk, device, *m_buffer, m_bufferMemory->getMemory(), m_bufferMemory->getOffset()); 1210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ~AttachmentResources (void) 1215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageView getAttachmentView (void) const 1219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_attachmentView; 1221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImage getImage (void) const 1224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_image; 1226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkBuffer getBuffer (void) const 1229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(*m_buffer != DE_NULL); 1231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_buffer; 1232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDeviceSize getBufferSize (void) const 1235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(*m_buffer != DE_NULL); 1237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return m_bufferSize; 1238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Allocation& getResultMemory (void) const 1241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(m_bufferMemory); 1243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_bufferMemory; 1244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkBuffer getSecondaryBuffer (void) const 1247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(*m_secondaryBuffer != DE_NULL); 1249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_secondaryBuffer; 1250c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDeviceSize getSecondaryBufferSize (void) const 1253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(*m_secondaryBuffer != DE_NULL); 1255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return m_secondaryBufferSize; 1256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Allocation& getSecondaryResultMemory (void) const 1259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(m_secondaryBufferMemory); 1261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_secondaryBufferMemory; 1262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 1265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Unique<VkImage> m_image; 1266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UniquePtr<Allocation> m_imageMemory; 1267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Unique<VkImageView> m_attachmentView; 1268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Move<VkBuffer> m_buffer; 1270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDeviceSize m_bufferSize; 1271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<Allocation> m_bufferMemory; 1272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Move<VkBuffer> m_secondaryBuffer; 1274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDeviceSize m_secondaryBufferSize; 1275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<Allocation> m_secondaryBufferMemory; 1276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid uploadBufferData (const DeviceInterface& vk, 1279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Allocation& memory, 1281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi size_t size, 1282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const void* data) 1283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkMappedMemoryRange range = 1285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // sType; 1287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 1288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi memory.getMemory(), // mem; 1289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi memory.getOffset(), // offset; 1290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (VkDeviceSize)size // size; 1291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void* const ptr = memory.getHostPtr(); 1293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deMemcpy(ptr, data, size); 1295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.flushMappedMemoryRanges(device, 1, &range)); 1296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 129868e7282426d639b54d15c4710d97ba97e72c76efPyry HaulosVkImageAspectFlagBits getPrimaryImageAspect (tcu::TextureFormat::ChannelOrder order) 1299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_STATIC_ASSERT(tcu::TextureFormat::CHANNELORDER_LAST == 21); 1301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (order) 1303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::D: 1305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::DS: 130668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_IMAGE_ASPECT_DEPTH_BIT; 1307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TextureFormat::S: 130968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_IMAGE_ASPECT_STENCIL_BIT; 1310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 131268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return VK_IMAGE_ASPECT_COLOR_BIT; 1313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass RenderQuad 1317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 1319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi RenderQuad (const Vec4& posA, const Vec4& posB) 1320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_vertices(6) 1321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertices[0] = posA; 1323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertices[1] = Vec4(posA[0], posB[1], posA[2], posA[3]); 1324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertices[2] = posB; 1325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertices[3] = posB; 1327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertices[4] = Vec4(posB[0], posA[1], posB[2], posA[3]); 1328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertices[5] = posA; 1329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4& getCornerA (void) const 1332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return m_vertices[0]; 1334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4& getCornerB (void) const 1337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return m_vertices[2]; 1339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const void* getVertexPointer (void) const 1342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return &m_vertices[0]; 1344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi size_t getVertexDataSize (void) const 1347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return sizeof(Vec4) * m_vertices.size(); 1349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 1352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Vec4> m_vertices; 1353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass ColorClear 1356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 1358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ColorClear (const UVec2& offset, 1359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 1360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearColorValue& color) 1361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_offset (offset) 1362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_size (size) 1363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_color (color) 1364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& getOffset (void) const { return m_offset; } 1368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& getSize (void) const { return m_size; } 1369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearColorValue& getColor (void) const { return m_color; } 1370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 1372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 m_offset; 1373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 m_size; 1374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkClearColorValue m_color; 1375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass DepthStencilClear 1378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 1380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DepthStencilClear (const UVec2& offset, 1381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 1382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi float depth, 1383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 stencil) 1384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_offset (offset) 1385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_size (size) 1386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_depth (depth) 1387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_stencil (stencil) 1388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& getOffset (void) const { return m_offset; } 1392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& getSize (void) const { return m_size; } 1393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi float getDepth (void) const { return m_depth; } 1394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getStencil (void) const { return m_stencil; } 1395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 1397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 m_offset; 1398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 m_size; 1399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi float m_depth; 1401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 m_stencil; 1402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassRenderInfo 1405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 1407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi SubpassRenderInfo (const RenderPass& renderPass, 1408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 subpassIndex, 1409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool isSecondary_, 1411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& viewportOffset, 1413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& viewportSize, 1414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<RenderQuad>& renderQuad, 1416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<ColorClear>& colorClears, 1417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<DepthStencilClear>& depthStencilClear) 1418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_viewportOffset (viewportOffset) 1419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_viewportSize (viewportSize) 1420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_subpassIndex (subpassIndex) 1421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_isSecondary (isSecondary_) 1422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_flags (renderPass.getSubpasses()[subpassIndex].getFlags()) 1423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_renderQuad (renderQuad) 1424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_colorClears (colorClears) 1425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_depthStencilClear (depthStencilClear) 1426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi , m_colorAttachments (renderPass.getSubpasses()[subpassIndex].getColorAttachments()) 1427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (deUint32 attachmentNdx = 0; attachmentNdx < (deUint32)m_colorAttachments.size(); attachmentNdx++) 1429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_colorAttachmentInfo.push_back(renderPass.getAttachments()[m_colorAttachments[attachmentNdx].getAttachment()]); 1430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 1432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_depthStencilAttachment = tcu::just(renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment()); 1434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_depthStencilAttachmentInfo = tcu::just(renderPass.getAttachments()[renderPass.getSubpasses()[subpassIndex].getDepthStencilAttachment().getAttachment()]); 1435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& getViewportOffset (void) const { return m_viewportOffset; } 1439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& getViewportSize (void) const { return m_viewportSize; } 1440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getSubpassIndex (void) const { return m_subpassIndex; } 1442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool isSecondary (void) const { return m_isSecondary; } 1443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<RenderQuad>& getRenderQuad (void) const { return m_renderQuad; } 1445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<ColorClear>& getColorClears (void) const { return m_colorClears; } 1446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<DepthStencilClear>& getDepthStencilClear (void) const { return m_depthStencilClear; } 1447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getColorAttachmentCount (void) const { return (deUint32)m_colorAttachments.size(); } 1449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout getColorAttachmentLayout (deUint32 attachmentNdx) const { return m_colorAttachments[attachmentNdx].getImageLayout(); } 1450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 getColorAttachmentIndex (deUint32 attachmentNdx) const { return m_colorAttachments[attachmentNdx].getAttachment(); } 1451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& getColorAttachment (deUint32 attachmentNdx) const { return m_colorAttachmentInfo[attachmentNdx]; } 1452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<VkImageLayout> getDepthStencilAttachmentLayout (void) const { return m_depthStencilAttachment ? tcu::just(m_depthStencilAttachment->getImageLayout()) : tcu::nothing<VkImageLayout>(); } 1453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<deUint32> getDepthStencilAttachmentIndex (void) const { return m_depthStencilAttachment ? tcu::just(m_depthStencilAttachment->getAttachment()) : tcu::nothing<deUint32>(); }; 1454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<Attachment>& getDepthStencilAttachment (void) const { return m_depthStencilAttachmentInfo; } 1455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkSubpassDescriptionFlags getSubpassFlags (void) const { return m_flags; } 1456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 1457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 m_viewportOffset; 1458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2 m_viewportSize; 1459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 m_subpassIndex; 1461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool m_isSecondary; 1462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkSubpassDescriptionFlags m_flags; 1463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<RenderQuad> m_renderQuad; 1465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<ColorClear> m_colorClears; 1466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<DepthStencilClear> m_depthStencilClear; 1467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> m_colorAttachments; 1469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Attachment> m_colorAttachmentInfo; 1470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<AttachmentReference> m_depthStencilAttachment; 1472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<Attachment> m_depthStencilAttachmentInfo; 1473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1475c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMove<VkPipeline> createSubpassPipeline (const DeviceInterface& vk, 1476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkRenderPass renderPass, 147868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkShaderModule vertexShaderModule, 147968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkShaderModule fragmentShaderModule, 1480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPipelineLayout pipelineLayout, 1481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassRenderInfo& renderInfo) 1482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkSpecializationInfo emptyShaderSpecializations = 1484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // mapEntryCount 1486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pMap 1487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // dataSize 1488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pData 1489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 149168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos Maybe<VkSampleCountFlagBits> rasterSamples; 1492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkPipelineColorBlendAttachmentState> attachmentBlendStates; 1493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1494c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (deUint32 attachmentNdx = 0; attachmentNdx < renderInfo.getColorAttachmentCount(); attachmentNdx++) 1495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = renderInfo.getColorAttachment(attachmentNdx); 1497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(!rasterSamples || *rasterSamples == attachment.getSamples()); 1499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi rasterSamples = attachment.getSamples(); 1501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineColorBlendAttachmentState attachmentBlendState = 1504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 150568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FALSE, // blendEnable 150668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_SRC_ALPHA, // srcBlendColor 150768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, // destBlendColor 150868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_OP_ADD, // blendOpColor 150968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ONE, // srcBlendAlpha 151068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_FACTOR_ONE, // destBlendAlpha 151168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_BLEND_OP_ADD, // blendOpAlpha 151268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_COLOR_COMPONENT_R_BIT|VK_COLOR_COMPONENT_G_BIT|VK_COLOR_COMPONENT_B_BIT|VK_COLOR_COMPONENT_A_BIT, // channelWriteMask 1513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentBlendStates.push_back(attachmentBlendState); 1516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.getDepthStencilAttachment()) 1520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = *renderInfo.getDepthStencilAttachment(); 1522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(!rasterSamples || *rasterSamples == attachment.getSamples()); 1524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi rasterSamples = attachment.getSamples(); 1525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // If there are no attachment use single sample 1528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!rasterSamples) 152968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos rasterSamples = VK_SAMPLE_COUNT_1_BIT; 1530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineShaderStageCreateInfo shaderStages[2] = 1532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // sType 1535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 153668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineShaderStageCreateFlags)0u, 153768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SHADER_STAGE_VERTEX_BIT, // stage 153868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vertexShaderModule, // shader 153968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos "main", 1540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &emptyShaderSpecializations 1541c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, 1542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // sType 1544c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 154568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineShaderStageCreateFlags)0u, 154668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SHADER_STAGE_FRAGMENT_BIT, // stage 154768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos fragmentShaderModule, // shader 154868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos "main", 1549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &emptyShaderSpecializations 1550c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkVertexInputBindingDescription vertexBinding = 1553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // binding 1555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (deUint32)sizeof(tcu::Vec4), // strideInBytes 155668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_VERTEX_INPUT_RATE_VERTEX, // stepRate 1557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkVertexInputAttributeDescription vertexAttrib = 1559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // location 1561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // binding 1562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32B32A32_SFLOAT, // format 1563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // offsetInBytes 1564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineVertexInputStateCreateInfo vertexInputState = 1566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // sType 1568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 156968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineVertexInputStateCreateFlags)0u, 1570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1u, // bindingCount 1571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &vertexBinding, // pVertexBindingDescriptions 1572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1u, // attributeCount 1573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &vertexAttrib, // pVertexAttributeDescriptions 1574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineInputAssemblyStateCreateInfo inputAssemblyState = 1576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // sType 1578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 157968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineInputAssemblyStateCreateFlags)0u, 1580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // topology 1581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // primitiveRestartEnable 1582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkViewport viewport = 1584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (float)renderInfo.getViewportOffset().x(), (float)renderInfo.getViewportOffset().y(), 1586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y(), 1587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0.0f, 1.0f 1588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkRect2D scissor = 1590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { (deInt32)renderInfo.getViewportOffset().x(), (deInt32)renderInfo.getViewportOffset().y() }, 1592689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { renderInfo.getViewportSize().x(), renderInfo.getViewportSize().y() } 1593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineViewportStateCreateInfo viewportState = 1595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, 1597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 159868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineViewportStateCreateFlags)0u, 1599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1u, 1600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &viewport, 1601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1u, 1602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &scissor 1603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 160468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkPipelineRasterizationStateCreateInfo rasterState = 1605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 160668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // sType 1607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 160868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineRasterizationStateCreateFlags)0u, 1609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_TRUE, // depthClipEnable 1610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // rasterizerDiscardEnable 161168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_POLYGON_MODE_FILL, // fillMode 1612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CULL_MODE_NONE, // cullMode 161368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FRONT_FACE_COUNTER_CLOCKWISE, // frontFace 1614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // depthBiasEnable 1615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0.0f, // depthBias 1616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0.0f, // depthBiasClamp 1617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0.0f, // slopeScaledDepthBias 1618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1.0f // lineWidth 1619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineMultisampleStateCreateInfo multisampleState = 1621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // sType 1623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 162468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineMultisampleStateCreateFlags)0u, 1625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *rasterSamples, // rasterSamples 1626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // sampleShadingEnable 1627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0.0f, // minSampleShading 162868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos DE_NULL, // pSampleMask 162968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FALSE, // alphaToCoverageEnable 163068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FALSE, // alphaToOneEnable 1631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineDepthStencilStateCreateInfo depthStencilState = 1633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // sType 1635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 163668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineDepthStencilStateCreateFlags)0u, 1637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_TRUE, // depthTestEnable 1638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_TRUE, // depthWriteEnable 1639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_COMPARE_OP_ALWAYS, // depthCompareOp 1640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // depthBoundsEnable 1641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_TRUE, // stencilTestEnable 1642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilFailOp 1644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilPassOp 1645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilDepthFailOp 1646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_COMPARE_OP_ALWAYS, // stencilCompareOp 1647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ~0u, // stencilCompareMask 1648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ~0u, // stencilWriteMask 1649a3e06bac8ee2c4ccac086f1bfc3c2e833d9f154fJeff Bolz STENCIL_VALUE // stencilReference 1650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, // front 1651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilFailOp 1653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilPassOp 1654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STENCIL_OP_REPLACE, // stencilDepthFailOp 1655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_COMPARE_OP_ALWAYS, // stencilCompareOp 1656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ~0u, // stencilCompareMask 1657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ~0u, // stencilWriteMask 1658a3e06bac8ee2c4ccac086f1bfc3c2e833d9f154fJeff Bolz STENCIL_VALUE // stencilReference 1659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, // back 1660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi -1.0f, // minDepthBounds; 1662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1.0f // maxDepthBounds; 1663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineColorBlendStateCreateInfo blendState = 1665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // sType 1667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 166868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineColorBlendStateCreateFlags)0u, 1669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FALSE, // logicOpEnable 1670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_LOGIC_OP_COPY, // logicOp 1671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (deUint32)attachmentBlendStates.size(), // attachmentCount 1672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentBlendStates.empty() ? DE_NULL : &attachmentBlendStates[0],// pAttachments 1673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 0.0f, 0.0f, 0.0f, 0.0f } // blendConst 1674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineDynamicStateCreateInfo dynamicState = 1676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, 1678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 167968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineDynamicStateCreateFlags)0u, 1680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 1681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL 1682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkGraphicsPipelineCreateInfo createInfo = 1684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // sType 1686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 168768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (VkPipelineCreateFlags)0u, 1688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2, // stageCount 1690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi shaderStages, // pStages 1691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &vertexInputState, // pVertexInputState 1693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &inputAssemblyState, // pInputAssemblyState 1694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pTessellationState 1695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &viewportState, // pViewportState 1696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &rasterState, // pRasterState 1697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &multisampleState, // pMultisampleState 1698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &depthStencilState, // pDepthStencilState 1699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &blendState, // pColorBlendState 1700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi &dynamicState, // pDynamicState 1701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pipelineLayout, // layout 1702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderPass, // renderPass 1704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderInfo.getSubpassIndex(), // subpass 1705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // basePipelineHandle 1706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u // basePipelineIndex 1707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return createGraphicsPipeline(vk, device, DE_NULL, &createInfo); 1710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass SubpassRenderer 1713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 1715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi SubpassRenderer (Context& context, 1716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DeviceInterface& vk, 1717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 1718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Allocator& allocator, 1719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkRenderPass renderPass, 1720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkFramebuffer framebuffer, 172168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandPool commandBufferPool, 1722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 queueFamilyIndex, 1723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassRenderInfo& renderInfo) 1724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : m_renderInfo (renderInfo) 1725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 subpassIndex = renderInfo.getSubpassIndex(); 1727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.getRenderQuad()) 1729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderQuad& renderQuad = *renderInfo.getRenderQuad(); 1731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkPipelineLayoutCreateInfo pipelineLayoutParams = 1732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, // sType; 1734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 173568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos (vk::VkPipelineLayoutCreateFlags)0, 1736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // descriptorSetCount; 1737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pSetLayouts; 1738c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, // pushConstantRangeCount; 1739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pPushConstantRanges; 1740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertexShaderModule = createShaderModule(vk, device, context.getBinaryCollection().get(de::toString(subpassIndex) + "-vert"), 0u); 1743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_fragmentShaderModule = createShaderModule(vk, device, context.getBinaryCollection().get(de::toString(subpassIndex) + "-frag"), 0u); 1744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_pipelineLayout = createPipelineLayout(vk, device, &pipelineLayoutParams); 174568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_pipeline = createSubpassPipeline(vk, device, renderPass, *m_vertexShaderModule, *m_fragmentShaderModule, *m_pipelineLayout, m_renderInfo); 1746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 174768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_vertexBuffer = createBuffer(vk, device, 0u, (VkDeviceSize)renderQuad.getVertexDataSize(), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_SHARING_MODE_EXCLUSIVE, 1u, &queueFamilyIndex); 1748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi m_vertexBufferMemory = allocator.allocate(getBufferMemoryRequirements(vk, device, *m_vertexBuffer), MemoryRequirement::HostVisible); 1749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1750c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bindBufferMemory(vk, device, *m_vertexBuffer, m_vertexBufferMemory->getMemory(), m_vertexBufferMemory->getOffset()); 1751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi uploadBufferData(vk, device, *m_vertexBufferMemory, renderQuad.getVertexDataSize(), renderQuad.getVertexPointer()); 1752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.isSecondary()) 1755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 175668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos m_commandBuffer = allocateCommandBuffer(vk, device, commandBufferPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY); 1757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 175857b41652a8af472d28943d13924edc3a32ec3884scygan beginCommandBuffer(vk, *m_commandBuffer, vk::VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, renderPass, subpassIndex, framebuffer, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0); 1759c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pushRenderCommands(vk, *m_commandBuffer); 1760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi endCommandBuffer(vk, *m_commandBuffer); 1761c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool isSecondary (void) const 1765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return m_commandBuffer; 1767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 176968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer getCommandBuffer (void) const 1770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(isSecondary()); 1772c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return *m_commandBuffer; 1773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void pushRenderCommands (const DeviceInterface& vk, 177668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer commandBuffer) 1777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!m_renderInfo.getColorClears().empty()) 1779c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<ColorClear>& colorClears (m_renderInfo.getColorClears()); 1781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1782c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (deUint32 attachmentNdx = 0; attachmentNdx < m_renderInfo.getColorAttachmentCount(); attachmentNdx++) 1783c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1784c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const ColorClear& colorClear = colorClears[attachmentNdx]; 178568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkClearAttachment attachment = 1786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 178768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_ASPECT_COLOR_BIT, 178868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachmentNdx, 178968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos makeClearValue(colorClear.getColor()), 179068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }; 179168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkClearRect rect = 179268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 179368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 179468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { (deInt32)colorClear.getOffset().x(), (deInt32)colorClear.getOffset().y() }, 1795689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { colorClear.getSize().x(), colorClear.getSize().y() } 179668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }, // rect 179768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // baseArrayLayer 179868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // layerCount 1799c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1800c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 180168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdClearAttachments(commandBuffer, 1u, &attachment, 1u, &rect); 1802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (m_renderInfo.getDepthStencilClear()) 1806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DepthStencilClear& depthStencilClear = *m_renderInfo.getDepthStencilClear(); 180868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const deUint32 attachmentNdx = m_renderInfo.getColorAttachmentCount(); 18094c7a3aad422a9a456debcbf83f0af165c2471f5cscygan tcu::TextureFormat format = mapVkFormat(m_renderInfo.getDepthStencilAttachment()->getFormat()); 181068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkClearAttachment attachment = 1811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 18124c7a3aad422a9a456debcbf83f0af165c2471f5cscygan (VkImageAspectFlags)((hasDepthComponent(format.order) ? VK_IMAGE_ASPECT_DEPTH_BIT : 0) 18134c7a3aad422a9a456debcbf83f0af165c2471f5cscygan | (hasStencilComponent(format.order) ? VK_IMAGE_ASPECT_STENCIL_BIT : 0)), 181468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos attachmentNdx, 181568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos makeClearValueDepthStencil(depthStencilClear.getDepth(), depthStencilClear.getStencil()) 1816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 181768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkClearRect rect = 1818c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 181968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { 182068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { (deInt32)depthStencilClear.getOffset().x(), (deInt32)depthStencilClear.getOffset().y() }, 1821689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { depthStencilClear.getSize().x(), depthStencilClear.getSize().y() } 182268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos }, // rect 182368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0u, // baseArrayLayer 182468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1u, // layerCount 1825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1826c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 182768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdClearAttachments(commandBuffer, 1u, &attachment, 1u, &rect); 1828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (m_renderInfo.getRenderQuad()) 1831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1832c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkDeviceSize offset = 0; 1833c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBuffer vertexBuffer = *m_vertexBuffer; 1834c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, *m_pipeline); 1836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdBindVertexBuffers(commandBuffer, 0u, 1u, &vertexBuffer, &offset); 1837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdDraw(commandBuffer, 6u, 1u, 0u, 0u); 1838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 1842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassRenderInfo m_renderInfo; 184368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos Move<VkCommandBuffer> m_commandBuffer; 1844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Move<VkPipeline> m_pipeline; 1845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Move<VkPipelineLayout> m_pipelineLayout; 1846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Move<VkShaderModule> m_vertexShaderModule; 1848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Move<VkShaderModule> m_fragmentShaderModule; 1850c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Move<VkBuffer> m_vertexBuffer; 1852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<Allocation> m_vertexBufferMemory; 1853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 1854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid pushImageInitializationCommands (const DeviceInterface& vk, 185668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer commandBuffer, 1857c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment>& attachmentInfo, 1858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<de::SharedPtr<AttachmentResources> >& attachmentResources, 1859c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 queueIndex, 1860c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& clearValues) 1861c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 1862c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1863c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkImageMemoryBarrier> initializeLayouts; 1864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1865c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 1866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!clearValues[attachmentNdx]) 1868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi continue; 1869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageMemoryBarrier barrier = 1871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType; 1873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 1874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 187568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryWriteFlags(), // srcAccessMask 187668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryReadFlags(), // dstAccessMask 1877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_UNDEFINED, // oldLayout 187968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // newLayout; 1880c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, // srcQueueFamilyIndex; 1882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, // destQueueFamilyIndex; 1883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getImage(), // image; 1885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { // subresourceRange; 1886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()), // aspect; 1887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // baseMipLevel; 1888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1, // mipLevels; 1889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // baseArraySlice; 1890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 // arraySize; 1891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeLayouts.push_back(barrier); 1895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!initializeLayouts.empty()) 18985b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser vk.cmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, 18995b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 1900689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkMemoryBarrier*)DE_NULL, 1901689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkBufferMemoryBarrier*)DE_NULL, 1902689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)initializeLayouts.size(), &initializeLayouts[0]); 1903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 1906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!clearValues[attachmentNdx]) 1908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi continue; 1909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachmentInfo[attachmentNdx].getFormat()); 1911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasStencilComponent(format.order) || hasDepthComponent(format.order)) 1913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clearNan = tcu::Float32::nan().asFloat(); 1915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clearDepth = hasDepthComponent(format.order) ? clearValues[attachmentNdx]->depthStencil.depth : clearNan; 1916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 clearStencil = hasStencilComponent(format.order) ? clearValues[attachmentNdx]->depthStencil.stencil : ~0u; 1917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearDepthStencilValue depthStencil = 1918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearDepth, 1920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearStencil 1921c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1922c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageSubresourceRange range = 1923c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1924d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz (VkImageAspectFlags)((hasDepthComponent(format.order) ? VK_IMAGE_ASPECT_DEPTH_BIT : 0) 1925d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz | (hasStencilComponent(format.order) ? VK_IMAGE_ASPECT_STENCIL_BIT : 0)), 1926c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 1927c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1, 1928c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 1929c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 1930c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 193268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdClearDepthStencilImage(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &depthStencil, 1, &range); 1933c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 1935c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageSubresourceRange range = 1937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 193868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_ASPECT_COLOR_BIT, // aspectMask; 1939c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // baseMipLevel; 1940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1, // mipLevels; 194168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0, // baseArrayLayer; 194268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1 // layerCount; 1943c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1944c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearColorValue clearColor = clearValues[attachmentNdx]->color; 1945c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 194668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdClearColorImage(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearColor, 1, &range); 1947c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1948c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkImageMemoryBarrier> renderPassLayouts; 1952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 1954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageMemoryBarrier barrier = 1956c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 1957c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType; 1958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 1959c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 196068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryWriteFlags(), // srcAccessMask 196168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryReadFlags(), // dstAccessMask 1962c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1963c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues[attachmentNdx] ? 196468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL 1965c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi : VK_IMAGE_LAYOUT_UNDEFINED, // oldLayout 1966c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1967c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentInfo[attachmentNdx].getInitialLayout(), // newLayout; 1968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, // srcQueueFamilyIndex; 1970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, // destQueueFamilyIndex; 1971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getImage(), // image; 1973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { // subresourceRange; 1974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()), // aspect; 1975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // baseMipLevel; 1976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1, // mipLevels; 1977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // baseArraySlice; 1978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 // arraySize; 1979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 1981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderPassLayouts.push_back(barrier); 1983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!renderPassLayouts.empty()) 19865b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser vk.cmdPipelineBarrier(commandBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, 19875b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (VkDependencyFlags)0, 1988689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkMemoryBarrier*)DE_NULL, 1989689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkBufferMemoryBarrier*)DE_NULL, 1990689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)renderPassLayouts.size(), &renderPassLayouts[0]); 1991c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 1992c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 1993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1994c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid pushRenderPassCommands (const DeviceInterface& vk, 199568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer commandBuffer, 1996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkRenderPass renderPass, 1997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkFramebuffer framebuffer, 1998c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<de::SharedPtr<SubpassRenderer> >& subpassRenderers, 1999c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderPos, 2000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderSize, 2001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& renderPassClearValues, 2002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RenderTypes render) 2003c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clearNan = tcu::Float32::nan().asFloat(); 2005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkClearValue> attachmentClearValues; 2006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassClearValues.size(); attachmentNdx++) 2008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderPassClearValues[attachmentNdx]) 2010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentClearValues.push_back(*renderPassClearValues[attachmentNdx]); 2011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentClearValues.push_back(makeClearValueColorF32(clearNan, clearNan, clearNan, clearNan)); 2013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkRect2D renderArea = 2017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2018689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { (deInt32)renderPos.x(), (deInt32)renderPos.y() }, 2019689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { renderSize.x(), renderSize.y() } 2020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2022c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < subpassRenderers.size(); subpassNdx++) 2023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 202468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSubpassContents contents = subpassRenderers[subpassNdx]->isSecondary() ? VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS : VK_SUBPASS_CONTENTS_INLINE; 2025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2026c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpassNdx == 0) 2027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi cmdBeginRenderPass(vk, commandBuffer, renderPass, framebuffer, renderArea, (deUint32)attachmentClearValues.size(), attachmentClearValues.empty() ? DE_NULL : &attachmentClearValues[0], contents); 2028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdNextSubpass(commandBuffer, contents); 2030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (render) 2032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 203368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos if (contents == VK_SUBPASS_CONTENTS_INLINE) 2034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpassRenderers[subpassNdx]->pushRenderCommands(vk, commandBuffer); 2036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 203768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos else if (contents == VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS) 2038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 203968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandBuffer cmd = subpassRenderers[subpassNdx]->getCommandBuffer(); 2040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdExecuteCommands(commandBuffer, 1, &cmd); 2041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Invalid contents"); 2044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2046c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2047c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vk.cmdEndRenderPass(commandBuffer); 2048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2049c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2050c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2051c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid pushReadImagesToBuffers (const DeviceInterface& vk, 205268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VkCommandBuffer commandBuffer, 2053c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 queueIndex, 2054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<de::SharedPtr<AttachmentResources> >& attachmentResources, 2056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment>& attachmentInfo, 2057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<bool>& isLazy, 2058c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& targetSize) 2060c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkImageMemoryBarrier> imageBarriers; 2063c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 2065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isLazy[attachmentNdx]) 2067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi continue; 2068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2069c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageMemoryBarrier barrier = 2070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2071c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType 2072c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext 2073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 207468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryWriteFlags(), // srcAccessMask 207568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryReadFlags(), // dstAccessMask 2076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentInfo[attachmentNdx].getFinalLayout(), // oldLayout 207868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // newLayout 2079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, // srcQueueFamilyIndex 2081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, // destQueueFamilyIndex 2082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2083c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getImage(), // image 2084c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { // subresourceRange 2085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi getImageAspectFlags(attachmentInfo[attachmentNdx].getFormat()), // aspect; 2086c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // baseMipLevel 2087c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1, // mipLevels 2088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // baseArraySlice 2089c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 // arraySize 2090c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2091c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2092c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2093c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi imageBarriers.push_back(barrier); 2094c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2095c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2096c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!imageBarriers.empty()) 2097689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vk.cmdPipelineBarrier(commandBuffer, 2098689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos getAllPipelineStageFlags(), 2099689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos getAllPipelineStageFlags(), 2100689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (VkDependencyFlags)0, 2101689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkMemoryBarrier*)DE_NULL, 2102689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkBufferMemoryBarrier*)DE_NULL, 2103689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)imageBarriers.size(), &imageBarriers[0]); 2104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 2107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isLazy[attachmentNdx]) 2109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi continue; 2110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat::ChannelOrder order = mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order; 2112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBufferImageCopy rect = 2113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // bufferOffset 2115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // bufferRowLength 2116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // bufferImageHeight 2117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { // imageSubresource 2118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi getPrimaryImageAspect(mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order), // aspect 211994128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos 0, // mipLevel 2120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // arraySlice 2121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 // arraySize 2122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, 212394128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos { 0, 0, 0 }, // imageOffset 2124689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { targetSize.x(), targetSize.y(), 1u } // imageExtent 2125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 212768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdCopyImageToBuffer(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, attachmentResources[attachmentNdx]->getBuffer(), 1, &rect); 2128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::TextureFormat::DS == order) 2130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBufferImageCopy stencilRect = 2132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // bufferOffset 2134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // bufferRowLength 2135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, // bufferImageHeight 213668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos { // imageSubresource 213768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_ASPECT_STENCIL_BIT, // aspect 213868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0, // mipLevel 213968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 0, // arraySlice 2140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 1 // arraySize 2141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, 214294128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos { 0, 0, 0 }, // imageOffset 2143689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos { targetSize.x(), targetSize.y(), 1u } // imageExtent 2144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 214668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.cmdCopyImageToBuffer(commandBuffer, attachmentResources[attachmentNdx]->getImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, attachmentResources[attachmentNdx]->getSecondaryBuffer(), 1, &stencilRect); 2147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkBufferMemoryBarrier> bufferBarriers; 2152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentInfo.size(); attachmentNdx++) 2154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isLazy[attachmentNdx]) 2156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi continue; 2157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat::ChannelOrder order = mapVkFormat(attachmentInfo[attachmentNdx].getFormat()).order; 2159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBufferMemoryBarrier bufferBarrier = 2160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, 2162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 2163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 216468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryWriteFlags(), 216568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryReadFlags(), 2166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, 2168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, 2169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getBuffer(), 2171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 2172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getBufferSize() 2173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bufferBarriers.push_back(bufferBarrier); 2176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::TextureFormat::DS == order) 2178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkBufferMemoryBarrier secondaryBufferBarrier = 2180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, 2182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, 2183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 218468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryWriteFlags(), 218568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos getAllMemoryReadFlags(), 2186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, 2188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueIndex, 2189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getSecondaryBuffer(), 2191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0, 2192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getSecondaryBufferSize() 2193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bufferBarriers.push_back(secondaryBufferBarrier); 2196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bufferBarriers.push_back(bufferBarrier); 2199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!bufferBarriers.empty()) 2202689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos vk.cmdPipelineBarrier(commandBuffer, 2203689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos getAllPipelineStageFlags(), 2204689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos getAllPipelineStageFlags(), 2205689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (VkDependencyFlags)0, 2206689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkMemoryBarrier*)DE_NULL, 2207689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos (deUint32)bufferBarriers.size(), &bufferBarriers[0], 2208689c095f881a410da6a315795452a8e00ad95a9dPyry Haulos 0, (const VkImageMemoryBarrier*)DE_NULL); 2209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid clear (const PixelBufferAccess& access, const VkClearValue& value) 2213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat& format = access.getFormat(); 2215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order) || tcu::hasStencilComponent(format.order)) 2217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order)) 2219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::clearDepth(access, value.depthStencil.depth); 2220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order)) 2222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::clearStencil(access, value.depthStencil.stencil); 2223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_FLOATING_POINT 2227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT 2228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT) 2229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::Vec4 color (value.color.float32[0], 2231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.float32[1], 2232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.float32[2], 2233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.float32[3]); 2234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::isSRGB(format)) 2236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::clear(access, tcu::linearToSRGB(color)); 2237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::clear(access, color); 2239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER) 2241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::UVec4 color (value.color.uint32[0], 2243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.uint32[1], 2244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.uint32[2], 2245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.uint32[3]); 2246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::clear(access, color); 2248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER) 2250c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::IVec4 color (value.color.int32[0], 2252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.int32[1], 2253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.int32[2], 2254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color.int32[3]); 2255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::clear(access, color); 2257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown channel class"); 2260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2263c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviVec4 computeUvs (const IVec2& posA, const IVec2& posB, const IVec2& pos) 2264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float u = de::clamp((float)(pos.x() - posA.x()) / (float)(posB.x() - posA.x()), 0.0f, 1.0f); 2266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float v = de::clamp((float)(pos.y() - posA.y()) / (float)(posB.y() - posA.y()), 0.0f, 1.0f); 2267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return Vec4(u, v, u * v, (u + v) / 2.0f); 2269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid renderReferenceImages (vector<tcu::TextureLevel>& referenceAttachments, 2272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPassInfo, 2273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& targetSize, 2274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& imageClearValues, 2275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& renderPassClearValues, 2276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassRenderInfo>& subpassRenderInfo, 2277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderPos, 2278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderSize) 2279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses = renderPassInfo.getSubpasses(); 2281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<bool> attachmentUsed (renderPassInfo.getAttachments().size(), false); 2282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi referenceAttachments.resize(renderPassInfo.getAttachments().size()); 2284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 2286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachment = renderPassInfo.getAttachments()[attachmentNdx]; 2288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 2289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(format); 2290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel& reference = referenceAttachments[attachmentNdx]; 2291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool isDepthOrStencilAttachment = hasDepthComponent(format.order) || hasStencilComponent(format.order); 2292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi reference = tcu::TextureLevel(format, targetSize.x(), targetSize.y()); 2294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (imageClearValues[attachmentNdx]) 2296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clear(reference.getAccess(), *imageClearValues[attachmentNdx]); 2297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Fill with grid if image contentst are undefined before renderpass 2300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isDepthOrStencilAttachment) 2301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order)) 2303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::fillWithGrid(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_DEPTH), 2, textureInfo.valueMin, textureInfo.valueMax); 2304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(format.order)) 2306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::fillWithGrid(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_STENCIL), 2, textureInfo.valueMin, textureInfo.valueMax); 2307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::fillWithGrid(reference.getAccess(), 2, textureInfo.valueMin, textureInfo.valueMax); 2310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++) 2314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = subpasses[subpassNdx]; 2316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassRenderInfo& renderInfo = subpassRenderInfo[subpassNdx]; 2317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& colorAttachments = subpass.getColorAttachments(); 2318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Apply load op if attachment was used for the first time 2320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < colorAttachments.size(); attachmentNdx++) 2321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 attachmentIndex = colorAttachments[attachmentNdx].getAttachment(); 2323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!attachmentUsed[attachmentIndex]) 2325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = renderPassInfo.getAttachments()[attachmentIndex]; 2327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel& reference = referenceAttachments[attachmentIndex]; 2328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(!tcu::hasDepthComponent(reference.getFormat().order)); 2330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(!tcu::hasStencilComponent(reference.getFormat().order)); 2331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 2333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clear(tcu::getSubregion(reference.getAccess(), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), *renderPassClearValues[attachmentIndex]); 2334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 2335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(reference.getFormat()); 2337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::fillWithGrid(tcu::getSubregion(reference.getAccess(), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), 2, textureInfo.valueMin, textureInfo.valueMax); 2339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentUsed[attachmentIndex] = true; 2342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 234594128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos // Apply load op to depth/stencil attachment if it was used for the first time 2346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED && !attachmentUsed[subpass.getDepthStencilAttachment().getAttachment()]) 2347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 attachmentIndex = subpass.getDepthStencilAttachment().getAttachment(); 2349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Apply load op if attachment was used for the first time 2351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!attachmentUsed[attachmentIndex]) 2352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = renderPassInfo.getAttachments()[attachmentIndex]; 2354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel& reference = referenceAttachments[attachmentIndex]; 2355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(reference.getFormat().order)) 2357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 2359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clear(tcu::getSubregion(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_DEPTH), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), *renderPassClearValues[attachmentIndex]); 2360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (attachment.getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 2361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(reference.getFormat()); 2363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::fillWithGrid(tcu::getSubregion(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_DEPTH), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), 2, textureInfo.valueMin, textureInfo.valueMax); 2365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(reference.getFormat().order)) 2369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachment.getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 2371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clear(tcu::getSubregion(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_STENCIL), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), *renderPassClearValues[attachmentIndex]); 2372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (attachment.getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 2373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(reference.getFormat()); 2375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::fillWithGrid(tcu::getSubregion(tcu::getEffectiveDepthStencilAccess(reference.getAccess(), tcu::Sampler::MODE_STENCIL), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), 2, textureInfo.valueMin, textureInfo.valueMax); 2377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentUsed[attachmentIndex] = true; 2382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t colorClearNdx = 0; colorClearNdx < renderInfo.getColorClears().size(); colorClearNdx++) 2385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const ColorClear& colorClear = renderInfo.getColorClears()[colorClearNdx]; 2387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 offset = colorClear.getOffset(); 2388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 size = colorClear.getSize(); 2389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel& reference = referenceAttachments[subpass.getColorAttachments()[colorClearNdx].getAttachment()]; 2390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkClearValue value; 2391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi value.color = colorClear.getColor(); 2393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clear(tcu::getSubregion(reference.getAccess(), offset.x(), offset.y(), 0, size.x(), size.y(), 1), value); 2395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.getDepthStencilClear()) 2398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DepthStencilClear& dsClear = *renderInfo.getDepthStencilClear(); 2400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 offset = dsClear.getOffset(); 2401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 size = dsClear.getSize(); 2402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel& reference = referenceAttachments[subpass.getDepthStencilAttachment().getAttachment()]; 2403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(reference.getFormat().order)) 2405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearDepth(tcu::getSubregion(reference.getAccess(), offset.x(), offset.y(), 0, size.x(), size.y(), 1), dsClear.getDepth()); 2406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(reference.getFormat().order)) 2408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearStencil(tcu::getSubregion(reference.getAccess(), offset.x(), offset.y(), 0, size.x(), size.y(), 1), dsClear.getStencil()); 2409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.getRenderQuad()) 2412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderQuad& renderQuad = *renderInfo.getRenderQuad(); 2414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 posA = renderQuad.getCornerA(); 2415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 posB = renderQuad.getCornerB(); 2416c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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); 2417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec2 p = Vec2((float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y()) / Vec2(2.0f); 2418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2 posAI ((deInt32)(origin.x() + (p.x() * posA.x())), 2419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (deInt32)(origin.y() + (p.y() * posA.y()))); 2420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2 posBI ((deInt32)(origin.x() + (p.x() * posB.x())), 2421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (deInt32)(origin.y() + (p.y() * posB.y()))); 2422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentRefNdx = 0; attachmentRefNdx < subpass.getColorAttachments().size(); attachmentRefNdx++) 2424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachment = renderPassInfo.getAttachments()[subpass.getColorAttachments()[attachmentRefNdx].getAttachment()]; 2426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(mapVkFormat(attachment.getFormat())); 2427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel& referenceTexture = referenceAttachments[subpass.getColorAttachments()[attachmentRefNdx].getAttachment()]; 2428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool srgb = tcu::isSRGB(referenceTexture.getFormat()); 2429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const PixelBufferAccess reference = referenceTexture.getAccess(); 2430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clampMin = (float)(-MAX_INTEGER_VALUE); 2431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clampMax = (float)(MAX_INTEGER_VALUE); 2432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 valueMax (de::clamp(textureInfo.valueMax[0], clampMin, clampMax), 2433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMax[1], clampMin, clampMax), 2434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMax[2], clampMin, clampMax), 2435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMax[3], clampMin, clampMax)); 2436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 valueMin (de::clamp(textureInfo.valueMin[0], clampMin, clampMax), 2438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMin[1], clampMin, clampMax), 2439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMin[2], clampMin, clampMax), 2440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMin[3], clampMin, clampMax)); 2441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(posAI.x() < posBI.x()); 2443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(posAI.y() < posBI.y()); 2444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = posAI.y(); y <= (int)posBI.y(); y++) 2446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = posAI.x(); x <= (int)posBI.x(); x++) 2447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 uvs = computeUvs(posAI, posBI, IVec2(x, y)); 2449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 color = valueMax * uvs + valueMin * (Vec4(1.0f) - uvs); 2450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (srgb) 2452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi reference.setPixel(tcu::linearToSRGB(color), x, y); 2453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi reference.setPixel(color, x, y); 2455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 2459c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel& referenceTexture = referenceAttachments[subpass.getDepthStencilAttachment().getAttachment()]; 2461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const PixelBufferAccess reference = referenceTexture.getAccess(); 2462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(posAI.x() < posBI.x()); 2464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(posAI.y() < posBI.y()); 2465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = posAI.y(); y <= (int)posBI.y(); y++) 2467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = posAI.x(); x <= (int)posBI.x(); x++) 2468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 uvs = computeUvs(posAI, posBI, IVec2(x, y)); 2470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(reference.getFormat().order)) 2472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi reference.setPixDepth(uvs.x(), x, y); 2473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasStencilComponent(reference.getFormat().order)) 2475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi reference.setPixStencil(STENCIL_VALUE, x, y); 2476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Mark all attachments that were used but not stored as undefined 2482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 2483c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachment = renderPassInfo.getAttachments()[attachmentNdx]; 2485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 2486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(format); 2487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel& reference = referenceAttachments[attachmentNdx]; 2488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachmentUsed[attachmentNdx] && renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE) 2490c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::fillWithGrid(tcu::getSubregion(reference.getAccess(), renderPos.x(), renderPos.y(), renderSize.x(), renderSize.y()), 2, textureInfo.valueMin, textureInfo.valueMax); 2491c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2494c9c6281cc6b0599cf56012410f18a099a8a2969cMika IsojärviMaybe<deUint32> findColorAttachment (const Subpass& subpass, 2495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 attachmentIndex) 2496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t colorAttachmentNdx = 0; colorAttachmentNdx < subpass.getColorAttachments().size(); colorAttachmentNdx++) 2498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpass.getColorAttachments()[colorAttachmentNdx].getAttachment() == attachmentIndex) 2500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return tcu::just((deUint32)colorAttachmentNdx); 2501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return tcu::nothing<deUint32>(); 2504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviint calcFloatDiff (float a, float b) 2507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 au = tcu::Float32(a).bits(); 2509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 bu = tcu::Float32(b).bits(); 2510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool asign = (au & (0x1u << 31u)) != 0u; 2512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool bsign = (bu & (0x1u << 31u)) != 0u; 2513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 avalue = (au & ((0x1u << 31u) - 1u)); 2515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 bvalue = (bu & ((0x1u << 31u) - 1u)); 2516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (asign != bsign) 2518c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return avalue + bvalue + 1u; 2519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (avalue < bvalue) 2520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return bvalue - avalue; 2521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return avalue - bvalue; 2523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool comparePixelToDepthClearValue (const ConstPixelBufferAccess& access, 2526c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi int x, 2527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi int y, 2528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi float ref) 2529c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = tcu::getEffectiveDepthStencilTextureFormat(access.getFormat(), tcu::Sampler::MODE_DEPTH); 2531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 2532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (channelClass) 2534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 2536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 2537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const int bitDepth = tcu::getTextureFormatBitDepth(format).x(); 2539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float depth = access.getPixDepth(x, y); 2540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float threshold = 2.0f / (float)((1 << bitDepth) - 1); 2541c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return deFloatAbs(depth - ref) <= threshold; 2543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2544c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 2546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2547c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float depth = access.getPixDepth(x, y); 2548c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const int mantissaBits = tcu::getTextureFormatMantissaBitDepth(format).x(); 2549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const int threshold = 10 * 1 << (23 - mantissaBits); 2550c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(mantissaBits <= 23); 2552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return calcFloatDiff(depth, ref) <= threshold; 2554c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 2557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Invalid channel class"); 2558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return false; 2559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool comparePixelToStencilClearValue (const ConstPixelBufferAccess& access, 2563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi int x, 2564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi int y, 2565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 ref) 2566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 stencil = access.getPixStencil(x, y); 2568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return stencil == ref; 2570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool comparePixelToColorClearValue (const ConstPixelBufferAccess& access, 2573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi int x, 2574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi int y, 2575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearColorValue& ref) 2576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = access.getFormat(); 2578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 2579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const BVec4 channelMask = tcu::getTextureFormatChannelMask(format); 2580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (channelClass) 2582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 2584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 2585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 bitDepth (tcu::getTextureFormatBitDepth(format)); 2587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 resColor (access.getPixel(x, y)); 2588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 refColor (ref.float32[0], 2589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.float32[1], 2590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.float32[2], 2591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.float32[3]); 2592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 threshold (bitDepth[0] > 0 ? 20.0f / (float)((1 << bitDepth[0]) - 1) : 1.0f, 2593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bitDepth[1] > 0 ? 20.0f / (float)((1 << bitDepth[1]) - 1) : 1.0f, 2594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bitDepth[2] > 0 ? 20.0f / (float)((1 << bitDepth[2]) - 1) : 1.0f, 2595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bitDepth[3] > 0 ? 20.0f / (float)((1 << bitDepth[3]) - 1) : 1.0f); 2596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::isSRGB(access.getFormat())) 2598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return !(tcu::anyNotEqual(tcu::logicalAnd(lessThanEqual(tcu::absDiff(resColor, tcu::linearToSRGB(refColor)), threshold), channelMask), channelMask)); 2599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return !(tcu::anyNotEqual(tcu::logicalAnd(lessThanEqual(tcu::absDiff(resColor, refColor), threshold), channelMask), channelMask)); 2601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 2604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec4 resColor (access.getPixelUint(x, y)); 2606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec4 refColor (ref.uint32[0], 2607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.uint32[1], 2608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.uint32[2], 2609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.uint32[3]); 2610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec4 threshold (1); 2611c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return !(tcu::anyNotEqual(tcu::logicalAnd(lessThanEqual(tcu::absDiff(resColor, refColor), threshold), channelMask), channelMask)); 2613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 2616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 resColor (access.getPixelInt(x, y)); 2618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 refColor (ref.int32[0], 2619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.int32[1], 2620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.int32[2], 2621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.int32[3]); 2622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 threshold (1); 2623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return !(tcu::anyNotEqual(tcu::logicalAnd(lessThanEqual(tcu::absDiff(resColor, refColor), threshold), channelMask), channelMask)); 2625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 2628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 resColor (access.getPixel(x, y)); 2630c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 refColor (ref.float32[0], 2631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.float32[1], 2632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.float32[2], 2633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ref.float32[3]); 2634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 mantissaBits (tcu::getTextureFormatMantissaBitDepth(format)); 2635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 threshold (10 * IVec4(1) << (23 - mantissaBits)); 2636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(tcu::allEqual(greaterThanEqual(threshold, IVec4(0)), BVec4(true))); 2638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int ndx = 0; ndx < 4; ndx++) 2640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (calcFloatDiff(resColor[ndx], refColor[ndx]) > threshold[ndx] && channelMask[ndx]) 2642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return false; 2643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return true; 2646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 2649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Invalid channel class"); 2650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return false; 2651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviclass PixelStatus 2655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvipublic: 2657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi enum Status 2658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi STATUS_UNDEFINED = 0, 2660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi STATUS_OK = 1, 2661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi STATUS_FAIL = 2, 2662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi STATUS_LAST 2664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus (Status color, Status depth, Status stencil) 2667a31a3468328457a54ad3bf068896986b5789c4cfPyry Haulos : m_status ((deUint8)((color << COLOR_OFFSET) 2668277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser | (depth << DEPTH_OFFSET) 2669277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser | (stencil << STENCIL_OFFSET))) 2670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Status getColorStatus (void) const { return (Status)((m_status & COLOR_MASK) >> COLOR_OFFSET); } 2674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Status getDepthStatus (void) const { return (Status)((m_status & DEPTH_MASK) >> DEPTH_OFFSET); } 2675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Status getStencilStatus (void) const { return (Status)((m_status & STENCIL_MASK) >> STENCIL_OFFSET); } 2676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void setColorStatus (Status status) 2678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(getColorStatus() == STATUS_UNDEFINED); 26805b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser m_status |= (deUint8)(status << COLOR_OFFSET); 2681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void setDepthStatus (Status status) 2684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(getDepthStatus() == STATUS_UNDEFINED); 2686682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos m_status |= (deUint8)(status << DEPTH_OFFSET); 2687c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void setStencilStatus (Status status) 2690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(getStencilStatus() == STATUS_UNDEFINED); 2692682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos m_status |= (deUint8)(status << STENCIL_OFFSET); 2693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärviprivate: 2696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi enum 2697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi COLOR_OFFSET = 0, 2699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DEPTH_OFFSET = 2, 2700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi STENCIL_OFFSET = 4, 2701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi COLOR_MASK = (3<<COLOR_OFFSET), 2703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DEPTH_MASK = (3<<DEPTH_OFFSET), 2704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi STENCIL_MASK = (3<<STENCIL_OFFSET), 2705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 2706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint8 m_status; 2707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 2708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkDepthRenderQuad (const ConstPixelBufferAccess& result, 2710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2& posA, 2711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2& posB, 2712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<PixelStatus>& status) 2713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = posA.y(); y <= posB.y(); y++) 2715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = posA.x(); x <= posB.x(); x++) 2716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 2718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getDepthStatus() == PixelStatus::STATUS_UNDEFINED) 2720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 minUvs = computeUvs(posA, posB, IVec2(x-1, y-1)); 2722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 maxUvs = computeUvs(posA, posB, IVec2(x+1, y+1)); 2723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool softCheck = std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1 2724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1; 2725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float resDepth = result.getPixDepth(x, y); 2726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (resDepth >= minUvs.x() && resDepth <= maxUvs.x()) 2728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setDepthStatus(PixelStatus::STATUS_OK); 2729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (!softCheck) 2730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setDepthStatus(PixelStatus::STATUS_FAIL); 2731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkStencilRenderQuad (const ConstPixelBufferAccess& result, 2736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2& posA, 2737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2& posB, 2738c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<PixelStatus>& status) 2739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = posA.y(); y <= posB.y(); y++) 2741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = posA.x(); x <= posB.x(); x++) 2742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 2744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getStencilStatus() == PixelStatus::STATUS_UNDEFINED) 2746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2747c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool softCheck = std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1 2748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1; 2749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2750c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (result.getPixStencil(x, y) == STENCIL_VALUE) 2751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setStencilStatus(PixelStatus::STATUS_OK); 2752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (!softCheck) 2753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setStencilStatus(PixelStatus::STATUS_FAIL); 2754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2758c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkColorRenderQuad (const ConstPixelBufferAccess& result, 2759c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2& posA, 2760c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2& posB, 2761c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<PixelStatus>& status) 2762c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2763c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat& format = result.getFormat(); 2764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool srgb = tcu::isSRGB(format); 2765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 2766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo textureInfo = tcu::getTextureFormatInfo(format); 2767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clampMin = (float)(-MAX_INTEGER_VALUE); 2768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clampMax = (float)(MAX_INTEGER_VALUE); 2769c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 valueMax (de::clamp(textureInfo.valueMax[0], clampMin, clampMax), 2770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMax[1], clampMin, clampMax), 2771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMax[2], clampMin, clampMax), 2772c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMax[3], clampMin, clampMax)); 2773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 valueMin (de::clamp(textureInfo.valueMin[0], clampMin, clampMax), 2775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMin[1], clampMin, clampMax), 2776c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMin[2], clampMin, clampMax), 2777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(textureInfo.valueMin[3], clampMin, clampMax)); 2778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const BVec4 channelMask = tcu::getTextureFormatChannelMask(format); 2779c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2780d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz IVec4 formatBitDepths = tcu::getTextureFormatBitDepth(format); 2781d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz Vec4 threshold = Vec4(1.0f) / Vec4((float)(1 << formatBitDepths.x()), 2782d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz (float)(1 << formatBitDepths.y()), 2783d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz (float)(1 << formatBitDepths.z()), 2784d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz (float)(1 << formatBitDepths.w())); 2785d4009d8d01eb43b066f90059b9955ee20f0c677dJeff Bolz 2786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (channelClass) 2787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2788c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 2789c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 2790c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 2791c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2792c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = posA.y(); y <= posB.y(); y++) 2793c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = posA.x(); x <= posB.x(); x++) 2794c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2795c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 2796c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2797c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED) 2798c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 279986abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi const Vec4 minDiff = Vec4(1.0f) / (IVec4(1) << tcu::getTextureFormatMantissaBitDepth(format)).cast<float>(); 2800c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 minUvs = computeUvs(posA, posB, IVec2(x-1, y-1)); 2801c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 maxUvs = computeUvs(posA, posB, IVec2(x+1, y+1)); 2802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool softCheck = std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1 2803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1; 2804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 resColor (result.getPixel(x, y)); 2806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 280786abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi Vec4 minRefColor = srgb ? tcu::linearToSRGB(valueMax * minUvs + valueMin * (Vec4(1.0f) - minUvs)) 280886abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi : valueMax * minUvs + valueMin * (Vec4(1.0f) - minUvs) - threshold; 280986abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi Vec4 maxRefColor = srgb ? tcu::linearToSRGB(valueMax * maxUvs + valueMin * (Vec4(1.0f) - maxUvs)) 281086abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi : valueMax * maxUvs + valueMin * (Vec4(1.0f) - maxUvs) + threshold; 281186abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi 281286abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi // Take into account rounding and quantization 281386abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi if (channelClass == tcu::TEXTURECHANNELCLASS_FLOATING_POINT) 281486abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi { 281586abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi minRefColor = tcu::min(minRefColor * (Vec4(1.0f) - minDiff), minRefColor * (Vec4(1.0f) + minDiff)); 281686abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi maxRefColor = tcu::max(maxRefColor * (Vec4(1.0f) - minDiff), maxRefColor * (Vec4(1.0f) + minDiff)); 281786abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi } 281886abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi else 281986abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi { 282086abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi minRefColor = minRefColor - minDiff; 282186abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi maxRefColor = maxRefColor + minDiff; 282286abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi } 2823c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2824c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[0] <= maxRefColor[0]); 2825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[1] <= maxRefColor[1]); 2826c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[2] <= maxRefColor[2]); 2827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[3] <= maxRefColor[3]); 2828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::anyNotEqual(tcu::logicalAnd( 2830c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::logicalAnd(greaterThanEqual(resColor, minRefColor), 2831c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lessThanEqual(resColor, maxRefColor)), 2832c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi channelMask), channelMask)) 2833c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2834c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!softCheck) 2835c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_FAIL); 2836c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2837c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2838c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_OK); 2839c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2840c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2841c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 2843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 2846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = posA.y(); y <= posB.y(); y++) 2848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = posA.x(); x <= posB.x(); x++) 2849c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2850c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 2851c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2852c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED) 2853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 minUvs = computeUvs(posA, posB, IVec2(x-1, y-1)); 2855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 maxUvs = computeUvs(posA, posB, IVec2(x+1, y+1)); 2856c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool softCheck = std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1 2857c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1; 2858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2859c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec4 resColor (result.getPixelUint(x, y)); 2860c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2861c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 minRefColorF = valueMax * minUvs + valueMin * (Vec4(1.0f) - minUvs); 2862c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 maxRefColorF = valueMax * maxUvs + valueMin * (Vec4(1.0f) - maxUvs); 2863c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec4 minRefColor (minRefColorF.asUint()); 2865c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec4 maxRefColor (maxRefColorF.asUint()); 2866c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[0] <= maxRefColor[0]); 2868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[1] <= maxRefColor[1]); 2869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[2] <= maxRefColor[2]); 2870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[3] <= maxRefColor[3]); 2871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::anyNotEqual(tcu::logicalAnd( 2873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::logicalAnd(greaterThanEqual(resColor, minRefColor), 2874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lessThanEqual(resColor, maxRefColor)), 2875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi channelMask), channelMask)) 2876c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!softCheck) 2878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_FAIL); 2879c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2880c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_OK); 2882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2884c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 2886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 2889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = posA.y(); y <= posB.y(); y++) 2891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = posA.x(); x <= posB.x(); x++) 2892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 2894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED) 2896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 minUvs = computeUvs(posA, posB, IVec2(x-1, y-1)); 2898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 maxUvs = computeUvs(posA, posB, IVec2(x+1, y+1)); 2899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool softCheck = std::abs(x - posA.x()) <= 1 || std::abs(x - posB.x()) <= 1 2900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || std::abs(y - posA.y()) <= 1 || std::abs(y - posB.y()) <= 1; 2901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 resColor (result.getPixelInt(x, y)); 2903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2904c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 minRefColorF = valueMax * minUvs + valueMin * (Vec4(1.0f) - minUvs); 2905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 maxRefColorF = valueMax * maxUvs + valueMin * (Vec4(1.0f) - maxUvs); 2906c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 minRefColor (minRefColorF.asInt()); 2908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec4 maxRefColor (maxRefColorF.asInt()); 2909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[0] <= maxRefColor[0]); 2911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[1] <= maxRefColor[1]); 2912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[2] <= maxRefColor[2]); 2913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(minRefColor[3] <= maxRefColor[3]); 2914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::anyNotEqual(tcu::logicalAnd( 2916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::logicalAnd(greaterThanEqual(resColor, minRefColor), 2917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lessThanEqual(resColor, maxRefColor)), 2918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi channelMask), channelMask)) 2919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2920c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!softCheck) 2921c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_FAIL); 2922c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2923c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2924c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_OK); 2925c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2926c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2927c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2928c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi break; 2929c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2930c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 2932c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Invalid channel class"); 2933c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2935c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkColorClear (const ConstPixelBufferAccess& result, 2937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& offset, 2938c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 2939c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<PixelStatus>& status, 2940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearColorValue& color) 2941c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2942c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(offset.x() + size.x() <= (deUint32)result.getWidth()); 2943c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(offset.y() + size.y() <= (deUint32)result.getHeight()); 2944c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2945c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(result.getWidth() * result.getHeight() == (int)status.size()); 2946c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2947c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = offset.y(); y < (int)(offset.y() + size.y()); y++) 2948c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = offset.x(); x < (int)(offset.x() + size.x()); x++) 2949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 2951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(x + y * result.getWidth() < (int)status.size()); 2953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED) 2955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2956c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (comparePixelToColorClearValue(result, x, y, color)) 2957c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_OK); 2958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2959c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_FAIL); 2960c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2961c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2962c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2963c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2964c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkDepthClear (const ConstPixelBufferAccess& result, 2965c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& offset, 2966c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 2967c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<PixelStatus>& status, 2968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi float depth) 2969c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = offset.y(); y < (int)(offset.y() + size.y()); y++) 2971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = offset.x(); x < (int)(offset.x() + size.x()); x++) 2972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 2974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getDepthStatus() == PixelStatus::STATUS_UNDEFINED) 2976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (comparePixelToDepthClearValue(result, x, y, depth)) 2978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setDepthStatus(PixelStatus::STATUS_OK); 2979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 2980c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setDepthStatus(PixelStatus::STATUS_FAIL); 2981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 2983c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 2984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkStencilClear (const ConstPixelBufferAccess& result, 2986c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& offset, 2987c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& size, 2988c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<PixelStatus>& status, 2989c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 stencil) 2990c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 2991c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int y = offset.y(); y < (int)(offset.y() + size.y()); y++) 2992c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int x = offset.x(); x < (int)(offset.x() + size.x()); x++) 2993c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2994c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 2995c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 2996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getStencilStatus() == PixelStatus::STATUS_UNDEFINED) 2997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 2998c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (comparePixelToStencilClearValue(result, x, y, stencil)) 2999c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setStencilStatus(PixelStatus::STATUS_OK); 3000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setStencilStatus(PixelStatus::STATUS_FAIL); 3002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3003c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool verifyAttachment (const ConstPixelBufferAccess& result, 3007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<ConstPixelBufferAccess>& secondaryResult, 3008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPassInfo, 3009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<VkClearValue>& renderPassClearValue, 3010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<VkClearValue>& imageClearValue, 3011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses, 3012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassRenderInfo>& subpassRenderInfo, 3013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const PixelBufferAccess& errorImage, 3014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deUint32 attachmentIndex, 3015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderPos, 3016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& renderSize) 3017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat& format = result.getFormat(); 3019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool hasDepth = tcu::hasDepthComponent(format.order); 3020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool hasStencil = tcu::hasStencilComponent(format.order); 3021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool isColorFormat = !hasDepth && !hasStencil; 3022c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const PixelStatus initialStatus (isColorFormat ? PixelStatus::STATUS_UNDEFINED : PixelStatus::STATUS_OK, 3023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi hasDepth ? PixelStatus::STATUS_UNDEFINED : PixelStatus::STATUS_OK, 3024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi hasStencil ? PixelStatus::STATUS_UNDEFINED : PixelStatus::STATUS_OK); 3025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3026c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool attachmentIsUsed = false; 3027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<PixelStatus> status (result.getWidth() * result.getHeight(), initialStatus); 3028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::clear(errorImage, Vec4(0.0f, 1.0f, 0.0f, 1.0f)); 3029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Check if attachment is used 3031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int subpassNdx = 0; subpassNdx < (int)subpasses.size(); subpassNdx++) 3032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3033c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = subpasses[subpassNdx]; 3034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<deUint32> attachmentNdx = findColorAttachment(subpass, attachmentIndex); 3035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachmentNdx || subpass.getDepthStencilAttachment().getAttachment() == attachmentIndex) 3037c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentIsUsed = true; 3038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3039c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Set all pixels that have undefined values to OK 3041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachmentIsUsed && (((isColorFormat || hasDepth) && renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE) 3042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE))) 3043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for(int y = renderPos.y(); y < (int)(renderPos.y() + renderSize.y()); y++) 3045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for(int x = renderPos.x(); x < (int)(renderPos.x() + renderSize.x()); x++) 3046c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3047c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 3048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3049c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isColorFormat && renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE) 3050c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_OK); 3051c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3052c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3053c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth && renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE) 3054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setDepthStatus(PixelStatus::STATUS_OK); 3055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_DONT_CARE) 3057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setStencilStatus(PixelStatus::STATUS_OK); 3058c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3060c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Check renderpass rendering results 3063c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderPassInfo.getAttachments()[attachmentIndex].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE 3064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE)) 3065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Check subpass rendering results 3067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (int subpassNdx = (int)subpasses.size() - 1; subpassNdx >= 0; subpassNdx--) 3068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3069c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = subpasses[subpassNdx]; 3070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassRenderInfo& renderInfo = subpassRenderInfo[subpassNdx]; 3071c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Maybe<deUint32> attachmentNdx = findColorAttachment(subpass, attachmentIndex); 3072c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3073c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Check rendered quad 3074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderInfo.getRenderQuad() && (attachmentNdx || subpass.getDepthStencilAttachment().getAttachment() == attachmentIndex)) 3075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderQuad& renderQuad = *renderInfo.getRenderQuad(); 3077c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 posA = renderQuad.getCornerA(); 3078c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 posB = renderQuad.getCornerB(); 3079c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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); 3080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec2 p = Vec2((float)renderInfo.getViewportSize().x(), (float)renderInfo.getViewportSize().y()) / Vec2(2.0f); 3081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2 posAI ((deInt32)(origin.x() + (p.x() * posA.x())), 3082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (deInt32)(origin.y() + (p.y() * posA.y()))); 3083c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const IVec2 posBI ((deInt32)(origin.x() + (p.x() * posB.x())), 3084c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi (deInt32)(origin.y() + (p.y() * posB.y()))); 3085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3086c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isColorFormat) 3087c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkColorRenderQuad(result, posAI, posBI, status); 3088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3089c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3090c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth) 3091c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkDepthRenderQuad(result, posAI, posBI, status); 3092c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3093c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth && hasStencil) 3094c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkStencilRenderQuad(*secondaryResult, posAI, posBI, status); 3095c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (hasStencil) 3096c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkStencilRenderQuad(result, posAI, posBI, status); 3097c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3098c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3099c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3100c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Check color attachment clears 3101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachmentNdx && !renderInfo.getColorClears().empty()) 3102c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3103c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const ColorClear& clear = renderInfo.getColorClears()[*attachmentNdx]; 3104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkColorClear(result, clear.getOffset(), clear.getSize(), status, clear.getColor()); 3106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Check depth/stencil attachment clears 3109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() == attachmentIndex && renderInfo.getDepthStencilClear()) 3110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DepthStencilClear clear = *renderInfo.getDepthStencilClear(); 3112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth) 3114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkDepthClear(result, clear.getOffset(), clear.getSize(), status, clear.getDepth()); 3115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth && hasStencil) 3117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkStencilClear(*secondaryResult, clear.getOffset(), clear.getSize(), status, clear.getStencil()); 3118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (hasStencil) 3119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkStencilClear(result, clear.getOffset(), clear.getSize(), status, clear.getStencil()); 3120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Check renderpas clear results 3124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachmentIsUsed && renderPassClearValue) 3125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isColorFormat) 3127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 3129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkColorClear(result, renderPos, renderSize, status, renderPassClearValue->color); 3130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth && renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 3134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkDepthClear(result, renderPos, renderSize, status, renderPassClearValue->depthStencil.depth); 3135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth && hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 3137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkStencilClear(*secondaryResult, renderPos, renderSize, status, renderPassClearValue->depthStencil.stencil); 3138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 3139c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkStencilClear(result, renderPos, renderSize, status, renderPassClearValue->depthStencil.stencil); 3140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3144c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Set all pixels that have undefined values fater renderpass to OK 3145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachmentIsUsed && (((isColorFormat || hasDepth) && renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 3146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || (hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE))) 3147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3148c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for(int y = renderPos.y(); y < (int)(renderPos.y() + renderSize.y()); y++) 3149c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for(int x = renderPos.x(); x < (int)(renderPos.x() + renderSize.x()); x++) 3150c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3151c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 3152c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED 3154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && isColorFormat && renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 3155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setColorStatus(PixelStatus::STATUS_OK); 3156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getDepthStatus() == PixelStatus::STATUS_UNDEFINED 3159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && hasDepth && renderPassInfo.getAttachments()[attachmentIndex].getLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 3160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setDepthStatus(PixelStatus::STATUS_OK); 3161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getStencilStatus() == PixelStatus::STATUS_UNDEFINED 3163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && hasStencil && renderPassInfo.getAttachments()[attachmentIndex].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_DONT_CARE) 3164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pixelStatus.setStencilStatus(PixelStatus::STATUS_OK); 3165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (imageClearValue) 3170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isColorFormat) 3172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkColorClear(result, UVec2(0, 0), UVec2(result.getWidth(), result.getHeight()), status, imageClearValue->color); 3173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth) 3176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkDepthClear(result, UVec2(0, 0), UVec2(result.getWidth(), result.getHeight()), status, imageClearValue->depthStencil.depth); 3177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth && hasStencil) 3179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkStencilClear(*secondaryResult, UVec2(0, 0), UVec2(secondaryResult->getWidth(), result.getHeight()), status, imageClearValue->depthStencil.stencil); 3180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (hasStencil) 3181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkStencilClear(result, UVec2(0, 0), UVec2(result.getWidth(), result.getHeight()), status, imageClearValue->depthStencil.stencil); 3182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool isOk = true; 3187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for(int y = 0; y < result.getHeight(); y++) 3189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for(int x = 0; x < result.getWidth(); x++) 3190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const PixelStatus& pixelStatus = status[x + y * result.getWidth()]; 3192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (isColorFormat) 3194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getColorStatus() != PixelStatus::STATUS_OK) 3196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (pixelStatus.getColorStatus() == PixelStatus::STATUS_UNDEFINED) 3198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi errorImage.setPixel(Vec4(1.0f, 1.0f, 0.0f, 1.0f), x, y); 3199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (pixelStatus.getColorStatus() == PixelStatus::STATUS_FAIL) 3200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi errorImage.setPixel(Vec4(1.0f, 0.0f, 0.0f, 1.0f), x, y); 3201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi isOk = false; 3203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasDepth && pixelStatus.getDepthStatus() != PixelStatus::STATUS_OK) 3208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi errorImage.setPixel(Vec4(1.0f, 0.0f, 0.0f, 1.0f), x, y); 3210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi isOk = false; 3211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (hasStencil && pixelStatus.getStencilStatus() != PixelStatus::STATUS_OK) 3214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi errorImage.setPixel(Vec4(1.0f, 0.0f, 0.0f, 1.0f), x, y); 3216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi isOk = false; 3217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return isOk; 3222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvibool logAndVerifyImages (TestLog& log, 3226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DeviceInterface& vk, 3227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkDevice device, 3228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<de::SharedPtr<AttachmentResources> >& attachmentResources, 3229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<bool>& attachmentIsLazy, 3230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPassInfo, 3231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& renderPassClearValues, 3232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& imageClearValues, 3233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassRenderInfo>& subpassRenderInfo, 3234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2& targetSize, 3235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig& config) 3236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<tcu::TextureLevel> referenceAttachments; 3238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool isOk = true; 3239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Reference images fill undefined pixels with grid pattern." << TestLog::EndMessage; 3241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderReferenceImages(referenceAttachments, renderPassInfo, targetSize, imageClearValues, renderPassClearValues, subpassRenderInfo, config.renderPos, config.renderSize); 3243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3244c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 3245c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!attachmentIsLazy[attachmentNdx]) 3247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachment = renderPassInfo.getAttachments()[attachmentNdx]; 3249c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 3250c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (tcu::hasDepthComponent(format.order) && tcu::hasStencilComponent(format.order)) 3252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3253bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz const tcu::TextureFormat depthFormat = getDepthCopyFormat(attachment.getFormat()); 3254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkDeviceSize depthBufferSize = targetSize.x() * targetSize.y() * depthFormat.getPixelSize(); 3255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void* const depthPtr = attachmentResources[attachmentNdx]->getResultMemory().getHostPtr(); 3256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3257bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz const tcu::TextureFormat stencilFormat = getStencilCopyFormat(attachment.getFormat()); 3258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkDeviceSize stencilBufferSize = targetSize.x() * targetSize.y() * stencilFormat.getPixelSize(); 3259a3e06bac8ee2c4ccac086f1bfc3c2e833d9f154fJeff Bolz void* const stencilPtr = attachmentResources[attachmentNdx]->getSecondaryResultMemory().getHostPtr(); 3260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkMappedMemoryRange ranges[] = 3262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // sType; 3265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 3266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getResultMemory().getMemory(), // mem; 3267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getResultMemory().getOffset(), // offset; 3268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi depthBufferSize // size; 3269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }, 3270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // sType; 3272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 3273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getSecondaryResultMemory().getMemory(), // mem; 3274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getSecondaryResultMemory().getOffset(), // offset; 3275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi stencilBufferSize // size; 3276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.invalidateMappedMemoryRanges(device, 2u, ranges)); 3279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3281bffa5385346c8425a4bfb6ed270a421e527fce8dJeff Bolz const ConstPixelBufferAccess depthAccess (depthFormat, targetSize.x(), targetSize.y(), 1, depthPtr); 3282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const ConstPixelBufferAccess stencilAccess (stencilFormat, targetSize.x(), targetSize.y(), 1, stencilPtr); 3283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel errorImage (tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y()); 3284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("Attachment" + de::toString(attachmentNdx) + "Depth", "Attachment " + de::toString(attachmentNdx) + " Depth", depthAccess); 3286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("Attachment" + de::toString(attachmentNdx) + "Stencil", "Attachment " + de::toString(attachmentNdx) + " Stencil", stencilAccess); 3287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess()); 3289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if ((renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE || renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE) 3291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && !verifyAttachment(depthAccess, tcu::just(stencilAccess), renderPassInfo, renderPassClearValues[attachmentNdx], imageClearValues[attachmentNdx], renderPassInfo.getSubpasses(), subpassRenderInfo, errorImage.getAccess(), (deUint32)attachmentNdx, config.renderPos, config.renderSize)) 3292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("AttachmentError" + de::toString(attachmentNdx), "Attachment Error " + de::toString(attachmentNdx), errorImage.getAccess()); 3294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi isOk = false; 3295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkDeviceSize bufferSize = targetSize.x() * targetSize.y() * format.getPixelSize(); 3301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi void* const ptr = attachmentResources[attachmentNdx]->getResultMemory().getHostPtr(); 3302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkMappedMemoryRange range = 3304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, // sType; 3306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_NULL, // pNext; 3307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getResultMemory().getMemory(), // mem; 3308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentResources[attachmentNdx]->getResultMemory().getOffset(), // offset; 3309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bufferSize // size; 3310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_CHECK(vk.invalidateMappedMemoryRanges(device, 1u, &range)); 3312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const ConstPixelBufferAccess access (format, targetSize.x(), targetSize.y(), 1, ptr); 3315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi tcu::TextureLevel errorImage (tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), targetSize.x(), targetSize.y()); 3316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx), access); 3318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("AttachmentReference" + de::toString(attachmentNdx), "Attachment reference " + de::toString(attachmentNdx), referenceAttachments[attachmentNdx].getAccess()); 3319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if ((renderPassInfo.getAttachments()[attachmentNdx].getStoreOp() == VK_ATTACHMENT_STORE_OP_STORE || renderPassInfo.getAttachments()[attachmentNdx].getStencilStoreOp() == VK_ATTACHMENT_STORE_OP_STORE) 3321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && !verifyAttachment(access, tcu::nothing<ConstPixelBufferAccess>(), renderPassInfo, renderPassClearValues[attachmentNdx], imageClearValues[attachmentNdx], renderPassInfo.getSubpasses(), subpassRenderInfo, errorImage.getAccess(), (deUint32)attachmentNdx, config.renderPos, config.renderSize)) 3322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Image("AttachmentError" + de::toString(attachmentNdx), "Attachment Error " + de::toString(attachmentNdx), errorImage.getAccess()); 3324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi isOk = false; 3325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return isOk; 3332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string getAttachmentType (VkFormat vkFormat) 3335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(vkFormat); 3337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(format.type); 3338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi switch (channelClass) 3340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER: 3342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return "ivec4"; 3343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER: 3345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return "uvec4"; 3346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_SIGNED_FIXED_POINT: 3348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_UNSIGNED_FIXED_POINT: 3349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi case tcu::TEXTURECHANNELCLASS_FLOATING_POINT: 3350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return "vec4"; 3351c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi default: 3353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown channel class"); 3354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return ""; 3355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid createTestShaders (SourceCollections& dst, TestConfig config) 3359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (config.renderTypes & TestConfig::RENDERTYPES_DRAW) 3361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses = config.renderPass.getSubpasses(); 3363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++) 3365c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3366c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = subpasses[subpassNdx]; 3367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi std::ostringstream vertexShader; 3368c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi std::ostringstream fragmentShader; 3369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vertexShader << "#version 310 es\n" 3371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "layout(location = 0) in highp vec4 a_position;\n" 3372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "layout(location = 0) out highp vec2 v_color;\n" 3373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "void main (void) {\n" 3374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "\thighp float a = 0.5 + a_position.x;\n" 3375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "\thighp float b = 0.5 + a_position.y;\n" 3376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "\tv_color = vec2(a, b);\n" 3377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "\tgl_Position = a_position;\n" 3378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "}\n"; 3379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi fragmentShader << "#version 310 es\n" 3381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "layout(location = 0) in highp vec2 v_color;\n"; 3382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++) 3384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const std::string attachmentType = getAttachmentType(config.renderPass.getAttachments()[subpass.getColorAttachments()[attachmentNdx].getAttachment()].getFormat()); 3386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi fragmentShader << "layout(location = " << attachmentNdx << ") out highp " << attachmentType << " o_color" << attachmentNdx << ";\n"; 3387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi fragmentShader << "void main (void) {\n" 3390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << "\thighp vec4 scale = vec4(v_color.x, v_color.y, v_color.x * v_color.y, (v_color.x + v_color.y) / 2.0);\n"; 3391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpass.getColorAttachments().size(); attachmentNdx++) 3393c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(config.renderPass.getAttachments()[subpass.getColorAttachments()[attachmentNdx].getAttachment()].getFormat()); 3395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormatInfo formatInfo = tcu::getTextureFormatInfo(format); 3396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clampMin = (float)(-MAX_INTEGER_VALUE); 3397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const float clampMax = (float)(MAX_INTEGER_VALUE); 3398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 valueMax (de::clamp(formatInfo.valueMax[0], clampMin, clampMax), 3399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(formatInfo.valueMax[1], clampMin, clampMax), 3400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(formatInfo.valueMax[2], clampMin, clampMax), 3401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(formatInfo.valueMax[3], clampMin, clampMax)); 3402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Vec4 valueMin (de::clamp(formatInfo.valueMin[0], clampMin, clampMax), 3404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(formatInfo.valueMin[1], clampMin, clampMax), 3405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(formatInfo.valueMin[2], clampMin, clampMax), 3406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::clamp(formatInfo.valueMin[3], clampMin, clampMax)); 3407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const std::string attachmentType = getAttachmentType(config.renderPass.getAttachments()[subpass.getColorAttachments()[attachmentNdx].getAttachment()].getFormat()); 3408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi fragmentShader << "\to_color" << attachmentNdx << " = " << attachmentType << "(vec4" << valueMin << " + vec4" << (valueMax - valueMin) << " * scale);\n"; 3410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi fragmentShader << "}\n"; 3413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3414c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dst.glslSources.add(de::toString(subpassNdx) + "-vert") << glu::VertexSource(vertexShader.str()); 3415c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi dst.glslSources.add(de::toString(subpassNdx) + "-frag") << glu::FragmentSource(fragmentShader.str()); 3416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeAttachmentIsLazy (vector<bool>& attachmentIsLazy, const vector<Attachment>& attachments, TestConfig::ImageMemory imageMemory) 3421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool lastAttachmentWasLazy = false; 3423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++) 3425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachments[attachmentNdx].getLoadOp() != VK_ATTACHMENT_LOAD_OP_LOAD 3427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && attachments[attachmentNdx].getStoreOp() != VK_ATTACHMENT_STORE_OP_STORE 3428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && attachments[attachmentNdx].getStencilLoadOp() != VK_ATTACHMENT_LOAD_OP_LOAD 3429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi && attachments[attachmentNdx].getStencilStoreOp() != VK_ATTACHMENT_STORE_OP_STORE) 3430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (imageMemory == TestConfig::IMAGEMEMORY_LAZY || (imageMemory & TestConfig::IMAGEMEMORY_LAZY && !lastAttachmentWasLazy)) 3432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentIsLazy.push_back(true); 3434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lastAttachmentWasLazy = true; 3435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (imageMemory & TestConfig::IMAGEMEMORY_STRICT) 3437c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentIsLazy.push_back(false); 3439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lastAttachmentWasLazy = false; 3440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown imageMemory"); 3443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentIsLazy.push_back(false); 3446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 34495b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasserenum AttachmentRefType 34505b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{ 34515b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser ATTACHMENTREFTYPE_COLOR, 34525b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser ATTACHMENTREFTYPE_DEPTH_STENCIL, 34535b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser ATTACHMENTREFTYPE_INPUT, 34545b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser ATTACHMENTREFTYPE_RESOLVE, 34555b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser}; 34565b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 34575b6f20515e6e8dadec3be728a2d0994535ba1016Mais AlnasserVkImageUsageFlags getImageUsageFromLayout(VkImageLayout layout) 34585b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{ 34595b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser switch (layout) 34605b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser { 34615b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case VK_IMAGE_LAYOUT_GENERAL: 34625b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case VK_IMAGE_LAYOUT_PREINITIALIZED: 34635b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser return 0; 34645b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: 34655b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser return VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 34665b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: 34675b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL: 34685b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser return VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; 34695b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: 34705b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser return VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; 34715b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: 34725b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser return VK_IMAGE_USAGE_TRANSFER_SRC_BIT; 34735b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: 34745b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser return VK_IMAGE_USAGE_TRANSFER_DST_BIT; 34755b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser default: 34765b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser DE_FATAL("Unexpected image layout"); 34775b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser return 0; 34785b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser } 34795b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser} 34805b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 34815b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasservoid getImageUsageFromAttachmentReferences(vector<VkImageUsageFlags>& attachmentImageUsage, AttachmentRefType refType, size_t count, const AttachmentReference* references) 34825b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{ 34835b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser for (size_t referenceNdx = 0; referenceNdx < count; ++referenceNdx) 34845b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser { 34855b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser const deUint32 attachment = references[referenceNdx].getAttachment(); 34865b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 34875b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser if (attachment != VK_ATTACHMENT_UNUSED) 34885b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser { 34895b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser VkImageUsageFlags usage; 34905b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 34915b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser switch (refType) 34925b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser { 34935b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case ATTACHMENTREFTYPE_COLOR: 34945b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case ATTACHMENTREFTYPE_RESOLVE: 34955b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 34965b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser break; 34975b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case ATTACHMENTREFTYPE_DEPTH_STENCIL: 34985b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT; 34995b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser break; 35005b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser case ATTACHMENTREFTYPE_INPUT: 35015b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser usage = VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; 35025b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser break; 35035b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser default: 35045b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser DE_FATAL("Unexpected attachment reference type"); 35055b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser usage = 0; 35065b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser break; 35075b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser } 35085b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 35095b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser attachmentImageUsage[attachment] |= usage; 35105b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser } 35115b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser } 35125b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser} 35135b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 35145b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasservoid getImageUsageFromAttachmentReferences(vector<VkImageUsageFlags>& attachmentImageUsage, AttachmentRefType refType, const vector<AttachmentReference>& references) 35155b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{ 35165b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser if (!references.empty()) 35175b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser { 35185b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser getImageUsageFromAttachmentReferences(attachmentImageUsage, refType, references.size(), &references[0]); 35195b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser } 35205b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser} 35215b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 3522277e50dc77528b67562f54c5813b6370e355b614Mais Alnasservoid initializeAttachmentImageUsage (Context &context, vector<VkImageUsageFlags>& attachmentImageUsage, const RenderPass& renderPassInfo, const vector<bool>& attachmentIsLazy, const vector<Maybe<VkClearValue> >& clearValues) 35235b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser{ 35245b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser attachmentImageUsage.resize(renderPassInfo.getAttachments().size(), VkImageUsageFlags(0)); 35255b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 35265b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); ++subpassNdx) 35275b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser { 35285b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser const Subpass& subpass = renderPassInfo.getSubpasses()[subpassNdx]; 35295b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 35305b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser getImageUsageFromAttachmentReferences(attachmentImageUsage, ATTACHMENTREFTYPE_COLOR, subpass.getColorAttachments()); 35315b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser getImageUsageFromAttachmentReferences(attachmentImageUsage, ATTACHMENTREFTYPE_DEPTH_STENCIL, 1, &subpass.getDepthStencilAttachment()); 35325b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser getImageUsageFromAttachmentReferences(attachmentImageUsage, ATTACHMENTREFTYPE_INPUT, subpass.getInputAttachments()); 35335b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser getImageUsageFromAttachmentReferences(attachmentImageUsage, ATTACHMENTREFTYPE_RESOLVE, subpass.getResolveAttachments()); 35345b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser } 35355b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 35365b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 35375b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser { 35385b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser const Attachment& attachment = renderPassInfo.getAttachments()[attachmentNdx]; 35395b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 3540277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser const VkFormatProperties formatProperties = getPhysicalDeviceFormatProperties(context.getInstanceInterface(), context.getPhysicalDevice(), attachment.getFormat()); 3541277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser const VkFormatFeatureFlags supportedFeatures = formatProperties.optimalTilingFeatures; 3542277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser 3543277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser if ((supportedFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) != 0) 3544277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser attachmentImageUsage[attachmentNdx] |= VK_IMAGE_USAGE_SAMPLED_BIT; 3545277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser 3546277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser if ((supportedFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) != 0) 3547277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser attachmentImageUsage[attachmentNdx] |= VK_IMAGE_USAGE_STORAGE_BIT; 3548277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser 35495b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser attachmentImageUsage[attachmentNdx] |= getImageUsageFromLayout(attachment.getInitialLayout()); 35505b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser attachmentImageUsage[attachmentNdx] |= getImageUsageFromLayout(attachment.getFinalLayout()); 35515b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 35525b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser if (!attachmentIsLazy[attachmentNdx]) 35535b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser { 35545b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser if (clearValues[attachmentNdx]) 35555b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser attachmentImageUsage[attachmentNdx] |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; 35565b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 35575b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser attachmentImageUsage[attachmentNdx] |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; 35585b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser } 35595b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser } 35605b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser} 35615b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser 3562c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassIsSecondary (vector<bool>& subpassIsSecondary, const vector<Subpass>& subpasses, TestConfig::CommandBufferTypes commandBuffer) 3563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool lastSubpassWasSecondary = false; 3565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < subpasses.size(); subpassNdx++) 3567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (commandBuffer == TestConfig::COMMANDBUFFERTYPES_SECONDARY || (commandBuffer & TestConfig::COMMANDBUFFERTYPES_SECONDARY && !lastSubpassWasSecondary)) 3569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpassIsSecondary.push_back(true); 3571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lastSubpassWasSecondary = true; 3572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (commandBuffer & TestConfig::COMMANDBUFFERTYPES_INLINE) 3574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpassIsSecondary.push_back(false); 3576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lastSubpassWasSecondary = false; 3577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown commandBuffer"); 3580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeImageClearValues (de::Random& rng, vector<Maybe<VkClearValue> >& clearValues, const vector<Attachment>& attachments, const vector<bool>& isLazy) 3584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++) 3586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!isLazy[attachmentNdx]) 3588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues.push_back(just(randomClearValue(attachments[attachmentNdx], rng))); 3589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues.push_back(nothing<VkClearValue>()); 3591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeRenderPassClearValues (de::Random& rng, vector<Maybe<VkClearValue> >& clearValues, const vector<Attachment>& attachments) 3595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++) 3597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachments[attachmentNdx].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR 3599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || attachments[attachmentNdx].getStencilLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR) 3600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues.push_back(just(randomClearValue(attachments[attachmentNdx], rng))); 3602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues.push_back(nothing<VkClearValue>()); 3605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassClearValues (de::Random& rng, vector<vector<VkClearColorValue> >& clearValues, const RenderPass& renderPass) 3609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues.resize(renderPass.getSubpasses().size()); 3611c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < renderPass.getSubpasses().size(); subpassNdx++) 3613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = renderPass.getSubpasses()[subpassNdx]; 3615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& colorAttachments = subpass.getColorAttachments(); 3616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues[subpassNdx].resize(colorAttachments.size()); 3618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentRefNdx = 0; attachmentRefNdx < colorAttachments.size(); attachmentRefNdx++) 3620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& attachmentRef = colorAttachments[attachmentRefNdx]; 3622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = renderPass.getAttachments()[attachmentRef.getAttachment()]; 3623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi clearValues[subpassNdx][attachmentRefNdx] = randomColorClearValue(attachment, rng); 3625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3627c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3628c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid logSubpassRenderInfo (TestLog& log, 3630c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const SubpassRenderInfo& info) 3631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Viewport, offset: " << info.getViewportOffset() << ", size: " << info.getViewportSize() << TestLog::EndMessage; 3633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (info.isSecondary()) 3635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Subpass uses secondary command buffers" << TestLog::EndMessage; 3636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Subpass uses inlined commands" << TestLog::EndMessage; 3638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (deUint32 attachmentNdx = 0; attachmentNdx < info.getColorClears().size(); attachmentNdx++) 3640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3641c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const ColorClear& colorClear = info.getColorClears()[attachmentNdx]; 3642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Clearing color attachment " << attachmentNdx 3644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ". Offset: " << colorClear.getOffset() 3645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ", Size: " << colorClear.getSize() 3646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ", Color: " << clearColorToString(info.getColorAttachment(attachmentNdx).getFormat(), colorClear.getColor()) << TestLog::EndMessage; 3647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (info.getDepthStencilClear()) 3650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DepthStencilClear& depthStencilClear = *info.getDepthStencilClear(); 3652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Clearing depth stencil attachment" 3654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ". Offset: " << depthStencilClear.getOffset() 3655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ", Size: " << depthStencilClear.getSize() 3656c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ", Depth: " << depthStencilClear.getDepth() 3657c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi << ", Stencil: " << depthStencilClear.getStencil() << TestLog::EndMessage; 3658c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3659c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3660c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (info.getRenderQuad()) 3661c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3662c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderQuad& renderQuad = *info.getRenderQuad(); 3663c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3664c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Rendering gradient quad to " << renderQuad.getCornerA() << " -> " << renderQuad.getCornerB() << TestLog::EndMessage; 3665c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3666c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3667c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3668c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid logTestCaseInfo (TestLog& log, 3669c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig& config, 3670c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<bool>& attachmentIsLazy, 3671c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& imageClearValues, 3672c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Maybe<VkClearValue> >& renderPassClearValues, 3673c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassRenderInfo>& subpassRenderInfo) 3674c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3675c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPass = config.renderPass; 3676c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3677c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi logRenderPassInfo(log, renderPass); 3678c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3679c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(attachmentIsLazy.size() == renderPass.getAttachments().size()); 3680c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(imageClearValues.size() == renderPass.getAttachments().size()); 3681c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(renderPassClearValues.size() == renderPass.getAttachments().size()); 3682c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3683c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "TargetSize: " << config.targetSize << TestLog::EndMessage; 3684c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Render area, Offset: " << config.renderPos << ", Size: " << config.renderSize << TestLog::EndMessage; 3685c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3686c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentIsLazy.size(); attachmentNdx++) 3687c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3688c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection section (log, "Attachment" + de::toString(attachmentNdx), "Attachment " + de::toString(attachmentNdx)); 3689c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3690c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (attachmentIsLazy[attachmentNdx]) 3691c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Is lazy." << TestLog::EndMessage; 3692c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3693c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (imageClearValues[attachmentNdx]) 3694c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Image is cleared to " << clearValueToString(renderPass.getAttachments()[attachmentNdx].getFormat(), *imageClearValues[attachmentNdx]) << " before rendering." << TestLog::EndMessage; 3695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3696c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (renderPass.getAttachments()[attachmentNdx].getLoadOp() == VK_ATTACHMENT_LOAD_OP_CLEAR && renderPassClearValues[attachmentNdx]) 3697c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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; 3698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < renderPass.getSubpasses().size(); subpassNdx++) 3701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::ScopedLogSection section (log, "Subpass" + de::toString(subpassNdx), "Subpass " + de::toString(subpassNdx)); 3703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi logSubpassRenderInfo(log, subpassRenderInfo[subpassNdx]); 3705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid initializeSubpassRenderInfo (vector<SubpassRenderInfo>& renderInfos, de::Random& rng, const RenderPass& renderPass, const TestConfig& config) 3709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::CommandBufferTypes commandBuffer = config.commandBufferTypes; 3711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass>& subpasses = renderPass.getSubpasses(); 3712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool lastSubpassWasSecondary = false; 3713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (deUint32 subpassNdx = 0; subpassNdx < (deUint32)subpasses.size(); subpassNdx++) 3715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Subpass& subpass = subpasses[subpassNdx]; 3717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool subpassIsSecondary = commandBuffer == TestConfig::COMMANDBUFFERTYPES_SECONDARY 3718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi || (commandBuffer & TestConfig::COMMANDBUFFERTYPES_SECONDARY && !lastSubpassWasSecondary) ? true : false; 3719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 viewportSize ((config.renderSize * UVec2(2)) / UVec2(3)); 3720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 viewportOffset (config.renderPos.x() + (subpassNdx % 2) * (config.renderSize.x() / 3), 3721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi config.renderPos.y() + ((subpassNdx / 2) % 2) * (config.renderSize.y() / 3)); 3722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3723c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<ColorClear> colorClears; 3724c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<DepthStencilClear> depthStencilClear; 3725c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Maybe<RenderQuad> renderQuad; 3726c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3727c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi lastSubpassWasSecondary = subpassIsSecondary; 3728c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3729c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (config.renderTypes & TestConfig::RENDERTYPES_CLEAR) 3730c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3731c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<AttachmentReference>& colorAttachments = subpass.getColorAttachments(); 3732c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3733c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentRefNdx = 0; attachmentRefNdx < colorAttachments.size(); attachmentRefNdx++) 3734c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3735c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AttachmentReference& attachmentRef = colorAttachments[attachmentRefNdx]; 3736c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = renderPass.getAttachments()[attachmentRef.getAttachment()]; 3737c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 size ((viewportSize * UVec2(2)) / UVec2(3)); 3738c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 offset (viewportOffset.x() + ((deUint32)attachmentRefNdx % 2u) * (viewportSize.x() / 3u), 3739c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi viewportOffset.y() + (((deUint32)attachmentRefNdx / 2u) % 2u) * (viewportSize.y() / 3u)); 3740c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearColorValue color = randomColorClearValue(attachment, rng); 3741c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3742c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorClears.push_back(ColorClear(offset, size, color)); 3743c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3744c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3745c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (subpass.getDepthStencilAttachment().getAttachment() != VK_ATTACHMENT_UNUSED) 3746c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3747c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = renderPass.getAttachments()[subpass.getDepthStencilAttachment().getAttachment()]; 3748c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 size ((viewportSize * UVec2(2)) / UVec2(3)); 3749c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 offset (viewportOffset.x() + ((deUint32)colorAttachments.size() % 2u) * (viewportSize.x() / 3u), 3750c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi viewportOffset.y() + (((deUint32)colorAttachments.size() / 2u) % 2u) * (viewportSize.y() / 3u)); 3751c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkClearValue value = randomClearValue(attachment, rng); 3752c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3753c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi depthStencilClear = tcu::just(DepthStencilClear(offset, size, value.depthStencil.depth, value.depthStencil.stencil)); 3754c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3755c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3756c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3757c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (config.renderTypes & TestConfig::RENDERTYPES_DRAW) 3758b9617e4c1cb9b0b2e199527315b68c3ee96a3fb9Michael Stokes { 3759b9617e4c1cb9b0b2e199527315b68c3ee96a3fb9Michael Stokes // (-0.5,-0.5) - (0.5,0.5) rounded to pixel edges 3760b9617e4c1cb9b0b2e199527315b68c3ee96a3fb9Michael Stokes const float x = (float)(viewportSize.x() / 4) / (float)(viewportSize.x() / 2); 3761b9617e4c1cb9b0b2e199527315b68c3ee96a3fb9Michael Stokes const float y = (float)(viewportSize.y() / 4) / (float)(viewportSize.y() / 2); 3762b9617e4c1cb9b0b2e199527315b68c3ee96a3fb9Michael Stokes renderQuad = tcu::just(RenderQuad(tcu::Vec4(-x, -y, 0.0f, 1.0f), tcu::Vec4(x, y, 1.0f, 1.0f))); 3763b9617e4c1cb9b0b2e199527315b68c3ee96a3fb9Michael Stokes } 3764c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3765c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderInfos.push_back(SubpassRenderInfo(renderPass, subpassNdx, subpassIsSecondary, viewportOffset, viewportSize, renderQuad, colorClears, depthStencilClear)); 3766c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3767c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3768c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3769c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvivoid checkTextureFormatSupport (TestLog& log, 3770c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const InstanceInterface& vk, 3771c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkPhysicalDevice device, 3772c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Attachment>& attachments) 3773c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3774c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi bool supported = true; 3775c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3776c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachments.size(); attachmentNdx++) 3777c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3778c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachment = attachments[attachmentNdx]; 3779c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const tcu::TextureFormat format = mapVkFormat(attachment.getFormat()); 3780c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool isDepthOrStencilAttachment = hasDepthComponent(format.order) || hasStencilComponent(format.order); 3781c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkFormatFeatureFlags flags = isDepthOrStencilAttachment? VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT : VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT; 3782c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkFormatProperties properties; 3783c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 378468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos vk.getPhysicalDeviceFormatProperties(device, attachment.getFormat(), &properties); 3785c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3786c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if ((properties.optimalTilingFeatures & flags) != flags) 3787c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3788c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi supported = false; 3789c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi log << TestLog::Message << "Format: " << attachment.getFormat() << " not supported as " << (isDepthOrStencilAttachment ? "depth stencil attachment" : "color attachment") << TestLog::EndMessage; 3790c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3791c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3792c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3793c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (!supported) 3794c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TCU_THROW(NotSupportedError, "Format not supported"); 3795c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3796c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3797c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvitcu::TestStatus renderPassTest (Context& context, TestConfig config) 3798c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3799c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSize = config.targetSize; 3800c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPos = config.renderPos; 3801c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSize = config.renderSize; 3802c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass& renderPassInfo = config.renderPass; 3803c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3804c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestLog& log = context.getTestContext().getLog(); 3805c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::Random rng (config.seed); 3806c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3807c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<bool> attachmentIsLazy; 38085b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser vector<VkImageUsageFlags> attachmentImageUsage; 3809c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Maybe<VkClearValue> > imageClearValues; 3810c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Maybe<VkClearValue> > renderPassClearValues; 3811c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3812c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<bool> subpassIsSecondary; 3813c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassRenderInfo> subpassRenderInfo; 3814c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<vector<VkClearColorValue> > subpassColorClearValues; 3815c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3816c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeAttachmentIsLazy(attachmentIsLazy, renderPassInfo.getAttachments(), config.imageMemory); 3817c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeImageClearValues(rng, imageClearValues, renderPassInfo.getAttachments(), attachmentIsLazy); 3818277e50dc77528b67562f54c5813b6370e355b614Mais Alnasser initializeAttachmentImageUsage(context, attachmentImageUsage, renderPassInfo, attachmentIsLazy, imageClearValues); 3819c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeRenderPassClearValues(rng, renderPassClearValues, renderPassInfo.getAttachments()); 3820c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3821c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeSubpassIsSecondary(subpassIsSecondary, renderPassInfo.getSubpasses(), config.commandBufferTypes); 3822c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeSubpassClearValues(rng, subpassColorClearValues, renderPassInfo); 3823c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi initializeSubpassRenderInfo(subpassRenderInfo, rng, renderPassInfo, config); 3824c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3825c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi logTestCaseInfo(log, config, attachmentIsLazy, imageClearValues, renderPassClearValues, subpassRenderInfo); 3826c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3827c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi checkTextureFormatSupport(log, context.getInstanceInterface(), context.getPhysicalDevice(), config.renderPass.getAttachments()); 3828c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3829c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 383086abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi const vk::VkPhysicalDeviceProperties properties = vk::getPhysicalDeviceProperties(context.getInstanceInterface(), context.getPhysicalDevice()); 383186abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi 383286abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi log << TestLog::Message << "Max color attachments: " << properties.limits.maxColorAttachments << TestLog::EndMessage; 383386abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi 383486abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++) 383586abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi { 383686abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi if (renderPassInfo.getSubpasses()[subpassNdx].getColorAttachments().size() > (size_t)properties.limits.maxColorAttachments) 383786abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi TCU_THROW(NotSupportedError, "Subpass uses more than maxColorAttachments."); 383886abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi } 383986abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi } 384086abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi 384186abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi { 3842c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkDevice device = context.getDevice(); 3843c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const DeviceInterface& vk = context.getDeviceInterface(); 3844c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkQueue queue = context.getUniversalQueue(); 3845c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 queueIndex = context.getUniversalQueueFamilyIndex(); 3846c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Allocator& allocator = context.getDefaultAllocator(); 3847c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3848c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Unique<VkRenderPass> renderPass (createRenderPass(vk, device, renderPassInfo)); 384968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkCommandPool> commandBufferPool (createCommandPool(vk, device, queueIndex, 0)); 385068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkCommandBuffer> initializeImagesCommandBuffer (allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY)); 385168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkCommandBuffer> renderCommandBuffer (allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY)); 385268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const Unique<VkCommandBuffer> readImagesToBuffersCommandBuffer (allocateCommandBuffer(vk, device, *commandBufferPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY)); 3853c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3854c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<de::SharedPtr<AttachmentResources> > attachmentResources; 3855c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<de::SharedPtr<SubpassRenderer> > subpassRenderers; 3856c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<VkImageView> attachmentViews; 3857c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3858c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < renderPassInfo.getAttachments().size(); attachmentNdx++) 3859c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3860c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment& attachmentInfo = renderPassInfo.getAttachments()[attachmentNdx]; 3861c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 38625b6f20515e6e8dadec3be728a2d0994535ba1016Mais Alnasser attachmentResources.push_back(de::SharedPtr<AttachmentResources>(new AttachmentResources(vk, device, allocator, queueIndex, targetSize, attachmentInfo, attachmentImageUsage[attachmentNdx]))); 3863c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachmentViews.push_back(attachmentResources[attachmentNdx]->getAttachmentView()); 3864c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3865c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 386668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos beginCommandBuffer(vk, *initializeImagesCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0); 3867c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pushImageInitializationCommands(vk, *initializeImagesCommandBuffer, renderPassInfo.getAttachments(), attachmentResources, queueIndex, imageClearValues); 3868c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi endCommandBuffer(vk, *initializeImagesCommandBuffer); 3869c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3870c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3871c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Unique<VkFramebuffer> framebuffer (createFramebuffer(vk, device, *renderPass, targetSize, attachmentViews)); 3872c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3873c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < renderPassInfo.getSubpasses().size(); subpassNdx++) 3874c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpassRenderers.push_back(de::SharedPtr<SubpassRenderer>(new SubpassRenderer(context, vk, device, allocator, *renderPass, *framebuffer, *commandBufferPool, queueIndex, subpassRenderInfo[subpassNdx]))); 3875c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 387668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos beginCommandBuffer(vk, *renderCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0); 3877c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pushRenderPassCommands(vk, *renderCommandBuffer, *renderPass, *framebuffer, subpassRenderers, renderPos, renderSize, renderPassClearValues, config.renderTypes); 3878c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi endCommandBuffer(vk, *renderCommandBuffer); 3879c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 388068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos beginCommandBuffer(vk, *readImagesToBuffersCommandBuffer, (VkCommandBufferUsageFlags)0, DE_NULL, 0, DE_NULL, VK_FALSE, (VkQueryControlFlags)0, (VkQueryPipelineStatisticFlags)0); 3881c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi pushReadImagesToBuffers(vk, *readImagesToBuffersCommandBuffer, queueIndex, attachmentResources, renderPassInfo.getAttachments(), attachmentIsLazy, targetSize); 3882c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi endCommandBuffer(vk, *readImagesToBuffersCommandBuffer); 3883c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 388468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkCommandBuffer commandBuffers[] = 3885c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3886c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *initializeImagesCommandBuffer, 3887c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *renderCommandBuffer, 3888c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi *readImagesToBuffersCommandBuffer 3889c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3890c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Unique<VkFence> fence (createFence(vk, device, 0u)); 3891c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3892c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi queueSubmit(vk, queue, DE_LENGTH_OF_ARRAY(commandBuffers), commandBuffers, *fence); 3893c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi waitForFences(vk, device, 1, &fence.get(), VK_TRUE, ~0ull); 3894c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3895c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3896c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3897c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (logAndVerifyImages(log, vk, device, attachmentResources, attachmentIsLazy, renderPassInfo, renderPassClearValues, imageClearValues, subpassRenderInfo, targetSize, config)) 3898c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return tcu::TestStatus::pass("Pass"); 3899c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 3900c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return tcu::TestStatus::fail("Result verification failed"); 3901c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 3902c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 3903c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 390418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvistatic const VkFormat s_coreColorFormats[] = 3905c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 390668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FORMAT_R5G6B5_UNORM_PACK16, 3907c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8_UNORM, 3908c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8_SNORM, 3909c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8_UINT, 3910c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8_SINT, 3911c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8_UNORM, 3912c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8_SNORM, 3913c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8_UINT, 3914c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8_SINT, 3915c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8B8A8_UNORM, 3916c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8B8A8_SNORM, 3917c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8B8A8_UINT, 3918c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8B8A8_SINT, 3919c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R8G8B8A8_SRGB, 392018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A8B8G8R8_UNORM_PACK32, 392118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A8B8G8R8_SNORM_PACK32, 392218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A8B8G8R8_UINT_PACK32, 392318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A8B8G8R8_SINT_PACK32, 392418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A8B8G8R8_SRGB_PACK32, 392518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_B8G8R8A8_UNORM, 392618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_B8G8R8A8_SRGB, 392718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A2R10G10B10_UNORM_PACK32, 392818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A2B10G10R10_UNORM_PACK32, 392918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_A2B10G10R10_UINT_PACK32, 3930c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16_UNORM, 3931c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16_SNORM, 3932c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16_UINT, 3933c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16_SINT, 3934c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16_SFLOAT, 3935c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16_UNORM, 3936c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16_SNORM, 3937c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16_UINT, 3938c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16_SINT, 3939c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16_SFLOAT, 3940c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16B16A16_UNORM, 3941c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16B16A16_SNORM, 3942c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16B16A16_UINT, 3943c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16B16A16_SINT, 3944c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R16G16B16A16_SFLOAT, 3945c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32_UINT, 3946c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32_SINT, 3947c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32_SFLOAT, 3948c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32_UINT, 3949c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32_SINT, 3950c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32_SFLOAT, 3951c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32B32A32_UINT, 3952c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32B32A32_SINT, 3953c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_R32G32B32A32_SFLOAT 3954c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 3955c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 395618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvistatic const VkFormat s_coreDepthStencilFormats[] = 3957c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 3958c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_D16_UNORM, 395918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 396068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_FORMAT_X8_D24_UNORM_PACK32, 3961c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_FORMAT_D32_SFLOAT, 396218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 396318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_D24_UNORM_S8_UINT, 396418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_FORMAT_D32_SFLOAT_S8_UINT 3965c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi}; 3966c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3967c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<tcu::TestCaseGroup> createAttachmentTestCaseGroup (tcu::TestContext& testCtx) 3968c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 396986abff6e5cef6f078ee37a667018e0540fcd97deMika Isojärvi const deUint32 attachmentCounts[] = { 1, 3, 4, 8 }; 3970c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp loadOps[] = 3971c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3972c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_LOAD, 3973c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 3974c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE 3975c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3976c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 3977c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp storeOps[] = 3978c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3979c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 3980775c33feeee3a8a7cfe1a51447424d4160083fffscygan VK_ATTACHMENT_STORE_OP_DONT_CARE 3981c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 3982c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 398300d994858ab64bb5e1c6cb534bb049dcbb9269descygan const VkImageLayout initialAndFinalColorLayouts[] = 3984c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 3985c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, 3986c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 398700d994858ab64bb5e1c6cb534bb049dcbb9269descygan VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 398800d994858ab64bb5e1c6cb534bb049dcbb9269descygan VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, 398900d994858ab64bb5e1c6cb534bb049dcbb9269descygan VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL 399000d994858ab64bb5e1c6cb534bb049dcbb9269descygan }; 399100d994858ab64bb5e1c6cb534bb049dcbb9269descygan 399200d994858ab64bb5e1c6cb534bb049dcbb9269descygan const VkImageLayout initialAndFinalDepthStencilLayouts[] = 399300d994858ab64bb5e1c6cb534bb049dcbb9269descygan { 399400d994858ab64bb5e1c6cb534bb049dcbb9269descygan VK_IMAGE_LAYOUT_GENERAL, 3995c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 3996c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, 3997c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 399868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, 399968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL 4000c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4001c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4002c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayouts[] = 4003c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4004c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, 4005c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL 4006c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4007c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4008c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout depthStencilLayouts[] = 4009c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4010c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, 4011c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL 4012c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4013c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4014c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::RenderTypes renderCommands[] = 4015c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4016c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_NONE, 4017c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_CLEAR, 4018c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_DRAW, 4019c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW, 4020c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4021c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4022c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::CommandBufferTypes commandBuffers[] = 4023c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4024c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_INLINE, 4025c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_SECONDARY, 4026c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_INLINE|TestConfig::COMMANDBUFFERTYPES_SECONDARY 4027c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4028c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4029c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::ImageMemory imageMemories[] = 4030c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4031c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_STRICT, 4032c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_LAZY, 4033c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_STRICT|TestConfig::IMAGEMEMORY_LAZY 4034c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4035c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4036c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSizes[] = 4037c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4038c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(64, 64), 4039c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(63, 65) 4040c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4041c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4042c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPositions[] = 4043c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4044c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(0, 0), 4045c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(3, 17) 4046c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4047c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4048c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSizes[] = 4049c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4050c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(32, 32), 4051c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(60, 47) 4052c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4053c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4054c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::Random rng (1433774382u); 4055c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "attachment", "Attachment format and count tests with load and store ops and image layouts")); 4056c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4057c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentCountNdx = 0; attachmentCountNdx < DE_LENGTH_OF_ARRAY(attachmentCounts); attachmentCountNdx++) 4058c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4059c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 attachmentCount = attachmentCounts[attachmentCountNdx]; 4060c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 testCaseCount = (attachmentCount == 1 ? 100 : 200); 4061c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> attachmentCountGroup (new tcu::TestCaseGroup(testCtx, de::toString(attachmentCount).c_str(), de::toString(attachmentCount).c_str())); 4062c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4063c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t testCaseNdx = 0; testCaseNdx < testCaseCount; testCaseNdx++) 4064c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4065c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool useDepthStencil = rng.getBool(); 4066c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VkImageLayout depthStencilLayout = VK_IMAGE_LAYOUT_GENERAL; 4067c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Attachment> attachments; 4068c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 4069c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4070c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount; attachmentNdx++) 4071c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 407268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT; 407318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkFormat format = rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreColorFormats), DE_ARRAY_END(s_coreColorFormats)); 4074c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp loadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 4075c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp storeOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 4076c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 407700d994858ab64bb5e1c6cb534bb049dcbb9269descygan const VkImageLayout initialLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts)); 407800d994858ab64bb5e1c6cb534bb049dcbb9269descygan const VkImageLayout finalizeLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts)); 4079c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 4080c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4081c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp stencilLoadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 4082c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp stencilStoreOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 4083c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4084c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout)); 4085c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout)); 4086c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4087c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4088c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (useDepthStencil) 4089c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 409018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT; 409118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkFormat format = rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreDepthStencilFormats), DE_ARRAY_END(s_coreDepthStencilFormats)); 4092c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp loadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 4093c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp storeOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 4094c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 409500d994858ab64bb5e1c6cb534bb049dcbb9269descygan const VkImageLayout initialLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalDepthStencilLayouts), DE_ARRAY_END(initialAndFinalDepthStencilLayouts)); 409600d994858ab64bb5e1c6cb534bb049dcbb9269descygan const VkImageLayout finalizeLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalDepthStencilLayouts), DE_ARRAY_END(initialAndFinalDepthStencilLayouts)); 4097c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4098c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp stencilLoadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 4099c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp stencilStoreOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 4100c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4101c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi depthStencilLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(depthStencilLayouts), DE_ARRAY_END(depthStencilLayouts)); 4102c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout)); 4103c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4104c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4105c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4106c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::RenderTypes render = rng.choose<TestConfig::RenderTypes>(DE_ARRAY_BEGIN(renderCommands), DE_ARRAY_END(renderCommands)); 4107c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::CommandBufferTypes commandBuffer = rng.choose<TestConfig::CommandBufferTypes>(DE_ARRAY_BEGIN(commandBuffers), DE_ARRAY_END(commandBuffers)); 4108c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::ImageMemory imageMemory = rng.choose<TestConfig::ImageMemory>(DE_ARRAY_BEGIN(imageMemories), DE_ARRAY_END(imageMemories)); 4109c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<Subpass> subpasses (1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference((useDepthStencil ? (deUint32)(attachments.size() - 1) : VK_ATTACHMENT_UNUSED), depthStencilLayout), vector<AttachmentReference>())); 4110c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const vector<SubpassDependency> deps; 4111c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4112c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const string testCaseName = de::toString(attachmentCountNdx * testCaseCount + testCaseNdx); 4113c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (attachments, subpasses, deps); 4114c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSize = rng.choose<UVec2>(DE_ARRAY_BEGIN(targetSizes), DE_ARRAY_END(targetSizes)); 4115c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPos = rng.choose<UVec2>(DE_ARRAY_BEGIN(renderPositions), DE_ARRAY_END(renderPositions)); 4116c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSize = rng.choose<UVec2>(DE_ARRAY_BEGIN(renderSizes), DE_ARRAY_END(renderSizes)); 4117c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4118c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(attachmentCountGroup.get(), testCaseName.c_str(), testCaseName.c_str(), createTestShaders, renderPassTest, TestConfig(renderPass, render, commandBuffer, imageMemory, targetSize, renderPos, renderSize, 1293809)); 4119c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4120c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4121c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4122c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi group->addChild(attachmentCountGroup.release()); 4123c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4124c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4125c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return group; 4126c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4127c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4128c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<tcu::TestCaseGroup> createAttachmentAllocationTestGroup (tcu::TestContext& testCtx) 4129c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4130c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 attachmentCounts[] = { 4, 8 }; 4131c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp loadOps[] = 4132c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4133c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_LOAD, 4134c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4135c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE 4136c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4137c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4138c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp storeOps[] = 4139c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4140c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4141c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE 4142c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4143c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 414424fb688e68b85c2752c5ab81d8292a1fed1e9addscygan const VkImageLayout initialAndFinalColorLayouts[] = 4145c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4146c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, 4147c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 414824fb688e68b85c2752c5ab81d8292a1fed1e9addscygan VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 414924fb688e68b85c2752c5ab81d8292a1fed1e9addscygan VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, 415024fb688e68b85c2752c5ab81d8292a1fed1e9addscygan VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL 415124fb688e68b85c2752c5ab81d8292a1fed1e9addscygan }; 415224fb688e68b85c2752c5ab81d8292a1fed1e9addscygan 4153c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayouts[] = 4154c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4155c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_GENERAL, 4156c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 4157c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4158c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4159c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi enum AllocationType 4160c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4161c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Each pass uses one more attachmen than previous one 4162c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_GROW, 4163c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Each pass uses one less attachment than previous one 4164c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_SHRINK, 4165c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Each pass drops one attachment and picks up new one 4166c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_ROLL, 4167c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // Start by growing and end by shrinking 4168c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_GROW_SHRINK 4169c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4170c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4171c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AllocationType allocationTypes[] = 4172c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4173c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_GROW, 4174c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_SHRINK, 4175c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_ROLL, 4176c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi ALLOCATIONTYPE_GROW_SHRINK 4177c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4178c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4179c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const char* const allocationTypeStr[] = 4180c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4181c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi "grow", 4182c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi "shrink", 4183c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi "roll", 4184c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi "grow_shrink" 4185c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4186c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4187c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::RenderTypes renderCommands[] = 4188c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4189c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_NONE, 4190c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_CLEAR, 4191c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_DRAW, 4192c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW, 4193c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4194c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4195c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::CommandBufferTypes commandBuffers[] = 4196c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4197c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_INLINE, 4198c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_SECONDARY, 4199c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::COMMANDBUFFERTYPES_INLINE|TestConfig::COMMANDBUFFERTYPES_SECONDARY 4200c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4201c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4202c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::ImageMemory imageMemories[] = 4203c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4204c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_STRICT, 4205c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_LAZY, 4206c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi TestConfig::IMAGEMEMORY_STRICT|TestConfig::IMAGEMEMORY_LAZY 4207c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4208c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4209c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSizes[] = 4210c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4211c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(64, 64), 4212c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(63, 65) 4213c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4214c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4215c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPositions[] = 4216c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4217c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(0, 0), 4218c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(3, 17) 4219c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4220c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4221c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSizes[] = 4222c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4223c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(32, 32), 4224c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi UVec2(60, 47) 4225c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4226c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4227c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "attachment_allocation", "Attachment allocation tests")); 4228c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::Random rng (3700649827u); 4229c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4230c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t allocationTypeNdx = 0; allocationTypeNdx < DE_LENGTH_OF_ARRAY(allocationTypes); allocationTypeNdx++) 4231c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4232c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const AllocationType allocationType = allocationTypes[allocationTypeNdx]; 4233c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const size_t testCaseCount = 100; 4234c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> allocationTypeGroup (new tcu::TestCaseGroup(testCtx, allocationTypeStr[allocationTypeNdx], allocationTypeStr[allocationTypeNdx])); 4235c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4236c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t testCaseNdx = 0; testCaseNdx < testCaseCount; testCaseNdx++) 4237c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4238c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const deUint32 attachmentCount = rng.choose<deUint32>(DE_ARRAY_BEGIN(attachmentCounts), DE_ARRAY_END(attachmentCounts)); 4239c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Attachment> attachments; 4240c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass> subpasses; 4241c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4242c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount; attachmentNdx++) 4243c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 424468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_1_BIT; 424518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkFormat format = rng.choose<VkFormat>(DE_ARRAY_BEGIN(s_coreColorFormats), DE_ARRAY_END(s_coreColorFormats)); 4246c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp loadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 4247c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp storeOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 4248c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 424924fb688e68b85c2752c5ab81d8292a1fed1e9addscygan const VkImageLayout initialLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts)); 425024fb688e68b85c2752c5ab81d8292a1fed1e9addscygan const VkImageLayout finalizeLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(initialAndFinalColorLayouts), DE_ARRAY_END(initialAndFinalColorLayouts)); 4251c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4252c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp stencilLoadOp = rng.choose<VkAttachmentLoadOp>(DE_ARRAY_BEGIN(loadOps), DE_ARRAY_END(loadOps)); 4253c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentStoreOp stencilStoreOp = rng.choose<VkAttachmentStoreOp>(DE_ARRAY_BEGIN(storeOps), DE_ARRAY_END(storeOps)); 4254c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4255c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi attachments.push_back(Attachment(format, sampleCount, loadOp, storeOp, stencilLoadOp, stencilStoreOp, initialLayout, finalizeLayout)); 4256c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4257c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4258c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi if (allocationType == ALLOCATIONTYPE_GROW) 4259c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4260c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++) 4261c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4262c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 4263c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4264c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpassNdx + 1; attachmentNdx++) 4265c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4266c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 4267c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4268c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout)); 4269c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4270c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4271c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), vector<AttachmentReference>())); 4272c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4273c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4274c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (allocationType == ALLOCATIONTYPE_SHRINK) 4275c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4276c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++) 4277c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4278c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 4279c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4280c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < (attachmentCount - subpassNdx); attachmentNdx++) 4281c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4282c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 4283c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4284c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout)); 4285c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4286c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4287c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), vector<AttachmentReference>())); 4288c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4289c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4290c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (allocationType == ALLOCATIONTYPE_ROLL) 4291c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4292c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < attachmentCount / 2; subpassNdx++) 4293c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4294c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 4295c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4296c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < attachmentCount / 2; attachmentNdx++) 4297c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4298c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 4299c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4300c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)(subpassNdx + attachmentNdx), subpassLayout)); 4301c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4302c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4303c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), vector<AttachmentReference>())); 4304c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4305c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4306c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else if (allocationType == ALLOCATIONTYPE_GROW_SHRINK) 4307c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4308c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++) 4309c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4310c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 4311c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4312c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < subpassNdx + 1; attachmentNdx++) 4313c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4314c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 4315c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4316c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout)); 4317c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4318c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4319c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), vector<AttachmentReference>())); 4320c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4321c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4322c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t subpassNdx = 0; subpassNdx < attachmentCount; subpassNdx++) 4323c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4324c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference> colorAttachmentReferences; 4325c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4326c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t attachmentNdx = 0; attachmentNdx < (attachmentCount - subpassNdx); attachmentNdx++) 4327c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4328c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkImageLayout subpassLayout = rng.choose<VkImageLayout>(DE_ARRAY_BEGIN(subpassLayouts), DE_ARRAY_END(subpassLayouts)); 4329c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4330c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi colorAttachmentReferences.push_back(AttachmentReference((deUint32)attachmentNdx, subpassLayout)); 4331c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4332c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4333c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi subpasses.push_back(Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 0u, vector<AttachmentReference>(), colorAttachmentReferences, vector<AttachmentReference>(), AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), vector<AttachmentReference>())); 4334c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4335c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4336c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi else 4337c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_FATAL("Unknown allocation type"); 4338c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4339c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4340c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::RenderTypes render = rng.choose<TestConfig::RenderTypes>(DE_ARRAY_BEGIN(renderCommands), DE_ARRAY_END(renderCommands)); 4341c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::CommandBufferTypes commandBuffer = rng.choose<TestConfig::CommandBufferTypes>(DE_ARRAY_BEGIN(commandBuffers), DE_ARRAY_END(commandBuffers)); 4342c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::ImageMemory imageMemory = rng.choose<TestConfig::ImageMemory>(DE_ARRAY_BEGIN(imageMemories), DE_ARRAY_END(imageMemories)); 4343c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4344c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const string testCaseName = de::toString(testCaseNdx); 4345c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSize = rng.choose<UVec2>(DE_ARRAY_BEGIN(targetSizes), DE_ARRAY_END(targetSizes)); 4346c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPos = rng.choose<UVec2>(DE_ARRAY_BEGIN(renderPositions), DE_ARRAY_END(renderPositions)); 4347c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSize = rng.choose<UVec2>(DE_ARRAY_BEGIN(renderSizes), DE_ARRAY_END(renderSizes)); 4348c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4349c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency> deps; 4350c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4351433aad756646dacd9b9bdd863fda3578977e254escygan for (size_t subpassNdx = 0; subpassNdx < subpasses.size() - 1; subpassNdx++) 4352c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4353c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const bool byRegion = rng.getBool(); 4354c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi deps.push_back(SubpassDependency((deUint32)subpassNdx, (deUint32)subpassNdx + 1, 4355c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 4356c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 4357c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 4358c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 4359c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4360c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT 4361c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 4362c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 4363c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 4364c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 436568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, 436668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, // \todo [pyry] Correct? 4367c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4368682d882fdacf7d4711d23a5ba006f7fb377cf0e3Pyry Haulos byRegion ? (VkBool32)VK_TRUE : (VkBool32)VK_FALSE)); 4369c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4370c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4371c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (attachments, subpasses, deps); 4372c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4373c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(allocationTypeGroup.get(), testCaseName.c_str(), testCaseName.c_str(), createTestShaders, renderPassTest, TestConfig(renderPass, render, commandBuffer, imageMemory, targetSize, renderPos, renderSize, 80329)); 4374c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4375c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4376c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4377c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi group->addChild(allocationTypeGroup.release()); 4378c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4379c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4380c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return group; 4381c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4382c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4383c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<tcu::TestCaseGroup> createSimpleTestGroup (tcu::TestContext& testCtx) 4384c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4385c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSize (64, 64); 4386c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPos (0, 0); 4387c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSize (64, 64); 4388c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "simple", "Simple basic render pass tests")); 4389c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4390c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // color 4391c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4392c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(1, Attachment(VK_FORMAT_R8G8B8A8_UNORM, 439368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4394c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4395c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4396c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4397c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4398c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 4399c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 4400c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 4401c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 4402c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4403c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 4404c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4405c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 4406c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>())), 4407c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 4408c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4409c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group.get(), "color", "Single color attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 4410c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4411c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4412c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // depth 4413c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 441468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos const RenderPass renderPass (vector<Attachment>(1, Attachment(VK_FORMAT_X8_D24_UNORM_PACK32, 441568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4416c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4417c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4418c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4419c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4420c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 4421c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)), 4422c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 4423c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 4424c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4425c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4426c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4427c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4428c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>())), 4429c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 4430c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4431c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group.get(), "depth", "Single depth attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 4432c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4433c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4434c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // stencil 4435c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4436c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(1, Attachment(VK_FORMAT_S8_UINT, 443768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4438c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4439c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4440c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4441c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4442c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 4443c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)), 4444c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 4445c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 4446c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4447c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4448c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4449c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4450c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>())), 4451c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 4452c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4453c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group.get(), "stencil", "Single stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 4454c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4455c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4456c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // depth_stencil 4457c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4458c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(1, Attachment(VK_FORMAT_D24_UNORM_S8_UINT, 445968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4460c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4461c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4462c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4463c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4464c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 4465c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)), 4466c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 4467c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 4468c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4469c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4470c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4471c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4472c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>())), 4473c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 4474c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4475c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group.get(), "depth_stencil", "Single depth stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 4476c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4477c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4478c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // color_depth 4479c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4480c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachments[] = 4481c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4482c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment(VK_FORMAT_R8G8B8A8_UNORM, 448368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4484c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4485c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4486c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4487c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4488c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 4489c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL), 449068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos Attachment(VK_FORMAT_X8_D24_UNORM_PACK32, 449168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4492c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4493c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4494c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4495c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4496c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 4497c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4498c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4499c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4500c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)), 4501c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 4502c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 4503c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4504c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 4505c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4506c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4507c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>())), 4508c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 4509c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4510c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group.get(), "color_depth", "Color and depth attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 4511c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4512c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4513c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // color_stencil 4514c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4515c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachments[] = 4516c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4517c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment(VK_FORMAT_R8G8B8A8_UNORM, 451868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4519c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4520c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4521c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4522c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4523c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 4524c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL), 4525c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment(VK_FORMAT_S8_UINT, 452668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4527c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4528c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4529c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4530c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4531c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 4532c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4533c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4534c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4535c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)), 4536c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 4537c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 4538c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4539c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 4540c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4541c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4542c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>())), 4543c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 4544c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4545c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4546c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group.get(), "color_stencil", "Color and stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 4547c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4548c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4549c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi // color_depth_stencil 4550c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4551c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const Attachment attachments[] = 4552c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4553c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment(VK_FORMAT_R8G8B8A8_UNORM, 455468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4555c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4556c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4557c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4558c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4559c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 4560c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL), 4561c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi Attachment(VK_FORMAT_D24_UNORM_S8_UINT, 456268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4563c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4564c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4565c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_CLEAR, 4566c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4567c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 4568c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4569c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4570c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4571c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(DE_ARRAY_BEGIN(attachments), DE_ARRAY_END(attachments)), 4572c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 4573c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 4574c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4575c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 4576c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4577c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 4578c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>())), 4579c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 4580c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4581c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi addFunctionCaseWithPrograms<TestConfig>(group.get(), "color_depth_stencil", "Color, depth and stencil attachment case.", createTestShaders, renderPassTest, TestConfig(renderPass, TestConfig::RENDERTYPES_DRAW, TestConfig::COMMANDBUFFERTYPES_INLINE, TestConfig::IMAGEMEMORY_STRICT, targetSize, renderPos, renderSize, 90239)); 4582c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4583c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4584c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return group; 4585c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4586c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4587c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvistd::string formatToName (VkFormat format) 4588c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4589c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const std::string formatStr = de::toString(format); 4590c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const std::string prefix = "VK_FORMAT_"; 4591c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4592c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi DE_ASSERT(formatStr.substr(0, prefix.length()) == prefix); 4593c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4594c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return de::toLower(formatStr.substr(prefix.length())); 4595c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4596c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4597c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvide::MovePtr<tcu::TestCaseGroup> createFormatTestGroup(tcu::TestContext& testCtx) 4598c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4599c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> group (new tcu::TestCaseGroup(testCtx, "formats", "Tests for different image formats.")); 4600c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4601c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 targetSize (64, 64); 4602c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderPos (0, 0); 4603c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const UVec2 renderSize (64, 64); 4604c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4605c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const struct 4606c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4607c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const char* const str; 4608c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp op; 4609c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } loadOps[] = 4610c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4611c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "clear", VK_ATTACHMENT_LOAD_OP_CLEAR }, 4612c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "load", VK_ATTACHMENT_LOAD_OP_LOAD }, 4613c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "dont_care", VK_ATTACHMENT_LOAD_OP_DONT_CARE } 4614c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4615c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4616c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const struct 4617c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4618c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const char* const str; 4619c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const TestConfig::RenderTypes types; 4620c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } renderTypes[] = 4621c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4622c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "clear", TestConfig::RENDERTYPES_CLEAR }, 4623c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "draw", TestConfig::RENDERTYPES_DRAW }, 4624c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { "clear_draw", TestConfig::RENDERTYPES_CLEAR|TestConfig::RENDERTYPES_DRAW } 4625c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi }; 4626c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 462718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi // Color formats 462818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_coreColorFormats); formatNdx++) 4629c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 463018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkFormat format = s_coreColorFormats[formatNdx]; 4631c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> formatGroup (new tcu::TestCaseGroup(testCtx, formatToName(format).c_str(), de::toString(format).c_str())); 4632c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4633c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t loadOpNdx = 0; loadOpNdx < DE_LENGTH_OF_ARRAY(loadOps); loadOpNdx++) 4634c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4635c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const VkAttachmentLoadOp loadOp = loadOps[loadOpNdx].op; 4636c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> loadOpGroup (new tcu::TestCaseGroup(testCtx, loadOps[loadOpNdx].str, loadOps[loadOpNdx].str)); 4637c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4638c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi for (size_t renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypes); renderTypeNdx++) 4639c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi { 4640c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi const RenderPass renderPass (vector<Attachment>(1, Attachment(format, 464168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos VK_SAMPLE_COUNT_1_BIT, 4642c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi loadOp, 4643c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 4644c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 4645c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 4646c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 4647c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 4648c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 4649c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 0u, 4650c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4651c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(1, AttachmentReference(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)), 4652c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>(), 4653c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi AttachmentReference(VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_GENERAL), 4654c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<AttachmentReference>())), 4655c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi vector<SubpassDependency>()); 465618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 465718cca0001c3ce503dcc339c839ed85be639e11e5Mika 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)); 465818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi } 465918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 466018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi formatGroup->addChild(loadOpGroup.release()); 466118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi } 466218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 466318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi group->addChild(formatGroup.release()); 466418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi } 466518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 466618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi // Depth stencil formats 466718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi for (size_t formatNdx = 0; formatNdx < DE_LENGTH_OF_ARRAY(s_coreDepthStencilFormats); formatNdx++) 466818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi { 466918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkFormat format = s_coreDepthStencilFormats[formatNdx]; 467018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi de::MovePtr<tcu::TestCaseGroup> formatGroup (new tcu::TestCaseGroup(testCtx, formatToName(format).c_str(), de::toString(format).c_str())); 467118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 467218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi for (size_t loadOpNdx = 0; loadOpNdx < DE_LENGTH_OF_ARRAY(loadOps); loadOpNdx++) 467318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi { 467418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const VkAttachmentLoadOp loadOp = loadOps[loadOpNdx].op; 467518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi de::MovePtr<tcu::TestCaseGroup> loadOpGroup (new tcu::TestCaseGroup(testCtx, loadOps[loadOpNdx].str, loadOps[loadOpNdx].str)); 467618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 467718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi for (size_t renderTypeNdx = 0; renderTypeNdx < DE_LENGTH_OF_ARRAY(renderTypes); renderTypeNdx++) 467818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi { 467918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi const RenderPass renderPass (vector<Attachment>(1, Attachment(format, 468018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_SAMPLE_COUNT_1_BIT, 468118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_ATTACHMENT_LOAD_OP_DONT_CARE, 468218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_ATTACHMENT_STORE_OP_DONT_CARE, 468318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi loadOp, 468418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_ATTACHMENT_STORE_OP_STORE, 468518cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 468618cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)), 468718cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<Subpass>(1, Subpass(VK_PIPELINE_BIND_POINT_GRAPHICS, 468818cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi 0u, 468918cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<AttachmentReference>(), 469018cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<AttachmentReference>(), 469118cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<AttachmentReference>(), 469218cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi AttachmentReference(0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL), 469318cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<AttachmentReference>())), 469418cca0001c3ce503dcc339c839ed85be639e11e5Mika Isojärvi vector<SubpassDependency>()); 4695c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4696c9c6281cc6b0599cf56012410f18a099a8a2969cMika 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)); 4697c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4698c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4699c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi formatGroup->addChild(loadOpGroup.release()); 4700c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4701c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4702c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi group->addChild(formatGroup.release()); 4703c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi } 4704c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4705c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return group; 4706c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4707c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4708c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} // anonymous 4709c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4710c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvitcu::TestCaseGroup* createRenderPassTests (tcu::TestContext& testCtx) 4711c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi{ 4712c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi de::MovePtr<tcu::TestCaseGroup> renderpassTests (new tcu::TestCaseGroup(testCtx, "renderpass", "RenderPass Tests")); 4713c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4714c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderpassTests->addChild(createSimpleTestGroup(testCtx).release()); 4715c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderpassTests->addChild(createFormatTestGroup(testCtx).release()); 4716c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderpassTests->addChild(createAttachmentTestCaseGroup(testCtx).release()); 4717c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi renderpassTests->addChild(createAttachmentAllocationTestGroup(testCtx).release()); 4718c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4719c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi return renderpassTests.release(); 4720c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} 4721c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi 4722c9c6281cc6b0599cf56012410f18a099a8a2969cMika Isojärvi} // vkt 4723