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 "vkDefs.hpp" 28 #include "vkMemUtil.hpp" 29 #include "vkRefUtil.hpp" 30 31 #include "deSharedPtr.hpp" 32 33 #include "tcuTexture.hpp" 34 35 namespace vkt 36 { 37 namespace Draw 38 { 39 40 class MemoryOp 41 { 42 public: 43 static void pack (int pixelSize, 44 int width, 45 int height, 46 int depth, 47 vk::VkDeviceSize rowPitchOrZero, 48 vk::VkDeviceSize depthPitchOrZero, 49 const void * srcBuffer, 50 void * destBuffer); 51 52 static void unpack (int pixelSize, 53 int width, 54 int height, 55 int depth, 56 vk::VkDeviceSize rowPitchOrZero, 57 vk::VkDeviceSize depthPitchOrZero, 58 const void * srcBuffer, 59 void * destBuffer); 60 }; 61 62 class Image 63 { 64 public: 65 static de::SharedPtr<Image> create (const vk::DeviceInterface& vk, vk::VkDevice device, const vk::VkImageCreateInfo& createInfo, deUint32 queueFamilyIndex); 66 67 static de::SharedPtr<Image> createAndAlloc (const vk::DeviceInterface& vk, 68 vk::VkDevice device, 69 const vk::VkImageCreateInfo& createInfo, 70 vk::Allocator& allocator, 71 deUint32 queueFamilyIndex, 72 vk::MemoryRequirement memoryRequirement = vk::MemoryRequirement::Any); 73 74 tcu::ConstPixelBufferAccess readSurface (vk::VkQueue queue, 75 vk::Allocator& allocator, 76 vk::VkImageLayout layout, 77 vk::VkOffset3D offset, 78 int width, 79 int height, 80 vk::VkImageAspectFlagBits aspect, 81 unsigned int mipLevel = 0, 82 unsigned int arrayElement = 0); 83 84 tcu::ConstPixelBufferAccess readDepth (vk::VkQueue queue, 85 vk::Allocator& allocator, 86 vk::VkImageLayout layout, 87 vk::VkOffset3D offset, 88 int width, 89 int height, 90 vk::VkImageAspectFlagBits aspect, 91 unsigned int mipLevel = 0, 92 unsigned int arrayElement = 0); 93 94 tcu::ConstPixelBufferAccess readSurface1D (vk::VkQueue queue, 95 vk::Allocator& allocator, 96 vk::VkImageLayout layout, 97 vk::VkOffset3D offset, 98 int width, 99 vk::VkImageAspectFlagBits aspect, 100 unsigned int mipLevel = 0, 101 unsigned int arrayElement = 0); 102 103 tcu::ConstPixelBufferAccess readVolume (vk::VkQueue queue, 104 vk::Allocator& allocator, 105 vk::VkImageLayout layout, 106 vk::VkOffset3D offset, 107 int width, 108 int height, 109 int depth, 110 vk::VkImageAspectFlagBits aspect, 111 unsigned int mipLevel = 0, 112 unsigned int arrayElement = 0); 113 114 tcu::ConstPixelBufferAccess readSurfaceLinear (vk::VkOffset3D offset, 115 int width, 116 int height, 117 int depth, 118 vk::VkImageAspectFlagBits aspect, 119 unsigned int mipLevel = 0, 120 unsigned int arrayElement = 0); 121 122 void read (vk::VkQueue queue, 123 vk::Allocator& allocator, 124 vk::VkImageLayout layout, 125 vk::VkOffset3D offset, 126 int width, 127 int height, 128 int depth, 129 unsigned int mipLevel, 130 unsigned int arrayElement, 131 vk::VkImageAspectFlagBits aspect, 132 vk::VkImageType type, 133 void * data); 134 135 void readUsingBuffer (vk::VkQueue queue, 136 vk::Allocator& allocator, 137 vk::VkImageLayout layout, 138 vk::VkOffset3D offset, 139 int width, 140 int height, 141 int depth, 142 unsigned int mipLevel, 143 unsigned int arrayElement, 144 vk::VkImageAspectFlagBits aspect, 145 void * data); 146 147 void readLinear (vk::VkOffset3D offset, 148 int width, 149 int height, 150 int depth, 151 unsigned int mipLevel, 152 unsigned int arrayElement, 153 vk::VkImageAspectFlagBits aspect, 154 void * data); 155 156 void uploadVolume (const tcu::ConstPixelBufferAccess& access, 157 vk::VkQueue queue, 158 vk::Allocator& allocator, 159 vk::VkImageLayout layout, 160 vk::VkOffset3D offset, 161 vk::VkImageAspectFlagBits aspect, 162 unsigned int mipLevel = 0, 163 unsigned int arrayElement = 0); 164 165 void uploadSurface (const tcu::ConstPixelBufferAccess& access, 166 vk::VkQueue queue, 167 vk::Allocator& allocator, 168 vk::VkImageLayout layout, 169 vk::VkOffset3D offset, 170 vk::VkImageAspectFlagBits aspect, 171 unsigned int mipLevel = 0, 172 unsigned int arrayElement = 0); 173 174 void uploadSurface1D (const tcu::ConstPixelBufferAccess& access, 175 vk::VkQueue queue, 176 vk::Allocator& allocator, 177 vk::VkImageLayout layout, 178 vk::VkOffset3D offset, 179 vk::VkImageAspectFlagBits aspect, 180 unsigned int mipLevel = 0, 181 unsigned int arrayElement = 0); 182 183 void uploadSurfaceLinear (const tcu::ConstPixelBufferAccess& access, 184 vk::VkOffset3D offset, 185 int width, 186 int height, 187 int depth, 188 vk::VkImageAspectFlagBits aspect, 189 unsigned int mipLevel = 0, 190 unsigned int arrayElement = 0); 191 192 void upload (vk::VkQueue queue, 193 vk::Allocator& allocator, 194 vk::VkImageLayout layout, 195 vk::VkOffset3D offset, 196 int width, 197 int height, 198 int depth, 199 unsigned int mipLevel, 200 unsigned int arrayElement, 201 vk::VkImageAspectFlagBits aspect, 202 vk::VkImageType type, 203 const void * data); 204 205 void uploadUsingBuffer (vk::VkQueue queue, 206 vk::Allocator& allocator, 207 vk::VkImageLayout layout, 208 vk::VkOffset3D offset, 209 int width, 210 int height, 211 int depth, 212 unsigned int mipLevel, 213 unsigned int arrayElement, 214 vk::VkImageAspectFlagBits aspect, 215 const void * data); 216 217 void uploadLinear (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 const void * data); 225 226 de::SharedPtr<Image> copyToLinearImage (vk::VkQueue queue, 227 vk::Allocator& allocator, 228 vk::VkImageLayout layout, 229 vk::VkOffset3D offset, 230 int width, 231 int height, 232 int depth, 233 unsigned int mipLevel, 234 unsigned int arrayElement, 235 vk::VkImageAspectFlagBits aspect, 236 vk::VkImageType type); 237 getFormat(void) const238 const vk::VkFormat& getFormat (void) const { return m_format; } object(void) const239 vk::VkImage object (void) const { return *m_object; } 240 void bindMemory (de::MovePtr<vk::Allocation> allocation); getBoundMemory(void) const241 vk::Allocation getBoundMemory (void) const { return *m_allocation; } 242 243 private: 244 Image (const vk::DeviceInterface& vk, 245 vk::VkDevice device, 246 deUint32 queueFamilyIndex, 247 vk::VkFormat format, 248 const vk::VkExtent3D& extend, 249 deUint32 levelCount, 250 deUint32 layerCount, 251 vk::Move<vk::VkImage> object); 252 253 Image (const Image& other); // Not allowed! 254 Image& operator= (const Image& other); // Not allowed! 255 256 de::MovePtr<vk::Allocation> m_allocation; 257 vk::Unique<vk::VkImage> m_object; 258 259 deUint32 m_queueFamilyIndex; 260 261 vk::VkFormat m_format; 262 vk::VkExtent3D m_extent; 263 deUint32 m_levelCount; 264 deUint32 m_layerCount; 265 266 std::vector<deUint8> m_pixelAccessData; 267 268 const vk::DeviceInterface& m_vk; 269 vk::VkDevice m_device; 270 }; 271 272 void transition2DImage (const vk::DeviceInterface& vk, 273 vk::VkCommandBuffer cmdBuffer, 274 vk::VkImage image, 275 vk::VkImageAspectFlags aspectMask, 276 vk::VkImageLayout oldLayout, 277 vk::VkImageLayout newLayout, 278 vk::VkAccessFlags srcAccessMask, 279 vk::VkAccessFlags dstAccessMask, 280 vk::VkPipelineStageFlags srcStageMask, 281 vk::VkPipelineStageFlags dstStageMask); 282 283 void initialTransitionColor2DImage (const vk::DeviceInterface& vk, vk::VkCommandBuffer cmdBuffer, vk::VkImage image, vk::VkImageLayout layout, 284 vk::VkAccessFlags dstAccessMask, vk::VkPipelineStageFlags dstStageMask); 285 286 void initialTransitionDepth2DImage (const vk::DeviceInterface& vk, vk::VkCommandBuffer cmdBuffer, vk::VkImage image, vk::VkImageLayout layout, 287 vk::VkAccessFlags dstAccessMask, vk::VkPipelineStageFlags dstStageMask); 288 289 void initialTransitionStencil2DImage (const vk::DeviceInterface& vk, vk::VkCommandBuffer cmdBuffer, vk::VkImage image, vk::VkImageLayout layout, 290 vk::VkAccessFlags dstAccessMask, vk::VkPipelineStageFlags dstStageMask); 291 292 void initialTransitionDepthStencil2DImage (const vk::DeviceInterface& vk, 293 vk::VkCommandBuffer cmdBuffer, 294 vk::VkImage image, 295 vk::VkImageLayout layout, 296 vk::VkAccessFlags dstAccessMask, 297 vk::VkPipelineStageFlags dstStageMask); 298 299 } // Draw 300 } // vkt 301 302 #endif // _VKTDRAWIMAGEOBJECTUTIL_HPP 303