48 lines
1.8 KiB
C++
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
|