iwa/source/texture.cpp
2024-04-06 14:11:26 +02:00

48 lines
1.8 KiB
C++

#include "iwa/texture.hpp"
#include "iwa/device.hpp"
#include "iwa/resource/bitmap.hpp"
namespace iwa
{
Texture::Texture(TextureCreationArgs args) : super_t(nullptr), mImage(std::move(args.image)),
mImageView(mImage->createImageView(args.imageViewArgs)), mSampler(mImage->getOwner()->createChild<Sampler>(args.samplerArgs))
{
}
mijin::Task<ObjectPtr<Texture>> Texture::c_createSingleColor(const ObjectPtr<Device>& device, const SingleColorTextureArgs& args)
{
ObjectPtr<Bitmap> bitmap = Bitmap::create(BitmapCreationArgs{
.format = args.format,
.size = {.width = 1, .height = 1}
});
bitmap->fill(args.color);
co_return co_await c_createFromBitmap(device, {.bitmap = *bitmap});
}
mijin::Task<ObjectPtr<Texture>> Texture::c_createFromBitmap(const ObjectPtr<Device>& device, const TextureFromBitmapArgs& args)
{
ImageCreationArgs imageCreationArgs = args.imageArgs;
imageCreationArgs.format = args.bitmap.getFormat();
imageCreationArgs.extent.width = args.bitmap.getSize().width;
imageCreationArgs.extent.height = args.bitmap.getSize().height;
imageCreationArgs.extent.depth = 1;
imageCreationArgs.usage |= vk::ImageUsageFlagBits::eSampled | vk::ImageUsageFlagBits::eTransferDst;
ObjectPtr<Image> image = device->createChild<Image>(imageCreationArgs);
image->allocateMemory();
co_await image->c_upload(args.bitmap);
co_await image->c_doTransition({
.stages = vk::PipelineStageFlagBits::eFragmentShader,
.layout = vk::ImageLayout::eShaderReadOnlyOptimal,
.access = vk::AccessFlagBits::eShaderRead
});
co_return create(TextureCreationArgs{
.image = std::move(image),
.imageViewArgs = args.imageViewArgs,
.samplerArgs = args.samplerArgs
});
}
} // namespace iwa