2024-04-09 16:41:12 +02:00
|
|
|
#pragma once
|
|
|
|
|
#include "Graphics.h"
|
2024-08-26 21:49:09 +02:00
|
|
|
#include "Graphics/Enums.h"
|
2024-06-09 12:20:04 +02:00
|
|
|
#include "Graphics/Texture.h"
|
2024-08-26 21:49:09 +02:00
|
|
|
#include "Metal/MTLTexture.hpp"
|
2024-06-09 12:20:04 +02:00
|
|
|
|
|
|
|
|
namespace Seele {
|
|
|
|
|
namespace Metal {
|
2024-08-26 21:49:09 +02:00
|
|
|
class TextureHandle {
|
2024-06-09 12:20:04 +02:00
|
|
|
public:
|
2024-08-26 21:49:09 +02:00
|
|
|
TextureHandle(PGraphics graphics, MTL::TextureType type, const TextureCreateInfo& createInfo, MTL::Texture* existingImage);
|
|
|
|
|
virtual ~TextureHandle();
|
|
|
|
|
void pipelineBarrier(Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage, Gfx::SeAccessFlags dstAccess,
|
2024-08-28 17:54:14 +02:00
|
|
|
Gfx::SePipelineStageFlags dstStage);
|
2024-08-26 21:49:09 +02:00
|
|
|
void transferOwnership(Gfx::QueueType newOwner);
|
2024-08-28 17:54:14 +02:00
|
|
|
void changeLayout(Gfx::SeImageLayout newLayout, Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage,
|
|
|
|
|
Gfx::SeAccessFlags dstAccess, Gfx::SePipelineStageFlags dstStage);
|
2024-04-09 16:41:12 +02:00
|
|
|
void download(uint32 mipLevel, uint32 arrayLayer, uint32 face, Array<uint8>& buffer);
|
2024-08-26 21:49:09 +02:00
|
|
|
void generateMipmaps();
|
2024-08-28 17:54:14 +02:00
|
|
|
|
2024-08-26 21:49:09 +02:00
|
|
|
MTL::Texture* texture;
|
|
|
|
|
MTL::TextureType type;
|
2024-04-09 16:41:12 +02:00
|
|
|
uint32 width;
|
|
|
|
|
uint32 height;
|
|
|
|
|
uint32 depth;
|
|
|
|
|
uint32 arrayCount;
|
|
|
|
|
uint32 mipLevels;
|
|
|
|
|
uint32 samples;
|
|
|
|
|
Gfx::SeFormat format;
|
|
|
|
|
Gfx::SeImageUsageFlags usage;
|
|
|
|
|
Gfx::SeImageLayout layout;
|
2024-08-26 21:49:09 +02:00
|
|
|
Gfx::SeImageAspectFlags aspect;
|
2024-04-09 16:41:12 +02:00
|
|
|
uint8 ownsImage;
|
2024-08-26 21:49:09 +02:00
|
|
|
};
|
|
|
|
|
DEFINE_REF(TextureHandle)
|
|
|
|
|
|
|
|
|
|
class TextureBase {
|
|
|
|
|
public:
|
|
|
|
|
TextureBase(PGraphics graphics, MTL::TextureType textureType, const TextureCreateInfo& createInfo,
|
|
|
|
|
MTL::Texture* existingImage = nullptr);
|
|
|
|
|
virtual ~TextureBase();
|
|
|
|
|
uint32 getWidth() const { return handle->width; }
|
|
|
|
|
uint32 getHeight() const { return handle->height; }
|
|
|
|
|
uint32 getDepth() const { return handle->depth; }
|
|
|
|
|
PTextureHandle getHandle() const { return handle; }
|
|
|
|
|
MTL::Texture* getImage() const { return handle->texture; };
|
|
|
|
|
constexpr Gfx::SeImageLayout getLayout() const { return handle->layout; }
|
|
|
|
|
void setLayout(Gfx::SeImageLayout val) { handle->layout = val; }
|
|
|
|
|
constexpr Gfx::SeImageAspectFlags getAspect() const { return handle->aspect; }
|
|
|
|
|
constexpr Gfx::SeImageUsageFlags getUsage() const { return handle->usage; }
|
|
|
|
|
constexpr Gfx::SeFormat getFormat() const { return handle->format; }
|
|
|
|
|
constexpr Gfx::SeSampleCountFlags getNumSamples() const { return handle->samples; }
|
|
|
|
|
constexpr uint32 getMipLevels() const { return handle->mipLevels; }
|
|
|
|
|
constexpr bool isDepthStencil() const { return handle->aspect & (Gfx::SE_IMAGE_ASPECT_DEPTH_BIT | Gfx::SE_IMAGE_ASPECT_STENCIL_BIT); }
|
|
|
|
|
|
|
|
|
|
void pipelineBarrier(Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage, Gfx::SeAccessFlags dstAccess,
|
2024-08-28 17:54:14 +02:00
|
|
|
Gfx::SePipelineStageFlags dstStage);
|
2024-08-26 21:49:09 +02:00
|
|
|
void transferOwnership(Gfx::QueueType newOwner);
|
2024-08-28 17:54:14 +02:00
|
|
|
void changeLayout(Gfx::SeImageLayout newLayout, Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage,
|
|
|
|
|
Gfx::SeAccessFlags dstAccess, Gfx::SePipelineStageFlags dstStage);
|
2024-08-26 21:49:09 +02:00
|
|
|
void download(uint32 mipLevel, uint32 arrayLayer, uint32 face, Array<uint8>& buffer);
|
|
|
|
|
void generateMipmaps();
|
2024-08-28 17:54:14 +02:00
|
|
|
|
2024-08-26 21:49:09 +02:00
|
|
|
protected:
|
|
|
|
|
OTextureHandle handle;
|
|
|
|
|
// Updates via reference
|
|
|
|
|
PGraphics graphics;
|
|
|
|
|
Gfx::QueueType initialOwner;
|
2024-04-09 16:41:12 +02:00
|
|
|
friend class Graphics;
|
|
|
|
|
};
|
|
|
|
|
DEFINE_REF(TextureBase)
|
2024-08-26 21:49:09 +02:00
|
|
|
|
2024-06-09 12:20:04 +02:00
|
|
|
class Texture2D : public Gfx::Texture2D, public TextureBase {
|
|
|
|
|
public:
|
2024-08-26 21:49:09 +02:00
|
|
|
Texture2D(PGraphics graphics, const TextureCreateInfo& createInfo, MTL::Texture* existingImage = nullptr);
|
2024-04-09 16:41:12 +02:00
|
|
|
virtual ~Texture2D();
|
2024-08-26 21:49:09 +02:00
|
|
|
virtual uint32 getWidth() const override { return handle->width; }
|
|
|
|
|
virtual uint32 getHeight() const override { return handle->height; }
|
|
|
|
|
virtual uint32 getDepth() const override { return handle->depth; }
|
|
|
|
|
virtual Gfx::SeFormat getFormat() const override { return handle->format; }
|
|
|
|
|
virtual Gfx::SeSampleCountFlags getNumSamples() const override { return handle->samples; }
|
|
|
|
|
virtual uint32 getMipLevels() const override { return handle->mipLevels; }
|
2024-06-09 12:20:04 +02:00
|
|
|
virtual void changeLayout(Gfx::SeImageLayout newLayout, Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage,
|
|
|
|
|
Gfx::SeAccessFlags dstAccess, Gfx::SePipelineStageFlags dstStage) override;
|
2024-04-09 18:24:21 +02:00
|
|
|
virtual void download(uint32 mipLevel, uint32 arrayLayer, uint32 face, Array<uint8>& buffer) override;
|
2024-08-26 21:49:09 +02:00
|
|
|
virtual void generateMipmaps() override;
|
2024-04-09 18:24:21 +02:00
|
|
|
|
2024-06-09 12:20:04 +02:00
|
|
|
protected:
|
2024-04-09 18:24:21 +02:00
|
|
|
// Inherited via QueueOwnedResource
|
2024-04-09 16:41:12 +02:00
|
|
|
virtual void executeOwnershipBarrier(Gfx::QueueType newOwner) override;
|
2024-06-09 12:20:04 +02:00
|
|
|
virtual void executePipelineBarrier(Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage, Gfx::SeAccessFlags dstAccess,
|
|
|
|
|
Gfx::SePipelineStageFlags dstStage) override;
|
2024-04-09 16:41:12 +02:00
|
|
|
};
|
|
|
|
|
DEFINE_REF(Texture2D)
|
2024-08-26 21:49:09 +02:00
|
|
|
|
2024-06-09 12:20:04 +02:00
|
|
|
class Texture3D : public Gfx::Texture3D, public TextureBase {
|
|
|
|
|
public:
|
2024-04-09 18:24:21 +02:00
|
|
|
Texture3D(PGraphics graphics, const TextureCreateInfo& createInfo);
|
|
|
|
|
virtual ~Texture3D();
|
2024-08-26 21:49:09 +02:00
|
|
|
virtual uint32 getWidth() const override { return handle->width; }
|
|
|
|
|
virtual uint32 getHeight() const override { return handle->height; }
|
|
|
|
|
virtual uint32 getDepth() const override { return handle->depth; }
|
|
|
|
|
virtual Gfx::SeFormat getFormat() const override { return handle->format; }
|
|
|
|
|
virtual Gfx::SeSampleCountFlags getNumSamples() const override { return handle->samples; }
|
|
|
|
|
virtual uint32 getMipLevels() const override { return handle->mipLevels; }
|
2024-06-09 12:20:04 +02:00
|
|
|
virtual void changeLayout(Gfx::SeImageLayout newLayout, Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage,
|
|
|
|
|
Gfx::SeAccessFlags dstAccess, Gfx::SePipelineStageFlags dstStage) override;
|
2024-04-09 18:24:21 +02:00
|
|
|
virtual void download(uint32 mipLevel, uint32 arrayLayer, uint32 face, Array<uint8>& buffer) override;
|
2024-08-26 21:49:09 +02:00
|
|
|
virtual void generateMipmaps() override;
|
2024-04-09 18:24:21 +02:00
|
|
|
|
2024-06-09 12:20:04 +02:00
|
|
|
protected:
|
2024-04-09 18:24:21 +02:00
|
|
|
// Inherited via QueueOwnedResource
|
|
|
|
|
virtual void executeOwnershipBarrier(Gfx::QueueType newOwner) override;
|
2024-06-09 12:20:04 +02:00
|
|
|
virtual void executePipelineBarrier(Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage, Gfx::SeAccessFlags dstAccess,
|
|
|
|
|
Gfx::SePipelineStageFlags dstStage) override;
|
2024-04-09 16:41:12 +02:00
|
|
|
};
|
|
|
|
|
DEFINE_REF(Texture3D)
|
2024-08-26 21:49:09 +02:00
|
|
|
|
|
|
|
|
class TextureCube : public Gfx::TextureCube, public TextureBase {
|
2024-06-09 12:20:04 +02:00
|
|
|
public:
|
2024-04-09 18:24:21 +02:00
|
|
|
TextureCube(PGraphics graphics, const TextureCreateInfo& createInfo);
|
|
|
|
|
virtual ~TextureCube();
|
2024-08-26 21:49:09 +02:00
|
|
|
virtual uint32 getWidth() const override { return handle->width; }
|
|
|
|
|
virtual uint32 getHeight() const override { return handle->height; }
|
|
|
|
|
virtual uint32 getDepth() const override { return handle->depth; }
|
|
|
|
|
virtual Gfx::SeFormat getFormat() const override { return handle->format; }
|
|
|
|
|
virtual Gfx::SeSampleCountFlags getNumSamples() const override { return handle->samples; }
|
|
|
|
|
virtual uint32 getMipLevels() const override { return handle->mipLevels; }
|
2024-06-09 12:20:04 +02:00
|
|
|
virtual void changeLayout(Gfx::SeImageLayout newLayout, Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage,
|
|
|
|
|
Gfx::SeAccessFlags dstAccess, Gfx::SePipelineStageFlags dstStage) override;
|
2024-04-09 18:24:21 +02:00
|
|
|
virtual void download(uint32 mipLevel, uint32 arrayLayer, uint32 face, Array<uint8>& buffer) override;
|
2024-08-26 21:49:09 +02:00
|
|
|
virtual void generateMipmaps() override;
|
2024-06-09 12:20:04 +02:00
|
|
|
|
|
|
|
|
protected:
|
2024-04-09 18:24:21 +02:00
|
|
|
// Inherited via QueueOwnedResource
|
|
|
|
|
virtual void executeOwnershipBarrier(Gfx::QueueType newOwner) override;
|
2024-06-09 12:20:04 +02:00
|
|
|
virtual void executePipelineBarrier(Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage, Gfx::SeAccessFlags dstAccess,
|
|
|
|
|
Gfx::SePipelineStageFlags dstStage) override;
|
2024-04-09 16:41:12 +02:00
|
|
|
};
|
|
|
|
|
DEFINE_REF(TextureCube)
|
2024-06-09 12:20:04 +02:00
|
|
|
} // namespace Metal
|
2025-03-04 19:38:03 +09:00
|
|
|
} // namespace Seele
|