#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(args.samplerArgs)) { } mijin::Task> Texture::c_createSingleColor(const ObjectPtr& device, const SingleColorTextureArgs& args) { ObjectPtr 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> Texture::c_createFromBitmap(const ObjectPtr& 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 = device->createChild(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