Files
Seele/src/Engine/Graphics/Metal/Texture.mm
T

179 lines
7.4 KiB
Plaintext
Raw Normal View History

2024-04-09 16:41:12 +02:00
#include "Texture.h"
2024-04-09 18:24:21 +02:00
#include "Enums.h"
2024-04-09 16:41:12 +02:00
#include "Graphics/Enums.h"
#include "Graphics/Initializer.h"
#include "Graphics/Metal/Graphics.h"
2024-04-10 15:50:20 +02:00
#include "Metal/MTLTypes.hpp"
2024-04-09 16:41:12 +02:00
using namespace Seele;
using namespace Seele::Metal;
2024-04-09 18:24:21 +02:00
TextureBase::TextureBase(PGraphics graphics, MTL::TextureType type,
const TextureCreateInfo &createInfo,
Gfx::QueueType &owner, MTL::Texture *existingImage)
: currentOwner(owner), graphics(graphics), width(createInfo.width),
height(createInfo.height), depth(createInfo.depth),
arrayCount(createInfo.elements), layerCount(createInfo.layers),
mipLevels(createInfo.mipLevels), samples(createInfo.samples),
format(createInfo.format), usage(createInfo.usage),
texture(existingImage), type(type),
layout(Gfx::SE_IMAGE_LAYOUT_UNDEFINED),
ownsImage(existingImage == nullptr) {
if (existingImage == nullptr) {
MTL::TextureUsage mtlUsage = 0;
2024-06-09 12:20:04 +02:00
if (usage & Gfx::SE_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT ||
usage & Gfx::SE_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
mtlUsage |= MTL::TextureUsageRenderTarget;
2024-04-09 16:41:12 +02:00
}
2024-06-09 12:20:04 +02:00
if (usage & Gfx::SE_IMAGE_USAGE_SAMPLED_BIT) {
mtlUsage |= MTL::TextureUsageShaderRead;
}
if (usage & Gfx::SE_IMAGE_USAGE_STORAGE_BIT) {
mtlUsage |= MTL::TextureUsageShaderWrite;
2024-04-09 18:24:21 +02:00
}
MTL::TextureDescriptor *descriptor =
MTL::TextureDescriptor::alloc()->init();
descriptor->setPixelFormat(cast(format));
descriptor->setWidth(width);
descriptor->setHeight(height);
descriptor->setDepth(depth);
descriptor->setArrayLength(arrayCount);
descriptor->setMipmapLevelCount(mipLevels);
descriptor->setTextureType(type);
descriptor->setSampleCount(samples);
descriptor->setUsage(mtlUsage);
2024-06-09 12:20:04 +02:00
2024-04-09 18:24:21 +02:00
texture = graphics->getDevice()->newTexture(descriptor);
descriptor->release();
}
2024-06-09 12:20:04 +02:00
// if(createInfo.sourceData.data != nullptr)
// {
// MTL::Region region(0, 0, 0, width, height, depth);
// texture->replaceRegion(region, 0, createInfo.sourceData.data,
// createInfo.sourceData.size / (depth * height));
// }
2024-04-09 16:41:12 +02:00
}
2024-04-09 18:24:21 +02:00
TextureBase::~TextureBase() {
if (ownsImage) {
texture->release();
}
}
void TextureBase::executePipelineBarrier(Gfx::SeAccessFlags,
Gfx::SePipelineStageFlags,
Gfx::SeAccessFlags,
2024-04-11 12:38:42 +02:00
Gfx::SePipelineStageFlags) {}
2024-04-09 18:24:21 +02:00
void TextureBase::changeLayout(Gfx::SeImageLayout, Gfx::SeAccessFlags,
Gfx::SePipelineStageFlags, Gfx::SeAccessFlags,
Gfx::SePipelineStageFlags) {}
2024-06-09 12:20:04 +02:00
void TextureBase::download(uint32, uint32, uint32, Array<uint8> &) {}
2024-04-09 18:24:21 +02:00
Texture2D::Texture2D(PGraphics graphics, const TextureCreateInfo &createInfo,
MTL::Texture *exisitingTexture)
: Gfx::Texture2D(graphics->getFamilyMapping(), createInfo.sourceData.owner),
TextureBase(graphics,
createInfo.elements > 1
? (createInfo.samples > 1
? MTL::TextureType2DMultisampleArray
: MTL::TextureType2DArray)
: (createInfo.samples > 1 ? MTL::TextureType2DMultisample
: MTL::TextureType2D),
createInfo, Gfx::Texture2D::currentOwner, exisitingTexture) {}
2024-06-09 12:20:04 +02:00
Texture2D::~Texture2D() {}
void Texture2D::changeLayout(Gfx::SeImageLayout newLayout,
Gfx::SeAccessFlags srcAccess,
Gfx::SePipelineStageFlags srcStage,
Gfx::SeAccessFlags dstAccess,
Gfx::SePipelineStageFlags dstStage) {
TextureBase::changeLayout(newLayout, srcAccess, srcStage, dstAccess,
dstStage);
2024-04-09 18:24:21 +02:00
}
2024-06-09 12:20:04 +02:00
void Texture2D::download(uint32 mipLevel, uint32 arrayLayer, uint32 face,
Array<uint8> &buffer) {
TextureBase::download(mipLevel, arrayLayer, face, buffer);
2024-04-09 18:24:21 +02:00
}
2024-06-09 12:20:04 +02:00
void Texture2D::executeOwnershipBarrier(Gfx::QueueType newOwner) {
TextureBase::executeOwnershipBarrier(newOwner);
2024-04-09 18:24:21 +02:00
}
2024-06-09 12:20:04 +02:00
void Texture2D::executePipelineBarrier(Gfx::SeAccessFlags srcAccess,
Gfx::SePipelineStageFlags srcStage,
Gfx::SeAccessFlags dstAccess,
Gfx::SePipelineStageFlags dstStage) {
TextureBase::executePipelineBarrier(srcAccess, srcStage, dstAccess, dstStage);
2024-04-09 18:24:21 +02:00
}
2024-06-09 12:20:04 +02:00
Texture3D::Texture3D(PGraphics graphics, const TextureCreateInfo &createInfo)
: Gfx::Texture3D(graphics->getFamilyMapping(), createInfo.sourceData.owner),
TextureBase(graphics, MTL::TextureType3D, createInfo,
Gfx::Texture3D::currentOwner) {}
Texture3D::~Texture3D() {}
void Texture3D::changeLayout(Gfx::SeImageLayout newLayout,
Gfx::SeAccessFlags srcAccess,
Gfx::SePipelineStageFlags srcStage,
Gfx::SeAccessFlags dstAccess,
Gfx::SePipelineStageFlags dstStage) {
TextureBase::changeLayout(newLayout, srcAccess, srcStage, dstAccess,
dstStage);
2024-04-09 18:24:21 +02:00
}
2024-06-09 12:20:04 +02:00
void Texture3D::download(uint32 mipLevel, uint32 arrayLayer, uint32 face,
Array<uint8> &buffer) {
TextureBase::download(mipLevel, arrayLayer, face, buffer);
}
void Texture3D::executeOwnershipBarrier(Gfx::QueueType newOwner) {
TextureBase::executeOwnershipBarrier(newOwner);
2024-04-09 18:24:21 +02:00
}
2024-06-09 12:20:04 +02:00
void Texture3D::executePipelineBarrier(Gfx::SeAccessFlags srcAccess,
Gfx::SePipelineStageFlags srcStage,
Gfx::SeAccessFlags dstAccess,
Gfx::SePipelineStageFlags dstStage) {
TextureBase::executePipelineBarrier(srcAccess, srcStage, dstAccess, dstStage);
2024-04-09 18:24:21 +02:00
}
2024-06-09 12:20:04 +02:00
TextureCube::TextureCube(PGraphics graphics,
const TextureCreateInfo &createInfo)
: Gfx::TextureCube(graphics->getFamilyMapping(),
createInfo.sourceData.owner),
TextureBase(graphics,
createInfo.elements > 1 ? MTL::TextureTypeCubeArray
: MTL::TextureTypeCube,
createInfo, Gfx::TextureCube::currentOwner) {}
TextureCube::~TextureCube() {}
void TextureCube::changeLayout(Gfx::SeImageLayout newLayout,
Gfx::SeAccessFlags srcAccess,
Gfx::SePipelineStageFlags srcStage,
Gfx::SeAccessFlags dstAccess,
Gfx::SePipelineStageFlags dstStage) {
TextureBase::changeLayout(newLayout, srcAccess, srcStage, dstAccess,
dstStage);
2024-04-09 18:24:21 +02:00
}
2024-06-09 12:20:04 +02:00
void TextureCube::download(uint32 mipLevel, uint32 arrayLayer, uint32 face,
Array<uint8> &buffer) {
TextureBase::download(mipLevel, arrayLayer, face, buffer);
}
void TextureCube::executeOwnershipBarrier(Gfx::QueueType newOwner) {
TextureBase::executeOwnershipBarrier(newOwner);
2024-04-09 18:24:21 +02:00
}
2024-06-09 12:20:04 +02:00
void TextureCube::executePipelineBarrier(Gfx::SeAccessFlags srcAccess,
Gfx::SePipelineStageFlags srcStage,
Gfx::SeAccessFlags dstAccess,
Gfx::SePipelineStageFlags dstStage) {
TextureBase::executePipelineBarrier(srcAccess, srcStage, dstAccess, dstStage);
2024-04-09 18:24:21 +02:00
}