1#ifndef _VKTDRAWIMAGEOBJECTUTIL_HPP 2#define _VKTDRAWIMAGEOBJECTUTIL_HPP 3/*------------------------------------------------------------------------ 4 * Vulkan Conformance Tests 5 * ------------------------ 6 * 7 * Copyright (c) 2015 The Khronos Group Inc. 8 * Copyright (c) 2015 Intel Corporation 9 * 10 * Licensed under the Apache License, Version 2.0 (the "License"); 11 * you may not use this file except in compliance with the License. 12 * You may obtain a copy of the License at 13 * 14 * http://www.apache.org/licenses/LICENSE-2.0 15 * 16 * Unless required by applicable law or agreed to in writing, software 17 * distributed under the License is distributed on an "AS IS" BASIS, 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19 * See the License for the specific language governing permissions and 20 * limitations under the License. 21 * 22 *//*! 23 * \file 24 * \brief Image Object Util 25 *//*--------------------------------------------------------------------*/ 26 27#include "vkMemUtil.hpp" 28#include "vkRefUtil.hpp" 29 30#include "deSharedPtr.hpp" 31 32#include "tcuTexture.hpp" 33 34namespace vkt 35{ 36namespace Draw 37{ 38 39class MemoryOp 40{ 41public: 42 static void pack (int pixelSize, 43 int width, 44 int height, 45 int depth, 46 vk::VkDeviceSize rowPitchOrZero, 47 vk::VkDeviceSize depthPitchOrZero, 48 const void * srcBuffer, 49 void * destBuffer); 50 51 static void unpack (int pixelSize, 52 int width, 53 int height, 54 int depth, 55 vk::VkDeviceSize rowPitchOrZero, 56 vk::VkDeviceSize depthPitchOrZero, 57 const void * srcBuffer, 58 void * destBuffer); 59}; 60 61class Image 62{ 63public: 64 static de::SharedPtr<Image> create (const vk::DeviceInterface& vk, vk::VkDevice device, const vk::VkImageCreateInfo& createInfo); 65 66 static de::SharedPtr<Image> createAndAlloc (const vk::DeviceInterface& vk, 67 vk::VkDevice device, 68 const vk::VkImageCreateInfo& createInfo, 69 vk::Allocator& allocator, 70 vk::MemoryRequirement memoryRequirement = vk::MemoryRequirement::Any); 71 72 tcu::ConstPixelBufferAccess readSurface (vk::VkQueue queue, 73 vk::Allocator& allocator, 74 vk::VkImageLayout layout, 75 vk::VkOffset3D offset, 76 int width, 77 int height, 78 vk::VkImageAspectFlagBits aspect, 79 unsigned int mipLevel = 0, 80 unsigned int arrayElement = 0); 81 82 tcu::ConstPixelBufferAccess readSurface1D (vk::VkQueue queue, 83 vk::Allocator& allocator, 84 vk::VkImageLayout layout, 85 vk::VkOffset3D offset, 86 int width, 87 vk::VkImageAspectFlagBits aspect, 88 unsigned int mipLevel = 0, 89 unsigned int arrayElement = 0); 90 91 tcu::ConstPixelBufferAccess readVolume (vk::VkQueue queue, 92 vk::Allocator& allocator, 93 vk::VkImageLayout layout, 94 vk::VkOffset3D offset, 95 int width, 96 int height, 97 int depth, 98 vk::VkImageAspectFlagBits aspect, 99 unsigned int mipLevel = 0, 100 unsigned int arrayElement = 0); 101 102 tcu::ConstPixelBufferAccess readSurfaceLinear (vk::VkOffset3D offset, 103 int width, 104 int height, 105 int depth, 106 vk::VkImageAspectFlagBits aspect, 107 unsigned int mipLevel = 0, 108 unsigned int arrayElement = 0); 109 110 void read (vk::VkQueue queue, 111 vk::Allocator& allocator, 112 vk::VkImageLayout layout, 113 vk::VkOffset3D offset, 114 int width, 115 int height, 116 int depth, 117 unsigned int mipLevel, 118 unsigned int arrayElement, 119 vk::VkImageAspectFlagBits aspect, 120 vk::VkImageType type, 121 void * data); 122 123 void readUsingBuffer (vk::VkQueue queue, 124 vk::Allocator& allocator, 125 vk::VkImageLayout layout, 126 vk::VkOffset3D offset, 127 int width, 128 int height, 129 int depth, 130 unsigned int mipLevel, 131 unsigned int arrayElement, 132 vk::VkImageAspectFlagBits aspect, 133 void * data); 134 135 void readLinear (vk::VkOffset3D offset, 136 int width, 137 int height, 138 int depth, 139 unsigned int mipLevel, 140 unsigned int arrayElement, 141 vk::VkImageAspectFlagBits aspect, 142 void * data); 143 144 void uploadVolume (const tcu::ConstPixelBufferAccess& access, 145 vk::VkQueue queue, 146 vk::Allocator& allocator, 147 vk::VkImageLayout layout, 148 vk::VkOffset3D offset, 149 vk::VkImageAspectFlagBits aspect, 150 unsigned int mipLevel = 0, 151 unsigned int arrayElement = 0); 152 153 void uploadSurface (const tcu::ConstPixelBufferAccess& access, 154 vk::VkQueue queue, 155 vk::Allocator& allocator, 156 vk::VkImageLayout layout, 157 vk::VkOffset3D offset, 158 vk::VkImageAspectFlagBits aspect, 159 unsigned int mipLevel = 0, 160 unsigned int arrayElement = 0); 161 162 void uploadSurface1D (const tcu::ConstPixelBufferAccess& access, 163 vk::VkQueue queue, 164 vk::Allocator& allocator, 165 vk::VkImageLayout layout, 166 vk::VkOffset3D offset, 167 vk::VkImageAspectFlagBits aspect, 168 unsigned int mipLevel = 0, 169 unsigned int arrayElement = 0); 170 171 void uploadSurfaceLinear (const tcu::ConstPixelBufferAccess& access, 172 vk::VkOffset3D offset, 173 int width, 174 int height, 175 int depth, 176 vk::VkImageAspectFlagBits aspect, 177 unsigned int mipLevel = 0, 178 unsigned int arrayElement = 0); 179 180 void upload (vk::VkQueue queue, 181 vk::Allocator& allocator, 182 vk::VkImageLayout layout, 183 vk::VkOffset3D offset, 184 int width, 185 int height, 186 int depth, 187 unsigned int mipLevel, 188 unsigned int arrayElement, 189 vk::VkImageAspectFlagBits aspect, 190 vk::VkImageType type, 191 const void * data); 192 193 void uploadUsingBuffer (vk::VkQueue queue, 194 vk::Allocator& allocator, 195 vk::VkImageLayout layout, 196 vk::VkOffset3D offset, 197 int width, 198 int height, 199 int depth, 200 unsigned int mipLevel, 201 unsigned int arrayElement, 202 vk::VkImageAspectFlagBits aspect, 203 const void * data); 204 205 void uploadLinear (vk::VkOffset3D offset, 206 int width, 207 int height, 208 int depth, 209 unsigned int mipLevel, 210 unsigned int arrayElement, 211 vk::VkImageAspectFlagBits aspect, 212 const void * data); 213 214 de::SharedPtr<Image> copyToLinearImage (vk::VkQueue queue, 215 vk::Allocator& allocator, 216 vk::VkImageLayout layout, 217 vk::VkOffset3D offset, 218 int width, 219 int height, 220 int depth, 221 unsigned int mipLevel, 222 unsigned int arrayElement, 223 vk::VkImageAspectFlagBits aspect, 224 vk::VkImageType type); 225 226 const vk::VkFormat& getFormat (void) const { return m_format; } 227 vk::VkImage object (void) const { return *m_object; } 228 void bindMemory (de::MovePtr<vk::Allocation> allocation); 229 vk::Allocation getBoundMemory (void) const { return *m_allocation; } 230 231private: 232 vk::VkDeviceSize getPixelOffset (vk::VkOffset3D offset, 233 vk::VkDeviceSize rowPitch, 234 vk::VkDeviceSize depthPitch, 235 unsigned int mipLevel, 236 unsigned int arrayElement); 237 238 Image (const vk::DeviceInterface& vk, 239 vk::VkDevice device, 240 vk::VkFormat format, 241 const vk::VkExtent3D& extend, 242 deUint32 levelCount, 243 deUint32 layerCount, 244 vk::Move<vk::VkImage> object); 245 246 Image (const Image& other); // Not allowed! 247 Image& operator= (const Image& other); // Not allowed! 248 249 de::MovePtr<vk::Allocation> m_allocation; 250 vk::Unique<vk::VkImage> m_object; 251 252 vk::VkFormat m_format; 253 vk::VkExtent3D m_extent; 254 deUint32 m_levelCount; 255 deUint32 m_layerCount; 256 257 std::vector<deUint8> m_pixelAccessData; 258 259 const vk::DeviceInterface& m_vk; 260 vk::VkDevice m_device; 261}; 262 263void transition2DImage (const vk::DeviceInterface& vk, vk::VkCommandBuffer cmdBuffer, vk::VkImage image, vk::VkImageAspectFlags aspectMask, vk::VkImageLayout oldLayout, vk::VkImageLayout newLayout); 264 265void initialTransitionColor2DImage (const vk::DeviceInterface& vk, vk::VkCommandBuffer cmdBuffer, vk::VkImage image, vk::VkImageLayout layout); 266 267void initialTransitionDepth2DImage (const vk::DeviceInterface& vk, vk::VkCommandBuffer cmdBuffer, vk::VkImage image, vk::VkImageLayout layout); 268 269void initialTransitionStencil2DImage (const vk::DeviceInterface& vk, vk::VkCommandBuffer cmdBuffer, vk::VkImage image, vk::VkImageLayout layout); 270 271void initialTransitionDepthStencil2DImage (const vk::DeviceInterface& vk, vk::VkCommandBuffer cmdBuffer, vk::VkImage image, vk::VkImageLayout layout); 272 273} // Draw 274} // vkt 275 276#endif // _VKTDRAWIMAGEOBJECTUTIL_HPP 277