Kompute
Loading...
Searching...
No Matches
Image.hpp
1// SPDX-License-Identifier: Apache-2.0
2#pragma once
3
4#include "kompute/Core.hpp"
5#include "kompute/Memory.hpp"
6#include "kompute/Tensor.hpp"
7#include "logger/Logger.hpp"
8#include <memory>
9#include <string>
10
11namespace kp {
12
20class Image : public Memory
21{
22 public:
38 Image(std::shared_ptr<vk::PhysicalDevice> physicalDevice,
39 std::shared_ptr<vk::Device> device,
40 void* data,
41 size_t dataSize,
42 uint32_t x,
43 uint32_t y,
45 const DataTypes& dataType,
46 vk::ImageTiling tiling,
49 {
50 if (dataType == DataTypes::eCustom) {
51 throw std::runtime_error(
52 "Custom data types are not supported for Kompute Images");
53 }
54
56 }
57
69 Image(std::shared_ptr<vk::PhysicalDevice> physicalDevice,
70 std::shared_ptr<vk::Device> device,
71 uint32_t x,
72 uint32_t y,
74 const DataTypes& dataType,
75 vk::ImageTiling tiling,
78 device,
79 nullptr,
80 0,
81 x,
82 y,
85 tiling,
87 {
88 }
89
105 Image(std::shared_ptr<vk::PhysicalDevice> physicalDevice,
106 std::shared_ptr<vk::Device> device,
107 void* data,
108 size_t dataSize,
109 uint32_t x,
110 uint32_t y,
112 const DataTypes& dataType,
115 {
116 vk::ImageTiling tiling;
117
118 if (dataType == DataTypes::eCustom) {
119 throw std::runtime_error(
120 "Custom data types are not supported for Kompute Images");
121 }
122
125 // Host-accessible memory must be linear-tiled.
126 tiling = vk::ImageTiling::eLinear;
127 } else if (memoryType == MemoryTypes::eDevice ||
129 tiling = vk::ImageTiling::eOptimal;
130 } else {
131 throw std::runtime_error("Kompute Image unsupported memory type");
132 }
133
135 }
136
148 Image(std::shared_ptr<vk::PhysicalDevice> physicalDevice,
149 std::shared_ptr<vk::Device> device,
150 uint32_t x,
151 uint32_t y,
153 const DataTypes& dataType,
156 device,
157 nullptr,
158 0,
159 x,
160 y,
162 dataType,
164 {
165 }
166
167
172 Image(const Image&) = delete;
173 Image(const Image&&) = delete;
174 Image& operator=(const Image&) = delete;
175 Image& operator=(const Image&&) = delete;
176
181 virtual ~Image();
182
186 void destroy() override;
187
193 bool isInit() override;
194
203 void recordCopyFrom(const vk::CommandBuffer& commandBuffer,
204 std::shared_ptr<Image> copyFromImage) override;
205
214 void recordCopyFrom(const vk::CommandBuffer& commandBuffer,
215 std::shared_ptr<Tensor> copyFromTensor) override;
216
225 const vk::CommandBuffer& commandBuffer) override;
226
235 const vk::CommandBuffer& commandBuffer) override;
236
249 const vk::CommandBuffer& commandBuffer,
250 vk::AccessFlagBits srcAccessMask,
251 vk::AccessFlagBits dstAccessMask,
252 vk::PipelineStageFlagBits srcStageMask,
253 vk::PipelineStageFlagBits dstStageMask) override;
266 const vk::CommandBuffer& commandBuffer,
267 vk::AccessFlagBits srcAccessMask,
268 vk::AccessFlagBits dstAccessMask,
269 vk::PipelineStageFlagBits srcStageMask,
270 vk::PipelineStageFlagBits dstStageMask) override;
271
284 void recordPrimaryImageBarrier(const vk::CommandBuffer& commandBuffer,
285 vk::AccessFlagBits srcAccessMask,
286 vk::AccessFlagBits dstAccessMask,
287 vk::PipelineStageFlagBits srcStageMask,
288 vk::PipelineStageFlagBits dstStageMask,
289 vk::ImageLayout dstLayout);
290
298 vk::WriteDescriptorSet constructDescriptorSet(
299 vk::DescriptorSet descriptorSet,
300 uint32_t binding) override;
301
302 std::shared_ptr<vk::Image> getPrimaryImage();
303 vk::ImageLayout getPrimaryImageLayout();
304
305 /***
306 * Retreive the number of channels in the image
307 *
308 * @return Number of channels in the image
309 */
310 uint32_t getNumChannels();
311
312 Type type() override { return Type::eImage; }
313
314 protected:
315 // -------------- ALWAYS OWNED RESOURCES
316 uint32_t mNumChannels;
317 vk::DescriptorImageInfo mDescriptorImageInfo;
318 vk::ImageLayout mPrimaryImageLayout = vk::ImageLayout::eUndefined;
319 vk::ImageLayout mStagingImageLayout = vk::ImageLayout::eUndefined;
320 std::shared_ptr<vk::ImageView> mImageView = nullptr;
321 vk::ImageTiling mTiling = vk::ImageTiling::eOptimal;
322
323 private:
324 // -------------- OPTIONALLY OWNED RESOURCES
325 std::shared_ptr<vk::Image> mPrimaryImage;
326 bool mFreePrimaryImage = false;
327 std::shared_ptr<vk::Image> mStagingImage;
328 bool mFreeStagingImage = false;
329
330 void allocateMemoryCreateGPUResources(); // Creates the vulkan image
331 void createImage(std::shared_ptr<vk::Image> image,
332 vk::ImageUsageFlags imageUsageFlags,
333 vk::ImageTiling imageTiling);
334 void allocateBindMemory(std::shared_ptr<vk::Image> image,
335 std::shared_ptr<vk::DeviceMemory> memory,
336 vk::MemoryPropertyFlags memoryPropertyFlags);
337 void recordCopyImage(const vk::CommandBuffer& commandBuffer,
338 std::shared_ptr<vk::Image> srcImage,
339 std::shared_ptr<vk::Image> dstImage,
340 vk::ImageLayout srcLayout,
341 vk::ImageLayout dstLayout,
342 vk::ImageCopy copyRegion);
343 void recordCopyImageFromTensor(const vk::CommandBuffer& commandBuffer,
344 std::shared_ptr<vk::Buffer> srcBuffer,
345 std::shared_ptr<vk::Image> dstImage,
346 vk::ImageLayout dstLayout,
347 vk::BufferImageCopy copyRegion);
348
361 void recordStagingImageBarrier(const vk::CommandBuffer& commandBuffer,
362 vk::AccessFlagBits srcAccessMask,
363 vk::AccessFlagBits dstAccessMask,
364 vk::PipelineStageFlagBits srcStageMask,
365 vk::PipelineStageFlagBits dstStageMask,
366 vk::ImageLayout dstLayout);
367
368 void recordImageMemoryBarrier(const vk::CommandBuffer& commandBuffer,
369 const vk::Image& image,
370 vk::AccessFlagBits srcAccessMask,
371 vk::AccessFlagBits dstAccessMask,
372 vk::PipelineStageFlagBits srcStageMask,
373 vk::PipelineStageFlagBits dstStageMask,
374 vk::ImageLayout oldLayout,
375 vk::ImageLayout newLayout);
376
377 // Private util functions
378 vk::ImageUsageFlags getPrimaryImageUsageFlags();
379 vk::ImageUsageFlags getStagingImageUsageFlags();
380
381 vk::Format getFormat();
382
383 vk::DescriptorImageInfo constructDescriptorImageInfo();
384
385 void init(void* data,
386 size_t dataSize,
388 vk::ImageTiling tiling);
393 void reserve();
394};
395
396template<typename T>
397class ImageT : public Image
398{
399
400 public:
401 ImageT(std::shared_ptr<vk::PhysicalDevice> physicalDevice,
402 std::shared_ptr<vk::Device> device,
403 const std::vector<T>& data,
404 uint32_t x,
405 uint32_t y,
406 uint32_t numChannels,
407 vk::ImageTiling tiling,
408 const MemoryTypes& imageType = MemoryTypes::eDevice)
409 : Image(physicalDevice,
410 device,
411 (void*)data.data(),
412 data.size(),
413 x,
414 y,
415 numChannels,
417 tiling,
418 imageType)
419 {
420 // Images cannot be created with custom types
421 static_assert(Memory::dataType<T>() != DataTypes::eCustom,
422 "Custom data types are not supported for Kompute Images");
423
424 KP_LOG_DEBUG("Kompute imageT constructor with data size {}, x {}, "
425 "y {}, and num channels {}",
426 data.size(),
427 x,
428 y,
429 numChannels);
430 }
431
432 ImageT(std::shared_ptr<vk::PhysicalDevice> physicalDevice,
433 std::shared_ptr<vk::Device> device,
434 const std::vector<T>& data,
435 uint32_t x,
436 uint32_t y,
437 uint32_t numChannels,
438 const MemoryTypes& imageType = MemoryTypes::eDevice)
439 : Image(physicalDevice,
440 device,
441 (void*)data.data(),
442 data.size(),
443 x,
444 y,
445 numChannels,
447 imageType)
448 {
449 // Images cannot be created with custom types
450 static_assert(Memory::dataType<T>() != DataTypes::eCustom,
451 "Custom data types are not supported for Kompute Images");
452
453 KP_LOG_DEBUG("Kompute imageT constructor with data size {}, x {}, "
454 "y {}, and num channels {}",
455 data.size(),
456 x,
457 y,
458 numChannels);
459 }
460
461 ImageT(std::shared_ptr<vk::PhysicalDevice> physicalDevice,
462 std::shared_ptr<vk::Device> device,
463 uint32_t x,
464 uint32_t y,
465 uint32_t numChannels,
466 vk::ImageTiling tiling,
467 const MemoryTypes& imageType = MemoryTypes::eDevice)
468 : Image(physicalDevice,
469 device,
470 x,
471 y,
472 numChannels,
474 tiling,
475 imageType)
476 {
477 // Images cannot be created with custom types
478 static_assert(Memory::dataType<T>() != DataTypes::eCustom,
479 "Custom data types are not supported for Kompute Images");
480
481 KP_LOG_DEBUG("Kompute imageT constructor with no data, x {}, "
482 "y {}, and num channels {}",
483 x,
484 y,
485 numChannels);
486 }
487
488 ImageT(std::shared_ptr<vk::PhysicalDevice> physicalDevice,
489 std::shared_ptr<vk::Device> device,
490 uint32_t x,
491 uint32_t y,
492 uint32_t numChannels,
493 const MemoryTypes& imageType = MemoryTypes::eDevice)
494 : Image(physicalDevice,
495 device,
496 x,
497 y,
498 numChannels,
500 imageType)
501 {
502 // Images cannot be created with custom types
503 static_assert(Memory::dataType<T>() != DataTypes::eCustom,
504 "Custom data types are not supported for Kompute Images");
505
506 KP_LOG_DEBUG("Kompute imageT constructor with no data, x {}, "
507 "y {}, and num channels {}",
508 x,
509 y,
510 numChannels);
511 }
512
513 ~ImageT() { KP_LOG_DEBUG("Kompute imageT destructor"); }
514
515 std::vector<T> vector() { return Memory::vector<T>(); }
516
517 T& operator[](int index) { return *(Memory::data<T>() + index); }
518};
519
520} // End namespace kp
Definition Image.hpp:398
Definition Image.hpp:21
void recordCopyFrom(const vk::CommandBuffer &commandBuffer, std::shared_ptr< Tensor > copyFromTensor) override
virtual ~Image()
void recordStagingMemoryBarrier(const vk::CommandBuffer &commandBuffer, vk::AccessFlagBits srcAccessMask, vk::AccessFlagBits dstAccessMask, vk::PipelineStageFlagBits srcStageMask, vk::PipelineStageFlagBits dstStageMask) override
Type type() override
Definition Image.hpp:312
vk::WriteDescriptorSet constructDescriptorSet(vk::DescriptorSet descriptorSet, uint32_t binding) override
Image(std::shared_ptr< vk::PhysicalDevice > physicalDevice, std::shared_ptr< vk::Device > device, void *data, size_t dataSize, uint32_t x, uint32_t y, uint32_t numChannels, const DataTypes &dataType, const MemoryTypes &memoryType=MemoryTypes::eDevice)
Definition Image.hpp:105
void recordPrimaryMemoryBarrier(const vk::CommandBuffer &commandBuffer, vk::AccessFlagBits srcAccessMask, vk::AccessFlagBits dstAccessMask, vk::PipelineStageFlagBits srcStageMask, vk::PipelineStageFlagBits dstStageMask) override
void destroy() override
void recordCopyFromDeviceToStaging(const vk::CommandBuffer &commandBuffer) override
void recordCopyFromStagingToDevice(const vk::CommandBuffer &commandBuffer) override
Image(std::shared_ptr< vk::PhysicalDevice > physicalDevice, std::shared_ptr< vk::Device > device, void *data, size_t dataSize, uint32_t x, uint32_t y, uint32_t numChannels, const DataTypes &dataType, vk::ImageTiling tiling, const MemoryTypes &memoryType=MemoryTypes::eDevice)
Definition Image.hpp:38
void recordPrimaryImageBarrier(const vk::CommandBuffer &commandBuffer, vk::AccessFlagBits srcAccessMask, vk::AccessFlagBits dstAccessMask, vk::PipelineStageFlagBits srcStageMask, vk::PipelineStageFlagBits dstStageMask, vk::ImageLayout dstLayout)
Image(std::shared_ptr< vk::PhysicalDevice > physicalDevice, std::shared_ptr< vk::Device > device, uint32_t x, uint32_t y, uint32_t numChannels, const DataTypes &dataType, vk::ImageTiling tiling, const MemoryTypes &memoryType=MemoryTypes::eDevice)
Definition Image.hpp:69
Image(std::shared_ptr< vk::PhysicalDevice > physicalDevice, std::shared_ptr< vk::Device > device, uint32_t x, uint32_t y, uint32_t numChannels, const DataTypes &dataType, const MemoryTypes &memoryType=MemoryTypes::eDevice)
Definition Image.hpp:148
bool isInit() override
void recordCopyFrom(const vk::CommandBuffer &commandBuffer, std::shared_ptr< Image > copyFromImage) override
Image(const Image &)=delete
Make Image uncopyable.
Definition Memory.hpp:16
static constexpr DataTypes dataType()
std::vector< T > vector()
Definition Memory.hpp:282
T * data()
Definition Memory.hpp:265
MemoryTypes
Definition Memory.hpp:28
@ eDeviceAndHost
Type is host-visible and host-coherent device memory.
@ eDevice
Type is device memory, source and destination.
@ eHost
Type is host memory, source and destination.
@ eStorage
Type is Device memory (only)
MemoryTypes memoryType()