diff --git a/renderer/include/rive/renderer/vulkan/render_context_vulkan_impl.hpp b/renderer/include/rive/renderer/vulkan/render_context_vulkan_impl.hpp index 869d9d579..88f459777 100644 --- a/renderer/include/rive/renderer/vulkan/render_context_vulkan_impl.hpp +++ b/renderer/include/rive/renderer/vulkan/render_context_vulkan_impl.hpp @@ -67,6 +67,10 @@ class RenderContextVulkanImpl : public RenderContextImpl uint32_t mipLevelCount, const uint8_t imageDataRGBAPremul[]) override; + rcp makeImageTexture(uint32_t width, uint32_t height, + uint32_t mipLevelCount, + rcp imageBufferRGBAPremul); + void hotloadShaders(rive::Span spirvData); private: diff --git a/renderer/include/rive/renderer/vulkan/vkutil.hpp b/renderer/include/rive/renderer/vulkan/vkutil.hpp index 356a1db40..154ee9ece 100644 --- a/renderer/include/rive/renderer/vulkan/vkutil.hpp +++ b/renderer/include/rive/renderer/vulkan/vkutil.hpp @@ -214,6 +214,9 @@ class Texture2D : public rive::gpu::Texture // Deferred mechanism for uploading image data without a command buffer. void scheduleUpload(const void* imageData, size_t imageDataSizeInBytes); + // Deferred mechanism for uploading image data without a command buffer. + void scheduleUpload(rcp imageBuffer); + void barrier(VkCommandBuffer, const ImageAccess& dstAccess, ImageAccessAction = ImageAccessAction::preserveContents, diff --git a/renderer/src/vulkan/render_context_vulkan_impl.cpp b/renderer/src/vulkan/render_context_vulkan_impl.cpp index 9351a1035..67fad839a 100644 --- a/renderer/src/vulkan/render_context_vulkan_impl.cpp +++ b/renderer/src/vulkan/render_context_vulkan_impl.cpp @@ -88,6 +88,20 @@ rcp RenderContextVulkanImpl::makeImageTexture( return texture; } +rcp RenderContextVulkanImpl::makeImageTexture( + uint32_t width, uint32_t height, uint32_t mipLevelCount, + rcp imageBufferRGBAPremul) +{ + assert(imageBufferRGBAPremul->info().size >= height * width * 4); + auto texture = m_vk->makeTexture2D({ + .format = VK_FORMAT_R8G8B8A8_UNORM, + .extent = {width, height}, + .mipLevels = mipLevelCount, + }); + texture->scheduleUpload(imageBufferRGBAPremul); + return texture; +} + // Renders color ramps to the gradient texture. class RenderContextVulkanImpl::ColorRampPipeline { diff --git a/renderer/src/vulkan/vkutil.cpp b/renderer/src/vulkan/vkutil.cpp index 1af75f654..299a48a87 100644 --- a/renderer/src/vulkan/vkutil.cpp +++ b/renderer/src/vulkan/vkutil.cpp @@ -271,14 +271,20 @@ Texture2D::Texture2D(rcp vk, VkImageCreateInfo info) : void Texture2D::scheduleUpload(const void* imageData, size_t imageDataSizeInBytes) { - m_imageUploadBuffer = m_image->vk()->makeBuffer( - { - .size = imageDataSizeInBytes, - .usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - }, - vkutil::Mappability::writeOnly); - memcpy(m_imageUploadBuffer->contents(), imageData, imageDataSizeInBytes); - m_imageUploadBuffer->flushContents(); + rcp imageUploadBuffer = m_image->vk()->makeBuffer( + { + .size = imageDataSizeInBytes, + .usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + }, + vkutil::Mappability::writeOnly); + memcpy(imageUploadBuffer->contents(), imageData, imageDataSizeInBytes); + scheduleUpload(imageUploadBuffer); +} + +void Texture2D::scheduleUpload(rcp imageBuffer) +{ + m_imageUploadBuffer = imageBuffer; + m_imageUploadBuffer->flushContents(); } void Texture2D::applyImageUploadBuffer(VkCommandBuffer commandBuffer)