1e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga/*------------------------------------------------------------------------ 2e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * Vulkan Conformance Tests 3e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * ------------------------ 4e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * 5e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * Copyright (c) 2017 The Khronos Group Inc. 6e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * 7e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * Licensed under the Apache License, Version 2.0 (the "License"); 8e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * you may not use this file except in compliance with the License. 9e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * You may obtain a copy of the License at 10e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * 11e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * http://www.apache.org/licenses/LICENSE-2.0 12e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * 13e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * Unless required by applicable law or agreed to in writing, software 14e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * distributed under the License is distributed on an "AS IS" BASIS, 15e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * See the License for the specific language governing permissions and 17e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * limitations under the License. 18e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * 19e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *//*! 20e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * \file 21e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga * \brief Tests for mutable images 22e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *//*--------------------------------------------------------------------*/ 23e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 24e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "vktImageMutableTests.hpp" 25e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "vktTestCaseUtil.hpp" 26e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "vktImageTexture.hpp" 27e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 28e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "vkBuilderUtil.hpp" 29e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "vkQueryUtil.hpp" 30e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "vkImageUtil.hpp" 31e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 32e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "deUniquePtr.hpp" 33e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "deSharedPtr.hpp" 34e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 35e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "tcuImageCompare.hpp" 36e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "tcuTestLog.hpp" 37e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include "tcuTextureUtil.hpp" 38e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 39e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include <string> 40e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga#include <vector> 41e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 42e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogausing namespace vk; 43e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogausing namespace tcu; 44e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 45e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogausing de::UniquePtr; 46e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogausing de::MovePtr; 47e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogausing de::SharedPtr; 48e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogausing std::vector; 49e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 50e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroganamespace vkt 51e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 52e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroganamespace image 53e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 54e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 55e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogatypedef SharedPtr<Unique<VkPipeline> > SharedPtrVkPipeline; 56e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogatypedef SharedPtr<Unique<VkImageView> > SharedPtrVkImageView; 57e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 58e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogatemplate<typename T> 59e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogainline SharedPtr<Unique<T> > makeSharedPtr (Move<T> move) 60e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 61e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return SharedPtr<Unique<T> >(new Unique<T>(move)); 62e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 63e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 64e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogaenum Upload { 65e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga UPLOAD_CLEAR = 0, 66e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga UPLOAD_COPY, 67e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga UPLOAD_STORE, 68e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga UPLOAD_DRAW, 69e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga UPLOAD_LAST 70e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}; 71e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 72e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogaenum Download { 73e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DOWNLOAD_COPY = 0, 74e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DOWNLOAD_LOAD, 75e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DOWNLOAD_TEXTURE, 76e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DOWNLOAD_LAST 77e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}; 78e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 79e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastd::string getUploadString (const int upload) 80e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 81e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const char* strs[] = { "clear", "copy", "store", "draw" }; 82e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return strs[upload]; 83e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 84e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 85e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastd::string getDownloadString (const int download) 86e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 87e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const char* strs[] = { "copy", "load", "texture" }; 88e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return strs[download]; 89e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 90e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 91e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastruct CaseDef 92e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 93e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga ImageType imageType; 94e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga IVec3 size; 95e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga deUint32 numLayers; 96e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkFormat imageFormat; 97e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkFormat viewFormat; 98e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga enum Upload upload; 99e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga enum Download download; 10016b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga bool isFormatListTest; 101e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}; 102e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 103e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastatic const deUint32 COLOR_TABLE_SIZE = 4; 104e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 105e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// Reference color values for float color rendering. Values have been chosen 106e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// so that when the bit patterns are reinterpreted as a 16-bit float, we do not 107e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// run into NaN / inf / denorm values. 108e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastatic const Vec4 COLOR_TABLE_FLOAT[COLOR_TABLE_SIZE] = 109e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 110e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Vec4(0.00f, 0.40f, 0.80f, 0.10f), 111e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Vec4(0.10f, 0.50f, 0.90f, 0.20f), 112e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Vec4(0.20f, 0.60f, 1.00f, 0.30f), 113e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Vec4(0.30f, 0.70f, 0.00f, 0.40f), 114e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}; 115e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 116e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// Reference color values for integer color rendering. We avoid negative 117e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// values (even for SINT formats) to avoid the situation where sign extension 118e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// leads to NaN / inf values when they are reinterpreted with a float 119e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// format. 120e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastatic const IVec4 COLOR_TABLE_INT[COLOR_TABLE_SIZE] = 121e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 122e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga IVec4(112, 60, 101, 41), 123e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga IVec4( 60, 101, 41, 112), 124e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga IVec4( 41, 112, 60, 101), 125e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga IVec4(101, 41, 112, 60), 126e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}; 127e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 128e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// Reference clear colors created from the color table values 129e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastatic const VkClearValue REFERENCE_CLEAR_COLOR_FLOAT[COLOR_TABLE_SIZE] = 130e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 131e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeClearValueColorF32(COLOR_TABLE_FLOAT[0].x(), COLOR_TABLE_FLOAT[0].y(), COLOR_TABLE_FLOAT[0].z(), COLOR_TABLE_FLOAT[0].w()), 132e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeClearValueColorF32(COLOR_TABLE_FLOAT[1].x(), COLOR_TABLE_FLOAT[1].y(), COLOR_TABLE_FLOAT[1].z(), COLOR_TABLE_FLOAT[1].w()), 133e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeClearValueColorF32(COLOR_TABLE_FLOAT[2].x(), COLOR_TABLE_FLOAT[2].y(), COLOR_TABLE_FLOAT[2].z(), COLOR_TABLE_FLOAT[2].w()), 134e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeClearValueColorF32(COLOR_TABLE_FLOAT[3].x(), COLOR_TABLE_FLOAT[3].y(), COLOR_TABLE_FLOAT[3].z(), COLOR_TABLE_FLOAT[3].w()), 135e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}; 136e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 137e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastatic const VkClearValue REFERENCE_CLEAR_COLOR_INT[COLOR_TABLE_SIZE] = 138e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 139e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeClearValueColorI32(COLOR_TABLE_INT[0].x(), COLOR_TABLE_INT[0].y(), COLOR_TABLE_INT[0].z(), COLOR_TABLE_INT[0].w()), 140e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeClearValueColorI32(COLOR_TABLE_INT[1].x(), COLOR_TABLE_INT[1].y(), COLOR_TABLE_INT[1].z(), COLOR_TABLE_INT[1].w()), 141e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeClearValueColorI32(COLOR_TABLE_INT[2].x(), COLOR_TABLE_INT[2].y(), COLOR_TABLE_INT[2].z(), COLOR_TABLE_INT[2].w()), 142e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeClearValueColorI32(COLOR_TABLE_INT[3].x(), COLOR_TABLE_INT[3].y(), COLOR_TABLE_INT[3].z(), COLOR_TABLE_INT[3].w()), 143e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}; 144e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 145e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastatic const Texture s_textures[] = 146e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 147e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Texture(IMAGE_TYPE_2D, tcu::IVec3(32, 32, 1), 1), 148e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Texture(IMAGE_TYPE_2D_ARRAY, tcu::IVec3(32, 32, 1), 4), 149e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}; 150e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 151e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaVkImageType getImageType (const ImageType textureImageType) 152e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 153e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga switch (textureImageType) 154e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 155e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case IMAGE_TYPE_2D: 156e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case IMAGE_TYPE_2D_ARRAY: 157e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return VK_IMAGE_TYPE_2D; 158e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 159e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga default: 160e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_ASSERT(0); 161e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return VK_IMAGE_TYPE_LAST; 162e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 163e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 164e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 165e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaVkImageViewType getImageViewType (const ImageType textureImageType) 166e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 167e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga switch (textureImageType) 168e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 169e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case IMAGE_TYPE_2D: 170e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return VK_IMAGE_VIEW_TYPE_2D; 171e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case IMAGE_TYPE_2D_ARRAY: 172e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return VK_IMAGE_VIEW_TYPE_2D_ARRAY; 173e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 174e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga default: 175e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_ASSERT(0); 176e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return VK_IMAGE_VIEW_TYPE_LAST; 177e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 178e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 179e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 180e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastatic const VkFormat s_formats[] = 181e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 182e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R32G32B32A32_SFLOAT, 183e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R16G16B16A16_SFLOAT, 184e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R32G32_SFLOAT, 185e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R16G16_SFLOAT, 186e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R32_SFLOAT, 187e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 188e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R32G32B32A32_UINT, 189e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R16G16B16A16_UINT, 190e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R8G8B8A8_UINT, 191e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R32G32_UINT, 192e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R16G16_UINT, 193e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R32_UINT, 194e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 195e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R32G32B32A32_SINT, 196e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R16G16B16A16_SINT, 197e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R8G8B8A8_SINT, 198e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R32G32_SINT, 199e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R16G16_SINT, 200e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R32_SINT, 201e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 202e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R8G8B8A8_UNORM, 203e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 204e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R8G8B8A8_SNORM, 205e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}; 206e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 207e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogainline bool formatsAreCompatible (const VkFormat format0, const VkFormat format1) 208e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 209e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return format0 == format1 || mapVkFormat(format0).getPixelSize() == mapVkFormat(format1).getPixelSize(); 210e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 211e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 212e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastd::string getColorFormatStr (const int numComponents, const bool isUint, const bool isSint) 213e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 214e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga std::ostringstream str; 215e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (numComponents == 1) 216e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga str << (isUint ? "uint" : isSint ? "int" : "float"); 217e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga else 218e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga str << (isUint ? "u" : isSint ? "i" : "") << "vec" << numComponents; 219e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 220e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return str.str(); 221e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 222e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 223e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogastd::string getShaderSamplerType (const tcu::TextureFormat& format, VkImageViewType type) 224e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 225e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga std::ostringstream samplerType; 226e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 227e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER) 228e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga samplerType << "u"; 229e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga else if (tcu::getTextureChannelClass(format.type) == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER) 230e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga samplerType << "i"; 231e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 232e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga switch (type) 233e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 234e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_IMAGE_VIEW_TYPE_2D: 235e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga samplerType << "sampler2D"; 236e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 237e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 238e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_IMAGE_VIEW_TYPE_2D_ARRAY: 239e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga samplerType << "sampler2DArray"; 240e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 241e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 242e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga default: 243e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_FATAL("Ivalid image view type"); 244e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 245e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 246e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 247e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return samplerType.str(); 248e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 249e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 250e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid initPrograms (SourceCollections& programCollection, const CaseDef caseDef) 251e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 252e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (caseDef.upload == UPLOAD_DRAW) 253e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 254e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 255e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga std::ostringstream src; 256e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n" 257e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "\n" 258e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "layout(location = 0) in vec4 in_position;\n" 259e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "layout(location = 1) in vec4 in_color;\n" 260e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "layout(location = 0) out vec4 out_color;\n" 261e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "\n" 262e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "out gl_PerVertex {\n" 263e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << " vec4 gl_Position;\n" 264e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "};\n" 265e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "\n" 266e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "void main(void)\n" 267e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "{\n" 268e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << " gl_Position = in_position;\n" 269e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << " out_color = in_color;\n" 270e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "}\n"; 271e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 272e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga programCollection.glslSources.add("uploadDrawVert") << glu::VertexSource(src.str()); 273e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 274e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 275e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 276e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const int numComponents = getNumUsedChannels(mapVkFormat(caseDef.viewFormat).order); 277e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const bool isUint = isUintFormat(caseDef.viewFormat); 278e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const bool isSint = isIntFormat(caseDef.viewFormat); 279e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const std::string colorFormat = getColorFormatStr(numComponents, isUint, isSint); 280e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 281e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga std::ostringstream src; 282e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n" 283e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "\n" 284e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "layout(location = 0) in vec4 in_color;\n" 285e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "layout(location = 0) out " << colorFormat << " out_color;\n" 286e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "\n" 287e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "void main(void)\n" 288e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "{\n" 289e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << " out_color = " << colorFormat << "(" 290e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << (numComponents == 1 ? "in_color.r" : 291e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga numComponents == 2 ? "in_color.rg" : 292e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga numComponents == 3 ? "in_color.rgb" : "in_color") 293e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << ");\n" 294e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "}\n"; 295e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 296e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga programCollection.glslSources.add("uploadDrawFrag") << glu::FragmentSource(src.str()); 297e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 298e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 299e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 300e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (caseDef.upload == UPLOAD_STORE) 301e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 302e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const TextureFormat tcuFormat = mapVkFormat(caseDef.viewFormat); 303e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const std::string imageFormatStr = getShaderImageFormatQualifier(tcuFormat); 304e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const std::string imageTypeStr = getShaderImageType(tcuFormat, caseDef.imageType); 305e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const std::string colorTypeStr = isUintFormat(caseDef.viewFormat) ? "uvec4" : isIntFormat(caseDef.viewFormat) ? "ivec4" : "vec4"; 306e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const bool isIntegerFormat = isUintFormat(caseDef.viewFormat) || isIntFormat(caseDef.viewFormat); 307e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 308e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga std::ostringstream src; 309e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n" 310e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "\n" 311e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "layout (local_size_x = 1) in;\n" 312e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "\n" 313e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "layout(binding=0, " << imageFormatStr << ") writeonly uniform " << imageTypeStr << " u_image;\n" 314e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "\n" 315e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "const " << colorTypeStr << " colorTable[] = " << colorTypeStr << "[](\n"; 316e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga for (deUint32 idx = 0; idx < COLOR_TABLE_SIZE; idx++) 317e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 318e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (isIntegerFormat) 319e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << " " << colorTypeStr << "(" << COLOR_TABLE_INT[idx].x() << ", " << COLOR_TABLE_INT[idx].y() << ", " << COLOR_TABLE_INT[idx].z() << ", " << COLOR_TABLE_INT[idx].w() << ")"; 320e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga else 321e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << " " << colorTypeStr << "(" << COLOR_TABLE_FLOAT[idx].x() << ", " << COLOR_TABLE_FLOAT[idx].y() << ", " << COLOR_TABLE_FLOAT[idx].z() << ", " << COLOR_TABLE_FLOAT[idx].w() << ")"; 322e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (idx < COLOR_TABLE_SIZE - 1) 323e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << ","; 324e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << "\n"; 325e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 326e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << ");\n" 327e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "\n" 328e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "void main(void)\n" 329e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "{\n"; 330e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (caseDef.imageType == IMAGE_TYPE_2D) 331e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 332e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << " ivec2 pos = ivec2(gl_GlobalInvocationID.xy);\n"; 333e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 334e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga else 335e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 336e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_ASSERT(caseDef.imageType == IMAGE_TYPE_2D_ARRAY); 337e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << " ivec3 pos = ivec3(gl_GlobalInvocationID.xyz);\n"; 338e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 339e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << " " << colorTypeStr << " color = colorTable[gl_GlobalInvocationID.z];\n" 340e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << " imageStore(u_image, pos, color);\n" 341e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "}\n"; 342e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 343e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga programCollection.glslSources.add("uploadStoreComp") << glu::ComputeSource(src.str()); 344e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 345e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 346e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (caseDef.download == DOWNLOAD_LOAD) 347e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 348e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const TextureFormat tcuFormat = mapVkFormat(caseDef.viewFormat); 349e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const std::string imageFormatStr = getShaderImageFormatQualifier(tcuFormat); 350e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const std::string imageTypeStr = getShaderImageType(tcuFormat, caseDef.imageType); 351e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const std::string colorTypeStr = isUintFormat(caseDef.viewFormat) ? "uvec4" : isIntFormat(caseDef.viewFormat) ? "ivec4" : "vec4"; 352e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 353e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga std::ostringstream src; 354e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n" 355e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "\n" 356e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "layout (local_size_x = 1) in;\n" 357e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "\n" 358e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "layout(binding=0, " << imageFormatStr << ") readonly uniform " << imageTypeStr << " in_image;\n" 359e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "layout(binding=1, " << imageFormatStr << ") writeonly uniform " << imageTypeStr << " out_image;\n" 360e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "\n" 361e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "void main(void)\n" 362e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "{\n"; 363e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (caseDef.imageType == IMAGE_TYPE_2D) 364e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 365e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << " ivec2 pos = ivec2(gl_GlobalInvocationID.xy);\n"; 366e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 367e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga else 368e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 369e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_ASSERT(caseDef.imageType == IMAGE_TYPE_2D_ARRAY); 370e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << " ivec3 pos = ivec3(gl_GlobalInvocationID.xyz);\n"; 371e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 372e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << " imageStore(out_image, pos, imageLoad(in_image, pos));\n" 373e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "}\n"; 374e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 375e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga programCollection.glslSources.add("downloadLoadComp") << glu::ComputeSource(src.str()); 376e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 377e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 378e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (caseDef.download == DOWNLOAD_TEXTURE) 379e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 380e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const TextureFormat tcuFormat = mapVkFormat(caseDef.viewFormat); 381e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageViewType viewType = getImageViewType(caseDef.imageType); 382e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const std::string samplerTypeStr = getShaderSamplerType(tcuFormat, viewType); 383e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const std::string imageFormatStr = getShaderImageFormatQualifier(tcuFormat); 384e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const std::string imageTypeStr = getShaderImageType(tcuFormat, caseDef.imageType); 385e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const std::string colorTypeStr = isUintFormat(caseDef.viewFormat) ? "uvec4" : isIntFormat(caseDef.viewFormat) ? "ivec4" : "vec4"; 386e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 387e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga std::ostringstream src; 388e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450) << "\n" 389e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "\n" 390e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "layout (local_size_x = 1) in;\n" 391e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "\n" 392e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "layout(binding=0) uniform " << samplerTypeStr << " u_tex;\n" 393e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "layout(binding=1, " << imageFormatStr << ") writeonly uniform " << imageTypeStr << " out_image;\n" 394e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "\n" 395e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "void main(void)\n" 396e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "{\n"; 397e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (caseDef.imageType == IMAGE_TYPE_2D) 398e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 399e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << " ivec2 pos = ivec2(gl_GlobalInvocationID.xy);\n"; 400e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 401e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga else 402e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 403e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_ASSERT(caseDef.imageType == IMAGE_TYPE_2D_ARRAY); 404e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << " ivec3 pos = ivec3(gl_GlobalInvocationID.xyz);\n"; 405e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 406e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga src << " imageStore(out_image, pos, texelFetch(u_tex, pos, 0));\n" 407e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga << "}\n"; 408e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 409e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga programCollection.glslSources.add("downloadTextureComp") << glu::ComputeSource(src.str()); 410e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 411e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 412e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 413e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMove<VkImage> makeImage (const DeviceInterface& vk, 414e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkDevice device, 415e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkImageCreateFlags flags, 416e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkImageType imageType, 417e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkFormat format, 41816b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga const VkFormat viewFormat, 41916b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga const bool useImageFormatList, 420e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const IVec3& size, 421e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const deUint32 numMipLevels, 422e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const deUint32 numLayers, 423e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageUsageFlags usage) 424e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 42516b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga const VkFormat formatList[2] = 42616b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga { 42716b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga format, 42816b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga viewFormat 42916b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga }; 43016b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga 43116b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga const VkImageFormatListCreateInfoKHR formatListInfo = 43216b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga { 43316b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR, // VkStructureType sType; 43416b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga DE_NULL, // const void* pNext; 435da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 2u, // deUint32 viewFormatCount 43616b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga formatList // const VkFormat* pViewFormats 43716b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga }; 43816b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga 439e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageCreateInfo imageParams = 440e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 44116b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, // VkStructureType sType; 44216b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga useImageFormatList ? &formatListInfo : DE_NULL, // const void* pNext; 44316b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga flags, // VkImageCreateFlags flags; 44416b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga imageType, // VkImageType imageType; 44516b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga format, // VkFormat format; 44616b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga makeExtent3D(size), // VkExtent3D extent; 44716b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga numMipLevels, // deUint32 mipLevels; 44816b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga numLayers, // deUint32 arrayLayers; 44916b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 45016b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga VK_IMAGE_TILING_OPTIMAL, // VkImageTiling tiling; 45116b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga usage, // VkImageUsageFlags usage; 45216b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga VK_SHARING_MODE_EXCLUSIVE, // VkSharingMode sharingMode; 45316b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga 0u, // deUint32 queueFamilyIndexCount; 45416b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga DE_NULL, // const deUint32* pQueueFamilyIndices; 45516b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout; 456e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 457e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return createImage(vk, device, &imageParams); 458e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 459e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 460e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogainline Move<VkBuffer> makeBuffer (const DeviceInterface& vk, const VkDevice device, const VkDeviceSize bufferSize, const VkBufferUsageFlags usage) 461e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 462e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkBufferCreateInfo bufferCreateInfo = makeBufferCreateInfo(bufferSize, usage); 463e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return createBuffer(vk, device, &bufferCreateInfo); 464e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 465e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 466e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogainline VkImageSubresourceRange makeColorSubresourceRange (const int baseArrayLayer, const int layerCount) 467e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 468e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return makeImageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT, 0u, 1u, static_cast<deUint32>(baseArrayLayer), static_cast<deUint32>(layerCount)); 469e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 470e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 471e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMove<VkSampler> makeSampler (const DeviceInterface& vk, const VkDevice device) 472e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 473e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkSamplerCreateInfo samplerParams = 474e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 475e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, // VkStructureType sType; 476e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 477e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkSamplerCreateFlags)0, // VkSamplerCreateFlags flags; 478e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FILTER_NEAREST, // VkFilter magFilter; 479e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FILTER_NEAREST, // VkFilter minFilter; 480e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_SAMPLER_MIPMAP_MODE_NEAREST, // VkSamplerMipmapMode mipmapMode; 481e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeU; 482e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeV; 483e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, // VkSamplerAddressMode addressModeW; 484e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0.0f, // float mipLodBias; 485e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FALSE, // VkBool32 anisotropyEnable; 486e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1.0f, // float maxAnisotropy; 487e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FALSE, // VkBool32 compareEnable; 488e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_COMPARE_OP_ALWAYS, // VkCompareOp compareOp; 489e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0.0f, // float minLod; 490e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0.0f, // float maxLod; 491e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, // VkBorderColor borderColor; 492e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FALSE, // VkBool32 unnormalizedCoordinates; 493e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 494e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 495e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return createSampler(vk, device, &samplerParams); 496e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 497e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 498e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 499e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMove<VkPipelineLayout> makePipelineLayout (const DeviceInterface& vk, 500e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkDevice device) 501e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 502e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkPipelineLayoutCreateInfo info = 503e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 504e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, 505e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, 506e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkPipelineLayoutCreateFlags)0, 507e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u, 508e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, 509e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u, 510e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, 511e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 512e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return createPipelineLayout(vk, device, &info); 513e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 514e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 515e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMove<VkPipeline> makeGraphicsPipeline (const DeviceInterface& vk, 516e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkDevice device, 517e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkPipelineLayout pipelineLayout, 518e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkRenderPass renderPass, 519e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkShaderModule vertexModule, 520e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkShaderModule fragmentModule, 521e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const IVec2& renderSize, 522e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkPrimitiveTopology topology, 523e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const deUint32 subpass) 524e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 525e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkVertexInputBindingDescription vertexInputBindingDescription = 526e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 527da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 0u, // deUint32 binding; 528da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa (deUint32)(2 * sizeof(Vec4)), // deUint32 stride; 529e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_VERTEX_INPUT_RATE_VERTEX, // VkVertexInputRate inputRate; 530e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 531e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 532e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkVertexInputAttributeDescription vertexInputAttributeDescriptions[] = 533e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 534e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 535da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 0u, // deUint32 location; 536da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 0u, // deUint32 binding; 537e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format; 538da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 0u, // deUint32 offset; 539e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }, 540e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 541da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 1u, // deUint32 location; 542da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 0u, // deUint32 binding; 543e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FORMAT_R32G32B32A32_SFLOAT, // VkFormat format; 544da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa (deUint32)sizeof(Vec4), // deUint32 offset; 545e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 546e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 547e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 548e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkPipelineVertexInputStateCreateInfo vertexInputStateInfo = 549e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 550e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, // VkStructureType sType; 551e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 552e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkPipelineVertexInputStateCreateFlags)0, // VkPipelineVertexInputStateCreateFlags flags; 553da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 1u, // deUint32 vertexBindingDescriptionCount; 554e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga &vertexInputBindingDescription, // const VkVertexInputBindingDescription* pVertexBindingDescriptions; 555da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa DE_LENGTH_OF_ARRAY(vertexInputAttributeDescriptions), // deUint32 vertexAttributeDescriptionCount; 556e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vertexInputAttributeDescriptions, // const VkVertexInputAttributeDescription* pVertexAttributeDescriptions; 557e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 558e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 559e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateInfo = 560e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 561e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // VkStructureType sType; 562e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 563e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkPipelineInputAssemblyStateCreateFlags)0, // VkPipelineInputAssemblyStateCreateFlags flags; 564e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga topology, // VkPrimitiveTopology topology; 565e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FALSE, // VkBool32 primitiveRestartEnable; 566e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 567e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 568e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkViewport viewport = makeViewport( 569e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0.0f, 0.0f, 570e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga static_cast<float>(renderSize.x()), static_cast<float>(renderSize.y()), 571e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0.0f, 1.0f); 572e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 573e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkRect2D scissor = 574e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 575e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeOffset2D(0, 0), 576e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeExtent2D(renderSize.x(), renderSize.y()), 577e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 578e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 579e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkPipelineViewportStateCreateInfo pipelineViewportStateInfo = 580e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 581e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType; 582e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 583e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkPipelineViewportStateCreateFlags)0, // VkPipelineViewportStateCreateFlags flags; 584da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 1u, // deUint32 viewportCount; 585e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga &viewport, // const VkViewport* pViewports; 586da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 1u, // deUint32 scissorCount; 587e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga &scissor, // const VkRect2D* pScissors; 588e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 589e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 590e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkPipelineRasterizationStateCreateInfo pipelineRasterizationStateInfo = 591e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 592e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType; 593e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 594e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkPipelineRasterizationStateCreateFlags)0, // VkPipelineRasterizationStateCreateFlags flags; 595e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FALSE, // VkBool32 depthClampEnable; 596e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FALSE, // VkBool32 rasterizerDiscardEnable; 597e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode; 598e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_CULL_MODE_NONE, // VkCullModeFlags cullMode; 599e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace; 600e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FALSE, // VkBool32 depthBiasEnable; 601e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0.0f, // float depthBiasConstantFactor; 602e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0.0f, // float depthBiasClamp; 603e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0.0f, // float depthBiasSlopeFactor; 604e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1.0f, // float lineWidth; 605e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 606e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 607e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkPipelineMultisampleStateCreateInfo pipelineMultisampleStateInfo = 608e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 609e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // VkStructureType sType; 610e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 611e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkPipelineMultisampleStateCreateFlags)0, // VkPipelineMultisampleStateCreateFlags flags; 612e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits rasterizationSamples; 613e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FALSE, // VkBool32 sampleShadingEnable; 614e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0.0f, // float minSampleShading; 615e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const VkSampleMask* pSampleMask; 616e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FALSE, // VkBool32 alphaToCoverageEnable; 617e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FALSE // VkBool32 alphaToOneEnable; 618e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 619e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 620e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkStencilOpState stencilOpState = makeStencilOpState( 621e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STENCIL_OP_KEEP, // stencil fail 622e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STENCIL_OP_ZERO, // depth & stencil pass 623e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STENCIL_OP_KEEP, // depth only fail 624e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_COMPARE_OP_EQUAL, // compare op 625e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga ~0u, // compare mask 626e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga ~0u, // write mask 627e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u); // reference 628e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 629e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkPipelineDepthStencilStateCreateInfo pipelineDepthStencilStateInfo = 630e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 631e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, // VkStructureType sType; 632e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 633e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkPipelineDepthStencilStateCreateFlags)0, // VkPipelineDepthStencilStateCreateFlags flags; 634e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FALSE, // VkBool32 depthTestEnable; 635e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FALSE, // VkBool32 depthWriteEnable; 636e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_COMPARE_OP_LESS, // VkCompareOp depthCompareOp; 637e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FALSE, // VkBool32 depthBoundsTestEnable; 638e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FALSE, // VkBool32 stencilTestEnable; 639e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga stencilOpState, // VkStencilOpState front; 640e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga stencilOpState, // VkStencilOpState back; 641e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0.0f, // float minDepthBounds; 642e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1.0f, // float maxDepthBounds; 643e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 644e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 645e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkColorComponentFlags colorComponentsAll = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; 646e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkPipelineColorBlendAttachmentState pipelineColorBlendAttachmentState = 647e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 648e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FALSE, // VkBool32 blendEnable; 649e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_BLEND_FACTOR_ONE, // VkBlendFactor srcColorBlendFactor; 650e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstColorBlendFactor; 651e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_BLEND_OP_ADD, // VkBlendOp colorBlendOp; 652e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_BLEND_FACTOR_ONE, // VkBlendFactor srcAlphaBlendFactor; 653e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_BLEND_FACTOR_ZERO, // VkBlendFactor dstAlphaBlendFactor; 654e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_BLEND_OP_ADD, // VkBlendOp alphaBlendOp; 655e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga colorComponentsAll, // VkColorComponentFlags colorWriteMask; 656e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 657e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 658e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkPipelineColorBlendStateCreateInfo pipelineColorBlendStateInfo = 659e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 660e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, // VkStructureType sType; 661e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 662e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkPipelineColorBlendStateCreateFlags)0, // VkPipelineColorBlendStateCreateFlags flags; 663e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_FALSE, // VkBool32 logicOpEnable; 664e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_LOGIC_OP_COPY, // VkLogicOp logicOp; 665e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1u, // deUint32 attachmentCount; 666e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga &pipelineColorBlendAttachmentState, // const VkPipelineColorBlendAttachmentState* pAttachments; 667e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 0.0f, 0.0f, 0.0f, 0.0f }, // float blendConstants[4]; 668e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 669e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 670e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkPipelineShaderStageCreateInfo pShaderStages[] = 671e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 672e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 673e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType; 674e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 675e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkPipelineShaderStageCreateFlags)0, // VkPipelineShaderStageCreateFlags flags; 676e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_SHADER_STAGE_VERTEX_BIT, // VkShaderStageFlagBits stage; 677e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vertexModule, // VkShaderModule module; 678e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga "main", // const char* pName; 679e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const VkSpecializationInfo* pSpecializationInfo; 680e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }, 681e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 682e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType; 683e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 684e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkPipelineShaderStageCreateFlags)0, // VkPipelineShaderStageCreateFlags flags; 685e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_SHADER_STAGE_FRAGMENT_BIT, // VkShaderStageFlagBits stage; 686e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga fragmentModule, // VkShaderModule module; 687e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga "main", // const char* pName; 688e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const VkSpecializationInfo* pSpecializationInfo; 689e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 690e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 691e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 692e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkGraphicsPipelineCreateInfo graphicsPipelineInfo = 693e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 694e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType; 695e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 696e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u, // VkPipelineCreateFlags flags; 697e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_LENGTH_OF_ARRAY(pShaderStages), // deUint32 stageCount; 698e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga pShaderStages, // const VkPipelineShaderStageCreateInfo* pStages; 699e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga &vertexInputStateInfo, // const VkPipelineVertexInputStateCreateInfo* pVertexInputState; 700e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga &pipelineInputAssemblyStateInfo, // const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState; 701e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const VkPipelineTessellationStateCreateInfo* pTessellationState; 702e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga &pipelineViewportStateInfo, // const VkPipelineViewportStateCreateInfo* pViewportState; 703e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga &pipelineRasterizationStateInfo, // const VkPipelineRasterizationStateCreateInfo* pRasterizationState; 704e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga &pipelineMultisampleStateInfo, // const VkPipelineMultisampleStateCreateInfo* pMultisampleState; 705e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga &pipelineDepthStencilStateInfo, // const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState; 706e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga &pipelineColorBlendStateInfo, // const VkPipelineColorBlendStateCreateInfo* pColorBlendState; 707e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const VkPipelineDynamicStateCreateInfo* pDynamicState; 708e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga pipelineLayout, // VkPipelineLayout layout; 709e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga renderPass, // VkRenderPass renderPass; 710e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga subpass, // deUint32 subpass; 711e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // VkPipeline basePipelineHandle; 712e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0, // deInt32 basePipelineIndex; 713e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 714e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 715e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return createGraphicsPipeline(vk, device, DE_NULL, &graphicsPipelineInfo); 716e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 717e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 718e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMove<VkPipeline> makeComputePipeline (const DeviceInterface& vk, 719e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkDevice device, 720e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkPipelineLayout pipelineLayout, 721e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkShaderModule shaderModule, 722e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkSpecializationInfo* specInfo) 723e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 724e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkPipelineShaderStageCreateInfo shaderStageInfo = 725e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 726e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, // VkStructureType sType; 727e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 728e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkPipelineShaderStageCreateFlags)0, // VkPipelineShaderStageCreateFlags flags; 729e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_SHADER_STAGE_COMPUTE_BIT, // VkShaderStageFlagBits stage; 730e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga shaderModule, // VkShaderModule module; 731e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga "main", // const char* pName; 732e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga specInfo, // const VkSpecializationInfo* pSpecializationInfo; 733e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 734e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkComputePipelineCreateInfo pipelineInfo = 735e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 736e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, // VkStructureType sType; 737e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 738e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkPipelineCreateFlags)0, // VkPipelineCreateFlags flags; 739e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga shaderStageInfo, // VkPipelineShaderStageCreateInfo stage; 740e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga pipelineLayout, // VkPipelineLayout layout; 741e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // VkPipeline basePipelineHandle; 742e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0, // deInt32 basePipelineIndex; 743e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 744e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return createComputePipeline(vk, device, DE_NULL , &pipelineInfo); 745e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 746e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 747e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMove<VkRenderPass> makeRenderPass (const DeviceInterface& vk, 748e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkDevice device, 749e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkFormat colorFormat, 750e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const deUint32 numLayers) 751e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 752e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkAttachmentDescription colorAttachmentDescription = 753e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 754e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkAttachmentDescriptionFlags)0, // VkAttachmentDescriptionFlags flags; 755e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga colorFormat, // VkFormat format; 756e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_SAMPLE_COUNT_1_BIT, // VkSampleCountFlagBits samples; 757e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_ATTACHMENT_LOAD_OP_CLEAR, // VkAttachmentLoadOp loadOp; 758e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_ATTACHMENT_STORE_OP_STORE, // VkAttachmentStoreOp storeOp; 759e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_ATTACHMENT_LOAD_OP_DONT_CARE, // VkAttachmentLoadOp stencilLoadOp; 760e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_ATTACHMENT_STORE_OP_DONT_CARE, // VkAttachmentStoreOp stencilStoreOp; 761e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout initialLayout; 762e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, // VkImageLayout finalLayout; 763e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 764e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vector<VkAttachmentDescription> attachmentDescriptions(numLayers, colorAttachmentDescription); 765e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 766e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Create a subpass for each attachment (each attachement is a layer of an arrayed image). 767e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vector<VkAttachmentReference> colorAttachmentReferences (numLayers); 768e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vector<VkSubpassDescription> subpasses; 769e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 770e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Ordering here must match the framebuffer attachments 771e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga for (deUint32 i = 0; i < numLayers; ++i) 772e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 773e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkAttachmentReference attachmentRef = 774e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 775e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga i, // deUint32 attachment; 776e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL // VkImageLayout layout; 777e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 778e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 779e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga colorAttachmentReferences[i] = attachmentRef; 780e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 781e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkSubpassDescription subpassDescription = 782e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 783e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkSubpassDescriptionFlags)0, // VkSubpassDescriptionFlags flags; 784e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_PIPELINE_BIND_POINT_GRAPHICS, // VkPipelineBindPoint pipelineBindPoint; 785e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u, // deUint32 inputAttachmentCount; 786e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const VkAttachmentReference* pInputAttachments; 787e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1u, // deUint32 colorAttachmentCount; 788e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga &colorAttachmentReferences[i], // const VkAttachmentReference* pColorAttachments; 789e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const VkAttachmentReference* pResolveAttachments; 790e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const VkAttachmentReference* pDepthStencilAttachment; 791e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u, // deUint32 preserveAttachmentCount; 792e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL // const deUint32* pPreserveAttachments; 793e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 794e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga subpasses.push_back(subpassDescription); 795e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 796e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 797e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkRenderPassCreateInfo renderPassInfo = 798e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 799e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, // VkStructureType sType; 800e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 801e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkRenderPassCreateFlags)0, // VkRenderPassCreateFlags flags; 802e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga static_cast<deUint32>(attachmentDescriptions.size()), // deUint32 attachmentCount; 803e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga &attachmentDescriptions[0], // const VkAttachmentDescription* pAttachments; 804e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga static_cast<deUint32>(subpasses.size()), // deUint32 subpassCount; 805e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga &subpasses[0], // const VkSubpassDescription* pSubpasses; 806e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u, // deUint32 dependencyCount; 807e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL // const VkSubpassDependency* pDependencies; 808e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 809e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 810e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return createRenderPass(vk, device, &renderPassInfo); 811e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 812e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 813e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMove<VkFramebuffer> makeFramebuffer (const DeviceInterface& vk, 814e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkDevice device, 815e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkRenderPass renderPass, 816e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const deUint32 attachmentCount, 817e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageView* pAttachments, 818e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const IVec2 size) 819e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 820e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkFramebufferCreateInfo framebufferInfo = 821e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 822e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, 823e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, 824e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkFramebufferCreateFlags)0, 825e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga renderPass, 826e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga attachmentCount, 827e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga pAttachments, 828e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga static_cast<deUint32>(size.x()), 829e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga static_cast<deUint32>(size.y()), 830e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1u, 831e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 832e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 833e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return createFramebuffer(vk, device, &framebufferInfo); 834e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 835e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 836e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMove<VkCommandBuffer> makeCommandBuffer (const DeviceInterface& vk, const VkDevice device, const VkCommandPool commandPool) 837e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 838e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return allocateCommandBuffer(vk, device, commandPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY); 839e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 840e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 841e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMovePtr<Allocation> bindImage (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkImage image, const MemoryRequirement requirement) 842e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 843e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga MovePtr<Allocation> alloc = allocator.allocate(getImageMemoryRequirements(vk, device, image), requirement); 844e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_CHECK(vk.bindImageMemory(device, image, alloc->getMemory(), alloc->getOffset())); 845e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return alloc; 846e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 847e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 848e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaMovePtr<Allocation> bindBuffer (const DeviceInterface& vk, const VkDevice device, Allocator& allocator, const VkBuffer buffer, const MemoryRequirement requirement) 849e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 850e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga MovePtr<Allocation> alloc(allocator.allocate(getBufferMemoryRequirements(vk, device, buffer), requirement)); 851e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_CHECK(vk.bindBufferMemory(device, buffer, alloc->getMemory(), alloc->getOffset())); 852e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return alloc; 853e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 854e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 855e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavector<Vec4> genVertexData (const CaseDef& caseDef) 856e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 857e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vector<Vec4> vectorData; 858e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const bool isIntegerFormat = isUintFormat(caseDef.viewFormat) || isIntFormat(caseDef.viewFormat); 859e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 860e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga for (deUint32 z = 0; z < caseDef.numLayers; z++) 861e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 862e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const deUint32 colorIdx = z % COLOR_TABLE_SIZE; 863e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const Vec4 color = isIntegerFormat ? COLOR_TABLE_INT[colorIdx].cast<float>() : COLOR_TABLE_FLOAT[colorIdx]; 864e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 865e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vectorData.push_back(Vec4(-1.0f, -1.0f, 0.0f, 1.0f)); 866e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vectorData.push_back(color); 867e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vectorData.push_back(Vec4(-1.0f, 1.0f, 0.0f, 1.0f)); 868e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vectorData.push_back(color); 869e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vectorData.push_back(Vec4( 1.0f, -1.0f, 0.0f, 1.0f)); 870e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vectorData.push_back(color); 871e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vectorData.push_back(Vec4( 1.0f, 1.0f, 0.0f, 1.0f)); 872e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vectorData.push_back(color); 873e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 874e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 875e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return vectorData; 876e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 877e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 878e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid generateExpectedImage(const tcu::PixelBufferAccess& image, const CaseDef& caseDef) 879e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 880e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const tcu::TextureChannelClass channelClass = tcu::getTextureChannelClass(image.getFormat().type); 881e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const bool isIntegerFormat = channelClass == tcu::TEXTURECHANNELCLASS_SIGNED_INTEGER || channelClass == tcu::TEXTURECHANNELCLASS_UNSIGNED_INTEGER; 882e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const IVec2 size = caseDef.size.swizzle(0, 1); 883e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 884e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga for (int z = 0; z < static_cast<int>(caseDef.numLayers); z++) 885e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 886e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const deUint32 colorIdx = z % COLOR_TABLE_SIZE; 887e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga for (int y = 0; y < size.y(); y++) 888e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga for (int x = 0; x < size.x(); x++) 889e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 890e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (isIntegerFormat) 891e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga image.setPixel(COLOR_TABLE_INT[colorIdx], x, y, z); 892e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga else 893e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga image.setPixel(COLOR_TABLE_FLOAT[colorIdx], x, y, z); 894e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 895e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 896e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 897e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 898e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral QuirogaVkImageUsageFlags getImageUsageForTestCase (const CaseDef& caseDef) 899e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 900e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkImageUsageFlags flags = 0u; 901e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 902e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga switch (caseDef.upload) 903e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 904e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case UPLOAD_CLEAR: 905e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga flags |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; 906e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 907e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case UPLOAD_DRAW: 908e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga flags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 909e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 910e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case UPLOAD_STORE: 911e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga flags |= VK_IMAGE_USAGE_STORAGE_BIT; 912e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 913e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case UPLOAD_COPY: 914e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga flags |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; 915e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 916e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga default: 917e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_ASSERT("Invalid upload method"); 918e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 919e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 920e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 921e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga switch (caseDef.download) 922e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 923e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case DOWNLOAD_TEXTURE: 924e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga flags |= VK_IMAGE_USAGE_SAMPLED_BIT; 925e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 926e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case DOWNLOAD_LOAD: 927e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga flags |= VK_IMAGE_USAGE_STORAGE_BIT; 928e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 929e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case DOWNLOAD_COPY: 930e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga flags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; 931e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 932e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga default: 933e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_ASSERT("Invalid download method"); 934e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 935e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 936e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 937e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // We can only create a view for the image if it is going to be used for any of these usages, 938e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // so let's make sure that we have at least one of them. 939e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkImageUsageFlags viewRequiredFlags = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 940e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (!(flags & viewRequiredFlags)) 941e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga flags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; 942e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 943e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return flags; 944e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 945e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 946e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga// Executes a combination of upload/download methods 947e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogaclass UploadDownloadExecutor 948e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 949e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogapublic: 950e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga UploadDownloadExecutor(Context &context, const CaseDef& caseSpec) : 951e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_caseDef(caseSpec), 952e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_haveMaintenance2(de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_maintenance2")), 953e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk(context.getDeviceInterface()), 954e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_device(context.getDevice()), 955e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_queue(context.getUniversalQueue()), 956e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_queueFamilyIndex(context.getUniversalQueueFamilyIndex()), 957e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_allocator(context.getDefaultAllocator()) 958e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 959e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 960e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 961e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga void run(Context& context, VkBuffer buffer); 962e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 963e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogaprivate: 964e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga void uploadClear(Context& context); 965e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga void uploadStore(Context& context); 966e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga void uploadCopy(Context& context); 967e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga void uploadDraw(Context& context); 968e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga void downloadCopy(Context& context, VkBuffer buffer); 969e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga void downloadTexture(Context& context, VkBuffer buffer); 970e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga void downloadLoad(Context& context, VkBuffer buffer); 971e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 972e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga void copyImageToBuffer(VkImage image, 973e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkBuffer buffer, 974e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const IVec3 size, 975e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkAccessFlags srcAccessMask, 976e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageLayout oldLayout, 977e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const deUint32 numLayers); 978e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 979e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const CaseDef& m_caseDef; 980e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 981e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga bool m_haveMaintenance2; 982e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 983e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const DeviceInterface& m_vk; 984e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkDevice m_device; 985e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkQueue m_queue; 986e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const deUint32 m_queueFamilyIndex; 987e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Allocator& m_allocator; 988e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 989e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkCommandPool> m_cmdPool; 990e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkCommandBuffer> m_cmdBuffer; 991e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 992e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga bool m_imageIsIntegerFormat; 993e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga bool m_viewIsIntegerFormat; 994e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 995e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Target image for upload paths 996e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkImage> m_image; 997e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga MovePtr<Allocation> m_imageAlloc; 998e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 999e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Upload copy 1000e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga struct 1001e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1002e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkBuffer> colorBuffer; 1003e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkDeviceSize colorBufferSize; 1004e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga MovePtr<Allocation> colorBufferAlloc; 1005e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } m_uCopy; 1006e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1007e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Upload draw 1008e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga struct 1009e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1010e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkBuffer> vertexBuffer; 1011e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga MovePtr<Allocation> vertexBufferAlloc; 1012e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkPipelineLayout> pipelineLayout; 1013e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkRenderPass> renderPass; 1014e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkShaderModule> vertexModule; 1015e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkShaderModule> fragmentModule; 1016e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vector<SharedPtrVkImageView> attachments; 1017e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vector<VkImageView> attachmentHandles; 1018e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vector<SharedPtrVkPipeline> pipelines; 1019e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkFramebuffer> framebuffer; 1020e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } m_uDraw; 1021e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1022e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Upload store 1023e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga struct 1024e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1025e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkDescriptorPool> descriptorPool; 1026e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkPipelineLayout> pipelineLayout; 1027e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkDescriptorSetLayout> descriptorSetLayout; 1028e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkDescriptorSet> descriptorSet; 1029e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkDescriptorImageInfo imageDescriptorInfo; 1030e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkShaderModule> computeModule; 1031e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkPipeline> computePipeline; 1032e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkImageView> imageView; 1033e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } m_uStore; 1034e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1035e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Download load 1036e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga struct 1037e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1038e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkDescriptorPool> descriptorPool; 1039e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkPipelineLayout> pipelineLayout; 1040e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkDescriptorSetLayout> descriptorSetLayout; 1041e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkDescriptorSet> descriptorSet; 1042e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkShaderModule> computeModule; 1043e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkPipeline> computePipeline; 1044e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkImageView> inImageView; 1045e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkDescriptorImageInfo inImageDescriptorInfo; 1046e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkImage> outImage; 1047e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkImageView> outImageView; 1048e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga MovePtr<Allocation> outImageAlloc; 1049e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkDescriptorImageInfo outImageDescriptorInfo; 1050e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } m_dLoad; 1051e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1052e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Download texture 1053e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga struct 1054e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1055e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkDescriptorPool> descriptorPool; 1056e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkPipelineLayout> pipelineLayout; 1057e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkDescriptorSetLayout> descriptorSetLayout; 1058e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkDescriptorSet> descriptorSet; 1059e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkShaderModule> computeModule; 1060e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkPipeline> computePipeline; 1061e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkImageView> inImageView; 1062e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkDescriptorImageInfo inImageDescriptorInfo; 1063e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkSampler> sampler; 1064e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkImage> outImage; 1065e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkImageView> outImageView; 1066e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga MovePtr<Allocation> outImageAlloc; 1067e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkDescriptorImageInfo outImageDescriptorInfo; 1068e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } m_dTex; 1069e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1070e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkImageLayout m_imageLayoutAfterUpload; 1071e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkAccessFlagBits m_imageUploadAccessMask; 1072e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga}; 1073e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1074e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::run(Context& context, VkBuffer buffer) 1075e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 1076e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_imageIsIntegerFormat = isUintFormat(m_caseDef.imageFormat) || isIntFormat(m_caseDef.imageFormat); 1077e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_viewIsIntegerFormat = isUintFormat(m_caseDef.viewFormat) || isIntFormat(m_caseDef.viewFormat); 1078e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1079e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_cmdPool = createCommandPool(m_vk, m_device, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, m_queueFamilyIndex); 1080e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_cmdBuffer = makeCommandBuffer(m_vk, m_device, *m_cmdPool); 1081e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga beginCommandBuffer(m_vk, *m_cmdBuffer); 1082e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1083e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageUsageFlags imageUsage = getImageUsageForTestCase(m_caseDef); 1084e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageCreateFlags imageFlags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | (m_haveMaintenance2 ? VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR : 0); 108516b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga m_image = makeImage(m_vk, m_device, imageFlags, getImageType(m_caseDef.imageType), m_caseDef.imageFormat, m_caseDef.viewFormat, 108616b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga m_caseDef.isFormatListTest, m_caseDef.size, 1u, m_caseDef.numLayers, imageUsage); 1087e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_imageAlloc = bindImage(m_vk, m_device, m_allocator, *m_image, MemoryRequirement::Any); 1088e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1089e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga switch (m_caseDef.upload) 1090e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1091e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case UPLOAD_DRAW: 1092e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga uploadDraw(context); 1093e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 1094e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case UPLOAD_STORE: 1095e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga uploadStore(context); 1096e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 1097e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case UPLOAD_CLEAR: 1098e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga uploadClear(context); 1099e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 1100e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case UPLOAD_COPY: 1101e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga uploadCopy(context); 1102e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 1103e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga default: 1104e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_ASSERT("Unsupported upload method"); 1105e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1106e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1107e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga switch (m_caseDef.download) 1108e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1109e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case DOWNLOAD_COPY: 1110e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga downloadCopy(context, buffer); 1111e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 1112e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case DOWNLOAD_LOAD: 1113e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga downloadLoad(context, buffer); 1114e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 1115e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case DOWNLOAD_TEXTURE: 1116e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga downloadTexture(context, buffer); 1117e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 1118e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga default: 1119e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_ASSERT("Unsupported download method"); 1120e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1121e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1122e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_CHECK(m_vk.endCommandBuffer(*m_cmdBuffer)); 1123e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga submitCommandsAndWait(m_vk, m_device, m_queue, *m_cmdBuffer); 1124e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 1125e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1126e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::uploadClear(Context& context) 1127e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 1128e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (void) context; 1129e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1130e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkImageLayout requiredImageLayout = VK_IMAGE_LAYOUT_GENERAL; 1131e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1132e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageSubresourceRange subresourceRange = makeColorSubresourceRange(0, m_caseDef.numLayers); 1133e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageMemoryBarrier imageInitBarrier = 1134e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1135e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; 1136e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 1137e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u, // VkAccessFlags srcAccessMask; 1138e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags dstAcessMask; 1139e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout; 1140e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga requiredImageLayout, // VkImageLayout newLayout; 1141e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; 1142e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex; 1143e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *m_image, // VkImage image; 1144e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga subresourceRange // VkImageSubresourceRange subresourceRange; 1145e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1146e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1147e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 1148e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u, DE_NULL, 0u, DE_NULL, 1u, &imageInitBarrier); 1149e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1150e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga for (deUint32 layer = 0; layer < m_caseDef.numLayers; layer++) 1151e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1152e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageSubresourceRange layerSubresourceRange = makeColorSubresourceRange(layer, 1u); 1153e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const deUint32 colorIdx = layer % COLOR_TABLE_SIZE; 1154e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkClearColorValue clearColor = m_imageIsIntegerFormat ? REFERENCE_CLEAR_COLOR_INT[colorIdx].color : REFERENCE_CLEAR_COLOR_FLOAT[colorIdx].color; 1155e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdClearColorImage(*m_cmdBuffer, *m_image, requiredImageLayout, &clearColor, 1u, &layerSubresourceRange); 1156e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1157e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1158e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_imageLayoutAfterUpload = requiredImageLayout; 1159e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_imageUploadAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; 1160e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 1161e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1162e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::uploadStore(Context& context) 1163e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 1164e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const vk::VkImageViewUsageCreateInfoKHR viewUsageCreateInfo = { 1165e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR, // VkStructureType sType 1166e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext 1167e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_USAGE_STORAGE_BIT, // VkImageUsageFlags usage; 1168e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1169e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uStore.imageView = makeImageView(m_vk, m_device, *m_image, getImageViewType(m_caseDef.imageType), m_caseDef.viewFormat, 1170e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeColorSubresourceRange(0, m_caseDef.numLayers), m_haveMaintenance2 ? &viewUsageCreateInfo : DE_NULL); 1171e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1172e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Setup compute pipeline 1173e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uStore.descriptorPool = DescriptorPoolBuilder() 1174e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) 1175e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .build(m_vk, m_device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u); 1176e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1177e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uStore.descriptorSetLayout = DescriptorSetLayoutBuilder() 1178e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT) 1179e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .build(m_vk, m_device); 1180e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1181e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uStore.pipelineLayout = makePipelineLayout(m_vk, m_device, *m_uStore.descriptorSetLayout); 1182e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uStore.descriptorSet = makeDescriptorSet(m_vk, m_device, *m_uStore.descriptorPool, *m_uStore.descriptorSetLayout); 1183e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uStore.imageDescriptorInfo = makeDescriptorImageInfo(DE_NULL, *m_uStore.imageView, VK_IMAGE_LAYOUT_GENERAL); 1184e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uStore.computeModule = createShaderModule(m_vk, m_device, context.getBinaryCollection().get("uploadStoreComp"), 0); 1185e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uStore.computePipeline = makeComputePipeline(m_vk, m_device, *m_uStore.pipelineLayout, *m_uStore.computeModule, DE_NULL); 1186e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1187e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DescriptorSetUpdateBuilder() 1188e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .writeSingle(*m_uStore.descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &m_uStore.imageDescriptorInfo) 1189e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .update(m_vk, m_device); 1190e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1191e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Transition storage image for shader access (imageStore) 1192e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkImageLayout requiredImageLayout = VK_IMAGE_LAYOUT_GENERAL; 1193e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageMemoryBarrier imageBarrier = 1194e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1195e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; 1196e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 1197e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkAccessFlags)0, // VkAccessFlags srcAccessMask; 1198e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkAccessFlags)VK_ACCESS_SHADER_WRITE_BIT, // VkAccessFlags dstAccessMask; 1199e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout; 1200e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga requiredImageLayout, // VkImageLayout newLayout; 1201e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; 1202e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex; 1203e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *m_image, // VkImage image; 1204e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeColorSubresourceRange(0, m_caseDef.numLayers), // VkImageSubresourceRange subresourceRange; 1205e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1206e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1207e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 1208e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u, DE_NULL, 0u, DE_NULL, 1u, &imageBarrier); 1209e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1210e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Dispatch 1211e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_uStore.computePipeline); 1212e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdBindDescriptorSets(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_uStore.pipelineLayout, 0u, 1u, &m_uStore.descriptorSet.get(), 0u, DE_NULL); 1213e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdDispatch(*m_cmdBuffer, m_caseDef.size.x(), m_caseDef.size.y(), m_caseDef.numLayers); 1214e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1215e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_imageLayoutAfterUpload = requiredImageLayout; 1216e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_imageUploadAccessMask = VK_ACCESS_SHADER_WRITE_BIT; 1217e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 1218e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1219e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::uploadCopy(Context& context) 1220e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 1221e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (void) context; 1222e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1223e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Create a host-mappable buffer with the color data to upload 1224e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkDeviceSize pixelSize = tcu::getPixelSize(mapVkFormat(m_caseDef.imageFormat)); 1225e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkDeviceSize layerSize = m_caseDef.size.x() * m_caseDef.size.y() * m_caseDef.size.z() * pixelSize; 1226e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1227e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uCopy.colorBufferSize = layerSize * m_caseDef.numLayers; 1228e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uCopy.colorBuffer = makeBuffer(m_vk, m_device, m_uCopy.colorBufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT); 1229e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uCopy.colorBufferAlloc = bindBuffer(m_vk, m_device, m_allocator, *m_uCopy.colorBuffer, MemoryRequirement::HostVisible); 1230e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1231e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Fill color buffer 1232e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const tcu::TextureFormat tcuFormat = mapVkFormat(m_caseDef.imageFormat); 1233e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkDeviceSize layerOffset = 0ull; 1234e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga for (deUint32 layer = 0; layer < m_caseDef.numLayers; layer++) 1235e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1236e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga tcu::PixelBufferAccess imageAccess = tcu::PixelBufferAccess(tcuFormat, m_caseDef.size.x(), m_caseDef.size.y(), 1u, (deUint8*) m_uCopy.colorBufferAlloc->getHostPtr() + layerOffset); 1237e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const deUint32 colorIdx = layer % COLOR_TABLE_SIZE; 1238e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (m_imageIsIntegerFormat) 1239e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga tcu::clear(imageAccess, COLOR_TABLE_INT[colorIdx]); 1240e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga else 1241e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga tcu::clear(imageAccess, COLOR_TABLE_FLOAT[colorIdx]); 1242e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga layerOffset += layerSize; 1243e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1244e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1245e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga flushMappedMemoryRange(m_vk, m_device, m_uCopy.colorBufferAlloc->getMemory(), m_uCopy.colorBufferAlloc->getOffset(), VK_WHOLE_SIZE); 1246e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1247e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Prepare buffer and image for copy 1248e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkBufferMemoryBarrier bufferInitBarrier = 1249e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1250e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType; 1251e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 1252e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_ACCESS_HOST_WRITE_BIT, // VkAccessFlags srcAccessMask; 1253e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags dstAccessMask; 1254da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; 1255da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex; 1256e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *m_uCopy.colorBuffer, // VkBuffer buffer; 1257e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0ull, // VkDeviceSize offset; 1258e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_WHOLE_SIZE, // VkDeviceSize size; 1259e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1260e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1261e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageMemoryBarrier imageInitBarrier = 1262e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1263e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; 1264e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 1265e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u, // VkAccessFlags outputMask; 1266e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags inputMask; 1267e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout; 1268e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout newLayout; 1269e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; 1270e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex; 1271e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *m_image, // VkImage image; 1272e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeColorSubresourceRange(0, m_caseDef.numLayers) // VkImageSubresourceRange subresourceRange; 1273e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1274e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1275e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 1276e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u, DE_NULL, 1u, &bufferInitBarrier, 1u, &imageInitBarrier); 1277e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1278e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Copy buffer to image 1279e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageSubresourceLayers subresource = 1280e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1281e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask; 1282da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 0u, // deUint32 mipLevel; 1283da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 0u, // deUint32 baseArrayLayer; 1284da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa m_caseDef.numLayers, // deUint32 layerCount; 1285e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1286e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1287e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkBufferImageCopy region = 1288e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1289e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0ull, // VkDeviceSize bufferOffset; 1290da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 0u, // deUint32 bufferRowLength; 1291da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 0u, // deUint32 bufferImageHeight; 1292e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga subresource, // VkImageSubresourceLayers imageSubresource; 1293e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeOffset3D(0, 0, 0), // VkOffset3D imageOffset; 1294e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeExtent3D(m_caseDef.size), // VkExtent3D imageExtent; 1295e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1296e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1297e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdCopyBufferToImage(*m_cmdBuffer, *m_uCopy.colorBuffer, *m_image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1u, ®ion); 1298e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1299e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageMemoryBarrier imagePostInitBarrier = 1300e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1301e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; 1302e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 1303e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags outputMask; 1304e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags inputMask; 1305e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout oldLayout; 1306e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // VkImageLayout newLayout; 1307e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; 1308e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex; 1309e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *m_image, // VkImage image; 1310e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeColorSubresourceRange(0, m_caseDef.numLayers) // VkImageSubresourceRange subresourceRange; 1311e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1312e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1313e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 1314e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u, DE_NULL, 0u, DE_NULL, 1u, &imagePostInitBarrier); 1315e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1316e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_imageLayoutAfterUpload = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; 1317e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_imageUploadAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; 1318e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 1319e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1320e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::uploadDraw(Context& context) 1321e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 1322e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Create vertex buffer 1323e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1324e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const vector<Vec4> vertices = genVertexData(m_caseDef); 1325e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkDeviceSize vertexBufferSize = vertices.size() * sizeof(Vec4); 1326e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1327e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uDraw.vertexBuffer = makeBuffer(m_vk, m_device, vertexBufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT); 1328e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uDraw.vertexBufferAlloc = bindBuffer(m_vk, m_device, m_allocator, *m_uDraw.vertexBuffer, MemoryRequirement::HostVisible); 1329e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga deMemcpy(m_uDraw.vertexBufferAlloc->getHostPtr(), &vertices[0], static_cast<std::size_t>(vertexBufferSize)); 1330e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga flushMappedMemoryRange(m_vk, m_device, m_uDraw.vertexBufferAlloc->getMemory(), m_uDraw.vertexBufferAlloc->getOffset(), vertexBufferSize); 1331e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1332e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1333e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Create attachments and pipelines for each image layer 1334e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uDraw.pipelineLayout = makePipelineLayout(m_vk, m_device); 1335e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uDraw.renderPass = makeRenderPass(m_vk, m_device, m_caseDef.viewFormat, m_caseDef.numLayers); 1336e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uDraw.vertexModule = createShaderModule(m_vk, m_device, context.getBinaryCollection().get("uploadDrawVert"), 0u); 1337e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uDraw.fragmentModule = createShaderModule(m_vk, m_device, context.getBinaryCollection().get("uploadDrawFrag"), 0u); 1338e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1339e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga for (deUint32 subpassNdx = 0; subpassNdx < m_caseDef.numLayers; ++subpassNdx) 1340e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1341e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const vk::VkImageViewUsageCreateInfoKHR viewUsageCreateInfo = { 1342e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR, // VkStructureType sType 1343e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext 1344e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, // VkImageUsageFlags usage; 1345e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1346e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Move<VkImageView> imageView = makeImageView(m_vk, m_device, *m_image, getImageViewType(m_caseDef.imageType), m_caseDef.viewFormat, 1347e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeColorSubresourceRange(subpassNdx, 1), m_haveMaintenance2 ? &viewUsageCreateInfo : DE_NULL); 1348e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uDraw.attachmentHandles.push_back(*imageView); 1349e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uDraw.attachments.push_back(makeSharedPtr(imageView)); 1350e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uDraw.pipelines.push_back(makeSharedPtr(makeGraphicsPipeline(m_vk, m_device, *m_uDraw.pipelineLayout, *m_uDraw.renderPass, *m_uDraw.vertexModule, *m_uDraw.fragmentModule, 1351e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_caseDef.size.swizzle(0, 1), VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, subpassNdx))); 1352e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1353e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1354e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Create framebuffer 1355e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_uDraw.framebuffer = makeFramebuffer(m_vk, m_device, *m_uDraw.renderPass, static_cast<deUint32>(m_uDraw.attachmentHandles.size()), &m_uDraw.attachmentHandles[0], m_caseDef.size.swizzle(0, 1)); 1356e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1357e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Create command buffer 1358e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1359e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1360e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vector<VkClearValue> clearValues (m_caseDef.numLayers, m_viewIsIntegerFormat ? REFERENCE_CLEAR_COLOR_INT[0] : REFERENCE_CLEAR_COLOR_FLOAT[0]); 1361e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1362e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkRect2D renderArea = 1363e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1364e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeOffset2D(0, 0), 1365e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeExtent2D(m_caseDef.size.x(), m_caseDef.size.y()), 1366e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1367e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1368e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkRenderPassBeginInfo renderPassBeginInfo = 1369e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1370e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, // VkStructureType sType; 1371e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 1372e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *m_uDraw.renderPass, // VkRenderPass renderPass; 1373e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *m_uDraw.framebuffer, // VkFramebuffer framebuffer; 1374e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga renderArea, // VkRect2D renderArea; 1375da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa static_cast<deUint32>(clearValues.size()), // deUint32 clearValueCount; 1376e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga &clearValues[0], // const VkClearValue* pClearValues; 1377e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1378e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1379e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdBeginRenderPass(*m_cmdBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); 1380e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1381e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1382e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Render 1383e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkDeviceSize vertexDataPerDraw = 4 * 2 * sizeof(Vec4); 1384e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkDeviceSize vertexBufferOffset = 0ull; 1385e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga for (deUint32 subpassNdx = 0; subpassNdx < m_caseDef.numLayers; ++subpassNdx) 1386e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1387e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (subpassNdx != 0) 1388e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdNextSubpass(*m_cmdBuffer, VK_SUBPASS_CONTENTS_INLINE); 1389e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1390e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, **m_uDraw.pipelines[subpassNdx]); 1391e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1392e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdBindVertexBuffers(*m_cmdBuffer, 0u, 1u, &m_uDraw.vertexBuffer.get(), &vertexBufferOffset); 1393e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdDraw(*m_cmdBuffer, 4u, 1u, 0u, 0u); 1394e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vertexBufferOffset += vertexDataPerDraw; 1395e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1396e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1397e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdEndRenderPass(*m_cmdBuffer); 1398e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1399e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1400e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_imageLayoutAfterUpload = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; 1401e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_imageUploadAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; 1402e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 1403e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1404e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::downloadCopy(Context& context, VkBuffer buffer) 1405e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 1406e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (void) context; 1407e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1408e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga copyImageToBuffer(*m_image, buffer, m_caseDef.size, m_imageUploadAccessMask, m_imageLayoutAfterUpload, m_caseDef.numLayers); 1409e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 1410e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1411e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::downloadTexture(Context& context, VkBuffer buffer) 1412e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 1413e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Create output image with download result 1414e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageUsageFlags usageFlags = VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; 141516b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga m_dTex.outImage = makeImage(m_vk, m_device, 0u, VK_IMAGE_TYPE_2D, m_caseDef.viewFormat, m_caseDef.viewFormat, false, m_caseDef.size, 1u, m_caseDef.numLayers, usageFlags); 1416e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dTex.outImageAlloc = bindImage(m_vk, m_device, m_allocator, *m_dTex.outImage, MemoryRequirement::Any); 1417e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dTex.outImageView = makeImageView(m_vk, m_device, *m_dTex.outImage, getImageViewType(m_caseDef.imageType), m_caseDef.viewFormat, makeColorSubresourceRange(0, m_caseDef.numLayers)); 1418e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1419e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const vk::VkImageViewUsageCreateInfoKHR viewUsageCreateInfo = { 1420e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR, // VkStructureType sType 1421e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext 1422e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_USAGE_SAMPLED_BIT, // VkImageUsageFlags usage; 1423e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1424e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dTex.inImageView = makeImageView(m_vk, m_device, *m_image, getImageViewType(m_caseDef.imageType), m_caseDef.viewFormat, 1425e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeColorSubresourceRange(0, m_caseDef.numLayers), m_haveMaintenance2 ? &viewUsageCreateInfo : DE_NULL); 1426e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dTex.sampler = makeSampler(m_vk, m_device); 1427e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1428e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Setup compute pipeline 1429e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dTex.descriptorPool = DescriptorPoolBuilder() 1430e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .addType(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) 1431e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) 1432e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .build(m_vk, m_device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u); 1433e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1434e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dTex.descriptorSetLayout = DescriptorSetLayoutBuilder() 1435e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .addSingleSamplerBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_COMPUTE_BIT, &m_dTex.sampler.get()) 1436e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT) 1437e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .build(m_vk, m_device); 1438e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1439e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dTex.pipelineLayout = makePipelineLayout(m_vk, m_device, *m_dTex.descriptorSetLayout); 1440e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dTex.descriptorSet = makeDescriptorSet(m_vk, m_device, *m_dTex.descriptorPool, *m_dTex.descriptorSetLayout); 1441e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dTex.inImageDescriptorInfo = makeDescriptorImageInfo(DE_NULL, *m_dTex.inImageView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); 1442e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dTex.outImageDescriptorInfo = makeDescriptorImageInfo(DE_NULL, *m_dTex.outImageView, VK_IMAGE_LAYOUT_GENERAL); 1443e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dTex.computeModule = createShaderModule(m_vk, m_device, context.getBinaryCollection().get("downloadTextureComp"), 0); 1444e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dTex.computePipeline = makeComputePipeline(m_vk, m_device, *m_dTex.pipelineLayout, *m_dTex.computeModule, DE_NULL); 1445e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1446e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DescriptorSetUpdateBuilder() 1447e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .writeSingle(*m_dTex.descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &m_dTex.inImageDescriptorInfo) 1448e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .writeSingle(*m_dTex.descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &m_dTex.outImageDescriptorInfo) 1449e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .update(m_vk, m_device); 1450e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1451e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Transition images for shader access (texture / imageStore) 1452e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageMemoryBarrier imageBarriers[] = 1453e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1454e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1455e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; 1456e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 1457e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkAccessFlags)m_imageUploadAccessMask, // VkAccessFlags srcAccessMask; 1458e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkAccessFlags)VK_ACCESS_SHADER_READ_BIT, // VkAccessFlags dstAccessMask; 1459e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_imageLayoutAfterUpload, // VkImageLayout oldLayout; 1460e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, // VkImageLayout newLayout; 1461e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; 1462e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex; 1463e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *m_image, // VkImage image; 1464e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeColorSubresourceRange(0, m_caseDef.numLayers), // VkImageSubresourceRange subresourceRange; 1465e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }, 1466e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1467e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; 1468e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 1469e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkAccessFlags)0, // VkAccessFlags srcAccessMask; 1470e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkAccessFlags)VK_ACCESS_SHADER_WRITE_BIT, // VkAccessFlags dstAccessMask; 1471e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout; 1472e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_LAYOUT_GENERAL, // VkImageLayout newLayout; 1473e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; 1474e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex; 1475e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *m_dTex.outImage, // VkImage image; 1476e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeColorSubresourceRange(0, m_caseDef.numLayers), // VkImageSubresourceRange subresourceRange; 1477e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1478e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1479e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1480e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 1481e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u, DE_NULL, 0u, DE_NULL, 2u, imageBarriers); 1482e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1483e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Dispatch 1484e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_dTex.computePipeline); 1485e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdBindDescriptorSets(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_dTex.pipelineLayout, 0u, 1u, &m_dTex.descriptorSet.get(), 0u, DE_NULL); 1486e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdDispatch(*m_cmdBuffer, m_caseDef.size.x(), m_caseDef.size.y(), m_caseDef.numLayers); 1487e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1488e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Copy output image to color buffer 1489e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga copyImageToBuffer(*m_dTex.outImage, buffer, m_caseDef.size, VK_ACCESS_SHADER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL, m_caseDef.numLayers); 1490e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 1491e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1492e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::downloadLoad(Context& context, VkBuffer buffer) 1493e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 1494e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Create output image with download result 1495e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageUsageFlags usageFlags = VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; 149616b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga m_dLoad.outImage = makeImage(m_vk, m_device, 0u, VK_IMAGE_TYPE_2D, m_caseDef.viewFormat, m_caseDef.viewFormat, false, m_caseDef.size, 1u, m_caseDef.numLayers, usageFlags); 1497e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dLoad.outImageAlloc = bindImage(m_vk, m_device, m_allocator, *m_dLoad.outImage, MemoryRequirement::Any); 1498e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dLoad.outImageView = makeImageView(m_vk, m_device, *m_dLoad.outImage, getImageViewType(m_caseDef.imageType), m_caseDef.viewFormat, makeColorSubresourceRange(0, m_caseDef.numLayers)); 1499e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1500e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const vk::VkImageViewUsageCreateInfoKHR viewUsageCreateInfo = { 1501e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR, // VkStructureType sType 1502e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext 1503e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_USAGE_STORAGE_BIT, // VkImageUsageFlags usage; 1504e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1505e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dLoad.inImageView = makeImageView(m_vk, m_device, *m_image, getImageViewType(m_caseDef.imageType), m_caseDef.viewFormat, 1506e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeColorSubresourceRange(0, m_caseDef.numLayers), m_haveMaintenance2 ? &viewUsageCreateInfo : DE_NULL); 1507e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1508e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Setup compute pipeline 1509e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dLoad.descriptorPool = DescriptorPoolBuilder() 1510e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .addType(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2u) 1511e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .build(m_vk, m_device, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT, 1u); 1512e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1513e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dLoad.descriptorSetLayout = DescriptorSetLayoutBuilder() 1514e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT) 1515e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .addSingleBinding(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT) 1516e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .build(m_vk, m_device); 1517e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1518e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dLoad.pipelineLayout = makePipelineLayout(m_vk, m_device, *m_dLoad.descriptorSetLayout); 1519e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dLoad.descriptorSet = makeDescriptorSet(m_vk, m_device, *m_dLoad.descriptorPool, *m_dLoad.descriptorSetLayout); 1520e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dLoad.inImageDescriptorInfo = makeDescriptorImageInfo(DE_NULL, *m_dLoad.inImageView, VK_IMAGE_LAYOUT_GENERAL); 1521e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dLoad.outImageDescriptorInfo = makeDescriptorImageInfo(DE_NULL, *m_dLoad.outImageView, VK_IMAGE_LAYOUT_GENERAL); 1522e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dLoad.computeModule = createShaderModule(m_vk, m_device, context.getBinaryCollection().get("downloadLoadComp"), 0); 1523e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_dLoad.computePipeline = makeComputePipeline(m_vk, m_device, *m_dLoad.pipelineLayout, *m_dLoad.computeModule, DE_NULL); 1524e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1525e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DescriptorSetUpdateBuilder() 1526e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .writeSingle(*m_dLoad.descriptorSet, DescriptorSetUpdateBuilder::Location::binding(0u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &m_dLoad.inImageDescriptorInfo) 1527e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .writeSingle(*m_dLoad.descriptorSet, DescriptorSetUpdateBuilder::Location::binding(1u), VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &m_dLoad.outImageDescriptorInfo) 1528e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga .update(m_vk, m_device); 1529e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1530e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Transition storage images for shader access (imageLoad/Store) 1531e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkImageLayout requiredImageLayout = VK_IMAGE_LAYOUT_GENERAL; 1532e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageMemoryBarrier imageBarriers[] = 1533e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1534e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1535e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; 1536e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 1537e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkAccessFlags)m_imageUploadAccessMask, // VkAccessFlags srcAccessMask; 1538e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkAccessFlags)VK_ACCESS_SHADER_READ_BIT, // VkAccessFlags dstAccessMask; 1539e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_imageLayoutAfterUpload, // VkImageLayout oldLayout; 1540e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga requiredImageLayout, // VkImageLayout newLayout; 1541e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; 1542e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex; 1543e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *m_image, // VkImage image; 1544e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeColorSubresourceRange(0, m_caseDef.numLayers), // VkImageSubresourceRange subresourceRange; 1545e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }, 1546e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1547e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; 1548e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 1549e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkAccessFlags)0, // VkAccessFlags srcAccessMask; 1550e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga (VkAccessFlags)VK_ACCESS_SHADER_WRITE_BIT, // VkAccessFlags dstAccessMask; 1551e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_LAYOUT_UNDEFINED, // VkImageLayout oldLayout; 1552e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga requiredImageLayout, // VkImageLayout newLayout; 1553e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; 1554e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex; 1555e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga *m_dLoad.outImage, // VkImage image; 1556e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeColorSubresourceRange(0, m_caseDef.numLayers), // VkImageSubresourceRange subresourceRange; 1557e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1558e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1559e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1560e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0u, 1561e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u, DE_NULL, 0u, DE_NULL, 2u, imageBarriers); 1562e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1563e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Dispatch 1564e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdBindPipeline(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_dLoad.computePipeline); 1565e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdBindDescriptorSets(*m_cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_dLoad.pipelineLayout, 0u, 1u, &m_dLoad.descriptorSet.get(), 0u, DE_NULL); 1566e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdDispatch(*m_cmdBuffer, m_caseDef.size.x(), m_caseDef.size.y(), m_caseDef.numLayers); 1567e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1568e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Copy output image to color buffer 1569e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga copyImageToBuffer(*m_dLoad.outImage, buffer, m_caseDef.size, VK_ACCESS_SHADER_WRITE_BIT, requiredImageLayout, m_caseDef.numLayers); 1570e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 1571e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1572e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogavoid UploadDownloadExecutor::copyImageToBuffer(VkImage sourceImage, 1573e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkBuffer buffer, 1574e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const IVec3 size, 1575e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkAccessFlags srcAccessMask, 1576e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageLayout oldLayout, 1577e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const deUint32 numLayers) 1578e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 1579e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Copy result to host visible buffer for inspection 1580e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageMemoryBarrier imageBarrier = 1581e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1582e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // VkStructureType sType; 1583e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 1584e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga srcAccessMask, // VkAccessFlags outputMask; 1585e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_ACCESS_TRANSFER_READ_BIT, // VkAccessFlags inputMask; 1586e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga oldLayout, // VkImageLayout oldLayout; 1587e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // VkImageLayout newLayout; 1588e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; 1589e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_QUEUE_FAMILY_IGNORED, // deUint32 destQueueFamilyIndex; 1590e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga sourceImage, // VkImage image; 1591e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeColorSubresourceRange(0, numLayers) // VkImageSubresourceRange subresourceRange; 1592e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1593e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1594e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 1595e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u, DE_NULL, 0u, DE_NULL, 1u, &imageBarrier); 1596e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1597e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkImageSubresourceLayers subresource = 1598e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1599e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_IMAGE_ASPECT_COLOR_BIT, // VkImageAspectFlags aspectMask; 1600da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 0u, // deUint32 mipLevel; 1601da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 0u, // deUint32 baseArrayLayer; 1602da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa numLayers, // deUint32 layerCount; 1603e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1604e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1605e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkBufferImageCopy region = 1606e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1607e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0ull, // VkDeviceSize bufferOffset; 1608da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 0u, // deUint32 bufferRowLength; 1609da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa 0u, // deUint32 bufferImageHeight; 1610e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga subresource, // VkImageSubresourceLayers imageSubresource; 1611e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeOffset3D(0, 0, 0), // VkOffset3D imageOffset; 1612e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga makeExtent3D(size), // VkExtent3D imageExtent; 1613e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1614e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1615e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdCopyImageToBuffer(*m_cmdBuffer, sourceImage, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, buffer, 1u, ®ion); 1616e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1617e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkBufferMemoryBarrier bufferBarrier = 1618e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1619e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, // VkStructureType sType; 1620e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_NULL, // const void* pNext; 1621e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_ACCESS_TRANSFER_WRITE_BIT, // VkAccessFlags srcAccessMask; 1622e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_ACCESS_HOST_READ_BIT, // VkAccessFlags dstAccessMask; 1623da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa VK_QUEUE_FAMILY_IGNORED, // deUint32 srcQueueFamilyIndex; 1624da866d5036b70b27aa8f6181e01c141400be68a6Arkadiusz Sarwa VK_QUEUE_FAMILY_IGNORED, // deUint32 dstQueueFamilyIndex; 1625e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga buffer, // VkBuffer buffer; 1626e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0ull, // VkDeviceSize offset; 1627e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VK_WHOLE_SIZE, // VkDeviceSize size; 1628e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1629e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1630e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga m_vk.cmdPipelineBarrier(*m_cmdBuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0u, 1631e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 0u, DE_NULL, 1u, &bufferBarrier, 0u, DE_NULL); 1632e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 1633e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1634e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogabool isStorageImageExtendedFormat (const VkFormat format) 1635e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 1636e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga switch (format) 1637e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1638e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R32G32_SFLOAT: 1639e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R32G32_SINT: 1640e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R32G32_UINT: 1641e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R16G16B16A16_UNORM: 1642e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R16G16B16A16_SNORM: 1643e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R16G16_SFLOAT: 1644e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R16G16_UNORM: 1645e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R16G16_SNORM: 1646e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R16G16_SINT: 1647e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R16G16_UINT: 1648e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R16_SFLOAT: 1649e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R16_UNORM: 1650e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R16_SNORM: 1651e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R16_SINT: 1652e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R16_UINT: 1653e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R8G8_UNORM: 1654e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R8G8_SNORM: 1655e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R8G8_SINT: 1656e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R8G8_UINT: 1657e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R8_UNORM: 1658e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R8_SNORM: 1659e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R8_SINT: 1660e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case VK_FORMAT_R8_UINT: 1661e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return true; 1662e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1663e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga default: 1664e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return false; 1665e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1666e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 1667e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1668e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogatcu::TestStatus testMutable (Context& context, const CaseDef caseDef) 1669e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 1670e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const DeviceInterface& vk = context.getDeviceInterface(); 1671e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const InstanceInterface& vki = context.getInstanceInterface(); 1672e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkDevice device = context.getDevice(); 1673e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkPhysicalDevice physDevice = context.getPhysicalDevice(); 1674e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga Allocator& allocator = context.getDefaultAllocator(); 1675e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 167616b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga // If this is a VK_KHR_image_format_list test, check that the extension is supported 167716b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga if (caseDef.isFormatListTest && !de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_image_format_list")) 167816b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga TCU_THROW(NotSupportedError, "VK_KHR_image_format_list not supported"); 167916b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga 1680e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Check required features on the format for the required upload/download methods 1681e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkFormatProperties imageFormatProps, viewFormatProps; 1682e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vki.getPhysicalDeviceFormatProperties(physDevice, caseDef.imageFormat, &imageFormatProps); 1683e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga vki.getPhysicalDeviceFormatProperties(physDevice, caseDef.viewFormat, &viewFormatProps); 1684e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1685e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga VkFormatFeatureFlags viewFormatFeatureFlags = 0u; 1686e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga switch (caseDef.upload) 1687e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1688e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case UPLOAD_DRAW: 1689e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga viewFormatFeatureFlags |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT; 1690e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 1691e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case UPLOAD_STORE: 1692e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga viewFormatFeatureFlags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; 1693e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 1694e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga default: 1695e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_ASSERT("Invalid upload method"); 1696e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 1697e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1698e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga switch (caseDef.download) 1699e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1700e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case DOWNLOAD_TEXTURE: 1701e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga viewFormatFeatureFlags |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT; 1702e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // For the texture case we write the samples read to a separate output image with the same view format 1703e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // so we need to check that we can also use the view format for storage 1704e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga viewFormatFeatureFlags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; 1705e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 1706e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga case DOWNLOAD_LOAD: 1707e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga viewFormatFeatureFlags |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; 1708e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 1709e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga default: 1710e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga DE_ASSERT("Invalid download method"); 1711e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga break; 1712e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1713e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1714e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if ((viewFormatFeatureFlags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) && 1715e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga isStorageImageExtendedFormat(caseDef.viewFormat) && 1716e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga !getPhysicalDeviceFeatures(vki, physDevice).shaderStorageImageExtendedFormats) 1717e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1718e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga TCU_THROW(NotSupportedError, "View format requires shaderStorageImageExtended"); 1719e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1720e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1721e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if ((viewFormatProps.optimalTilingFeatures & viewFormatFeatureFlags) != viewFormatFeatureFlags) 1722e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga TCU_THROW(NotSupportedError, "View format doesn't support upload/download method"); 1723e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1724e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // We don't use the base image for anything other than transfer 1725e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // operations so there are no features to check. However, The Vulkan 1726e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // 1.0 spec does not allow us to create an image view with usage that 1727e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // is not supported by the main format. With VK_KHR_maintenance2, we 1728e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // can do this via VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR. 1729e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if ((imageFormatProps.optimalTilingFeatures & viewFormatFeatureFlags) != viewFormatFeatureFlags && 1730e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga !de::contains(context.getDeviceExtensions().begin(), context.getDeviceExtensions().end(), "VK_KHR_maintenance2")) 1731e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1732e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga TCU_THROW(NotSupportedError, "Image format doesn't support upload/download method"); 1733e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1734e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1735e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Create a color buffer for host-inspection of results 1736e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // For the Copy download method, this is the target of the download, for other 1737e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // download methods, pixel data will be copied to this buffer from the download 1738e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // target 1739e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkDeviceSize colorBufferSize = caseDef.size.x() * caseDef.size.y() * caseDef.size.z() * caseDef.numLayers * tcu::getPixelSize(mapVkFormat(caseDef.imageFormat)); 1740e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const Unique<VkBuffer> colorBuffer (makeBuffer(vk, device, colorBufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT)); 1741e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const UniquePtr<Allocation> colorBufferAlloc (bindBuffer(vk, device, allocator, *colorBuffer, MemoryRequirement::HostVisible)); 1742e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga deMemset(colorBufferAlloc->getHostPtr(), 0, static_cast<std::size_t>(colorBufferSize)); 1743e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga flushMappedMemoryRange(vk, device, colorBufferAlloc->getMemory(), colorBufferAlloc->getOffset(), VK_WHOLE_SIZE); 1744e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1745e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Execute the test 1746e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga UploadDownloadExecutor executor(context, caseDef); 1747e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga executor.run(context, *colorBuffer); 1748e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1749e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // Verify results 1750e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1751e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga invalidateMappedMemoryRange(vk, device, colorBufferAlloc->getMemory(), colorBufferAlloc->getOffset(), VK_WHOLE_SIZE); 1752e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1753e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga // For verification purposes, we use the format of the upload to generate the expected image 1754e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const VkFormat format = caseDef.upload == UPLOAD_CLEAR || caseDef.upload == UPLOAD_COPY ? caseDef.imageFormat : caseDef.viewFormat; 1755e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const tcu::TextureFormat tcuFormat = mapVkFormat(format); 1756e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const bool isIntegerFormat = isUintFormat(format) || isIntFormat(format); 1757e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const tcu::ConstPixelBufferAccess resultImage (tcuFormat, caseDef.size.x(), caseDef.size.y(), caseDef.numLayers, colorBufferAlloc->getHostPtr()); 1758e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga tcu::TextureLevel textureLevel (tcuFormat, caseDef.size.x(), caseDef.size.y(), caseDef.numLayers); 1759e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const tcu::PixelBufferAccess expectedImage = textureLevel.getAccess(); 1760e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga generateExpectedImage(expectedImage, caseDef); 1761e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1762e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga bool ok; 1763e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (isIntegerFormat) 1764e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga ok = tcu::intThresholdCompare(context.getTestContext().getLog(), "Image comparison", "", expectedImage, resultImage, tcu::UVec4(1), tcu::COMPARE_LOG_RESULT); 1765e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga else 1766e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga ok = tcu::floatThresholdCompare(context.getTestContext().getLog(), "Image comparison", "", expectedImage, resultImage, tcu::Vec4(0.01f), tcu::COMPARE_LOG_RESULT); 1767e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return ok ? tcu::TestStatus::pass("Pass") : tcu::TestStatus::fail("Fail"); 1768e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1769e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 1770e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1771e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quirogatcu::TestCaseGroup* createImageMutableTests (TestContext& testCtx) 1772e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga{ 1773e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga de::MovePtr<TestCaseGroup> testGroup (new TestCaseGroup(testCtx, "mutable", "Cases with mutable images")); 1774e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga for (int textureNdx = 0; textureNdx < DE_LENGTH_OF_ARRAY(s_textures); ++textureNdx) 1775e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1776e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga const Texture& texture = s_textures[textureNdx]; 1777e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga de::MovePtr<tcu::TestCaseGroup> groupByImageViewType (new tcu::TestCaseGroup(testCtx, getImageTypeName(texture.type()).c_str(), "")); 1778e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1779e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga for (int imageFormatNdx = 0; imageFormatNdx < DE_LENGTH_OF_ARRAY(s_formats); ++imageFormatNdx) 1780e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga for (int viewFormatNdx = 0; viewFormatNdx < DE_LENGTH_OF_ARRAY(s_formats); ++viewFormatNdx) 1781e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1782e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga if (imageFormatNdx != viewFormatNdx && formatsAreCompatible(s_formats[imageFormatNdx], s_formats[viewFormatNdx])) 1783e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1784e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga for (int upload = 0; upload < UPLOAD_LAST; upload++) 1785e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga for (int download = 0; download < DOWNLOAD_LAST; download++) 1786e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 178716b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga CaseDef caseDef = 1788e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga { 1789e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga texture.type(), 1790e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga texture.layerSize(), 1791e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga static_cast<deUint32>(texture.numLayers()), 1792e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga s_formats[imageFormatNdx], 1793e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga s_formats[viewFormatNdx], 1794e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga static_cast<enum Upload>(upload), 179516b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga static_cast<enum Download>(download), 179616b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga false 1797e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga }; 1798e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 179916b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga std::string caseName = getFormatShortString(s_formats[imageFormatNdx]) + "_" + getFormatShortString(s_formats[viewFormatNdx]) + 1800e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga "_" + getUploadString(upload) + "_" + getDownloadString(download); 1801e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga addFunctionCaseWithPrograms(groupByImageViewType.get(), caseName, "", initPrograms, testMutable, caseDef); 180216b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga 180316b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga caseDef.isFormatListTest = true; 180416b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga caseName += "_format_list"; 180516b606a06ac36e7704e83f817de654d562e31a95Iago Toral Quiroga addFunctionCaseWithPrograms(groupByImageViewType.get(), caseName, "", initPrograms, testMutable, caseDef); 1806e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1807e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1808e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1809e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1810e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga testGroup->addChild(groupByImageViewType.release()); 1811e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga } 1812e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1813e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga return testGroup.release(); 1814e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} 1815e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga 1816e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} // image 1817e0461fc5ae9b85c3d5c59d7999c2a45b3b772405Iago Toral Quiroga} // vkt 1818