NAP
texture.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 // Local Includes
8 #include "surfacedescriptor.h"
9 #include "renderutils.h"
10 
11 // External Includes
12 #include <nap/resource.h>
13 #include <glm/glm.hpp>
14 #include <nap/numeric.h>
15 #include <rtti/factory.h>
16 #include <nap/signalslot.h>
17 
18 namespace nap
19 {
20  // Forward Declares
21  class Bitmap;
22  class RenderService;
23  class Core;
24 
28  class NAPAPI Texture : public Resource
29  {
30  friend class RenderService;
31  RTTI_ENABLE(Resource)
32  public:
36  enum class EUsage
37  {
38  Static,
39  DynamicRead,
41  };
42 
43  // Constructor
44  Texture(Core& core);
45 
46  // Destructor
47  virtual ~Texture() { };
48 
52  virtual uint getLayerCount() const = 0;
53 
57  virtual uint getMipLevels() const = 0;
58 
62  virtual const ImageData& getHandle() const = 0;
63 
67  virtual VkImageLayout getTargetLayout() const { return VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; };
68 
72  VkFormat getFormat() const { return mFormat; }
73 
77  const SurfaceDescriptor& getDescriptor() const { return mDescriptor; }
78 
82  RenderService& getRenderService() { return mRenderService; }
83 
87  const RenderService& getRenderService() const { return mRenderService; }
88 
92  virtual void onDestroy() override { textureDestroyed(); }
93 
95 
96  protected:
100  virtual ImageData& getHandle() = 0;
101 
102  // Hide default resource init. Use specialized initialization functions instead.
103  using Resource::init;
104 
108  virtual void clear(VkCommandBuffer commandBuffer);
109 
113  void requestClear();
114 
117  VkFormat mFormat = VK_FORMAT_UNDEFINED;
118  VkClearColorValue mClearColor = { 0.0f, 0.0f, 0.0f, 0.0f };
119  };
120 
121 
128  class NAPAPI Texture2D : public Texture
129  {
130  friend class RenderService;
131  RTTI_ENABLE(Texture)
132  public:
133  Texture2D(Core& core);
134  virtual ~Texture2D() override;
135 
146  bool init(const SurfaceDescriptor& descriptor, bool generateMipMaps, const glm::vec4& clearColor, VkImageUsageFlags requiredFlags, utility::ErrorState& errorState);
147 
158  bool init(const SurfaceDescriptor& descriptor, bool generateMipMaps, VkImageUsageFlags requiredFlags, utility::ErrorState& errorState);
159 
170  bool init(const SurfaceDescriptor& descriptor, bool generateMipMaps, void* initialData, VkImageUsageFlags requiredFlags, utility::ErrorState& errorState);
171 
175  const glm::vec2 getSize() const { return { getWidth(), getHeight() }; }
176 
180  int getWidth() const { return mDescriptor.mWidth; }
181 
185  int getHeight() const { return mDescriptor.mHeight; }
186 
196  void update(const void* data, int width, int height, int pitch, ESurfaceChannels channels);
197 
204  void update(const void* data, const SurfaceDescriptor& surfaceDescriptor);
205 
209  virtual uint getLayerCount() const override { return 1; }
210 
214  virtual uint getMipLevels() const override { return mMipLevels; }
215 
219  virtual const ImageData& getHandle() const override { return mImageData; }
220 
226  void asyncGetData(Bitmap& bitmap);
227 
233  void asyncGetData(std::function<void(const void*, size_t)> copyFunction);
234 
235  EUsage mUsage = EUsage::Static;
236 
237  protected:
241  virtual ImageData& getHandle() override { return mImageData; }
242 
252  bool initInternal(const SurfaceDescriptor& descriptor, bool generateMipMaps, VkImageUsageFlags requiredFlags, utility::ErrorState& errorState);
253 
257  void upload(VkCommandBuffer commandBuffer);
258 
262  void download(VkCommandBuffer commandBuffer);
263 
267  void notifyDownloadReady(int frameIndex);
268 
272  void clearDownloads();
273 
274  using TextureReadCallback = std::function<void(void* data, size_t sizeInBytes)>;
275 
277  std::vector<BufferData> mStagingBuffers;
278  int mCurrentStagingBufferIndex = -1;
279  size_t mImageSizeInBytes = -1;
280  std::vector<TextureReadCallback> mReadCallbacks;
281  std::vector<int> mDownloadStagingBufferIndices;
282  uint32 mMipLevels = 1;
283  };
284 
285 
298  class NAPAPI TextureCube : public Texture
299  {
300  friend class RenderService;
301  RTTI_ENABLE(Texture)
302  public:
303  // The image layer count is equal to the number of sides of a cube
304  static constexpr const uint layerCount = 6;
305 
306  TextureCube(Core& core);
307  virtual ~TextureCube() override;
308 
319  bool init(const SurfaceDescriptor& descriptor, bool generateMipMaps, const glm::vec4& clearColor, VkImageUsageFlags requiredFlags, utility::ErrorState& errorState);
320 
324  const glm::vec2 getSize() const { return { getWidth(), getHeight() }; }
325 
329  int getWidth() const { return mDescriptor.mWidth; }
330 
334  int getHeight() const { return mDescriptor.mHeight; }
335 
339  VkImageUsageFlags getImageUsageFlags() const { return mImageUsageFlags; }
340 
344  virtual uint getLayerCount() const override { return layerCount; }
345 
349  virtual uint getMipLevels() const override { return mMipLevels; }
350 
354  virtual const ImageData& getHandle() const override { return mImageData; }
355 
360  virtual ImageData& getHandle() override { return mImageData; }
361 
362  const EUsage mUsage = EUsage::Static;
363 
364  protected:
366  uint32 mMipLevels = 1;
367 
368  private:
369  VkImageUsageFlags mImageUsageFlags = 0;
370  };
371 }
nap::uint
unsigned int uint
Definition: numeric.h:23
nap::rtti::Object::init
virtual bool init(utility::ErrorState &errorState)
Definition: object.h:46
nap::Texture2D::getHandle
virtual ImageData & getHandle() override
Definition: texture.h:241
nap::Texture::~Texture
virtual ~Texture()
Definition: texture.h:47
nap::Texture2D::getLayerCount
virtual uint getLayerCount() const override
Definition: texture.h:209
nap::Texture
Definition: texture.h:28
nap::Texture2D::mStagingBuffers
std::vector< BufferData > mStagingBuffers
All vulkan staging buffers, 1 when static or using dynamic read, no. of frames in flight when dynamic...
Definition: texture.h:277
nap::TextureCube
Definition: texture.h:298
nap::EMemoryUsage::Static
@ Static
Buffer data is uploaded only once from the CPU to the GPU.
nap::EMemoryUsage::DynamicRead
@ DynamicRead
Buffer data is uploaded only once from the CPU to the GPU, and frequently read from GPU to CPU.
nap::Texture2D::mImageData
ImageData mImageData
2D Texture vulkan image buffers
Definition: texture.h:276
nap::ESurfaceChannels
ESurfaceChannels
Definition: surfacedescriptor.h:26
nap::TextureCube::getSize
const glm::vec2 getSize() const
Definition: texture.h:324
nap::Texture2D::mDownloadStagingBufferIndices
std::vector< int > mDownloadStagingBufferIndices
Staging buffer indices associated with a frameindex.
Definition: texture.h:281
nap::Texture::getDescriptor
const SurfaceDescriptor & getDescriptor() const
Definition: texture.h:77
nap::TextureCube::getHandle
virtual const ImageData & getHandle() const override
Definition: texture.h:354
nap::Texture::EUsage
EUsage
Definition: texture.h:36
nap::Texture::getRenderService
RenderService & getRenderService()
Definition: texture.h:82
nap::utility::ErrorState
Definition: errorstate.h:19
nap::Texture::textureDestroyed
nap::Signal textureDestroyed
Signal that is triggered before texture is destroyed.
Definition: texture.h:94
nap::uint32
uint32_t uint32
Definition: numeric.h:20
nap::Texture2D
Definition: texture.h:128
nap::ImageData
Definition: imagedata.h:23
nap::Signal
Definition: signalslot.h:28
nap::Texture::getTargetLayout
virtual VkImageLayout getTargetLayout() const
Definition: texture.h:67
nap::SurfaceDescriptor
Definition: surfacedescriptor.h:46
nap::RenderService
Definition: renderservice.h:275
nap::Core
Definition: core.h:82
nap::Texture::getFormat
VkFormat getFormat() const
Definition: texture.h:72
nap::EMemoryUsage::DynamicWrite
@ DynamicWrite
Buffer data is updated more than once from the CPU to the GPU.
nap::Texture2D::TextureReadCallback
std::function< void(void *data, size_t sizeInBytes)> TextureReadCallback
Definition: texture.h:274
nap::TextureCube::getImageUsageFlags
VkImageUsageFlags getImageUsageFlags() const
Definition: texture.h:339
nap::Texture::onDestroy
virtual void onDestroy() override
Definition: texture.h:92
nap::Texture2D::getMipLevels
virtual uint getMipLevels() const override
Definition: texture.h:214
nap::Texture::mRenderService
RenderService & mRenderService
Reference to the render service.
Definition: texture.h:115
nap::Bitmap
Definition: bitmap.h:31
nap::Texture2D::getWidth
int getWidth() const
Definition: texture.h:180
nap::TextureCube::getWidth
int getWidth() const
Definition: texture.h:329
nap
Definition: templateapp.h:17
nap::Texture::getRenderService
const RenderService & getRenderService() const
Definition: texture.h:87
nap::Texture2D::mReadCallbacks
std::vector< TextureReadCallback > mReadCallbacks
Number of callbacks based on number of frames in flight.
Definition: texture.h:280
nap::TextureCube::layerCount
static constexpr const uint layerCount
Definition: texture.h:304
nap::Resource
Definition: resource.h:19
nap::Texture2D::getHandle
virtual const ImageData & getHandle() const override
Definition: texture.h:219
nap::TextureCube::getMipLevels
virtual uint getMipLevels() const override
Definition: texture.h:349
nap::TextureCube::getHeight
int getHeight() const
Definition: texture.h:334
nap::Texture2D::getHeight
int getHeight() const
Definition: texture.h:185
nap::Texture2D::getSize
const glm::vec2 getSize() const
Definition: texture.h:175
nap::TextureCube::getHandle
virtual ImageData & getHandle() override
Definition: texture.h:360
nap::Texture::mDescriptor
SurfaceDescriptor mDescriptor
Texture description.
Definition: texture.h:116
nap::TextureCube::getLayerCount
virtual uint getLayerCount() const override
Definition: texture.h:344