return self;
}
-static void
-gsk_vulkan_image_upload_data (GskVulkanImage *self,
- const guchar *data,
- gsize width,
- gsize height,
- gsize data_stride)
-{
- VkImageSubresource image_res;
- VkSubresourceLayout image_layout;
- gsize mem_stride;
- guchar *mem;
-
- image_res.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- image_res.mipLevel = 0;
- image_res.arrayLayer = 0;
-
- mem_stride = width * 4;
- vkGetImageSubresourceLayout (gdk_vulkan_context_get_device (self->vulkan),
- self->vk_image, &image_res, &image_layout);
-
- mem = gsk_vulkan_memory_map (self->memory) + image_layout.offset;
-
- if (image_layout.rowPitch == width * 4 && data_stride == mem_stride)
- {
- memcpy (mem, data, data_stride * height);
- }
- else
- {
- for (gsize i = 0; i < height; i++)
- {
- memcpy (mem + i * image_layout.rowPitch, data + i * data_stride, width * 4);
- }
- }
-
- gsk_vulkan_memory_unmap (self->memory);
-}
-
static void
gsk_vulkan_image_ensure_view (GskVulkanImage *self,
VkFormat format)
&self->vk_image_view);
}
-static GskVulkanImage *
-gsk_vulkan_image_new_from_data_via_staging_buffer (GskVulkanUploader *uploader,
- const guchar *data,
- gsize width,
- gsize height,
- gsize stride)
-{
- GskVulkanImage *self;
- GskVulkanBuffer *staging;
- gsize buffer_size = width * height * 4;
- guchar *mem;
-
- staging = gsk_vulkan_buffer_new_staging (uploader->vulkan, buffer_size);
- mem = gsk_vulkan_buffer_map (staging);
-
- if (stride == width * 4)
- {
- memcpy (mem, data, stride * height);
- }
- else
- {
- for (gsize i = 0; i < height; i++)
- {
- memcpy (mem + i * width * 4, data + i * stride, width * 4);
- }
- }
-
- gsk_vulkan_buffer_unmap (staging);
-
- gsk_vulkan_uploader_add_buffer_barrier (uploader,
- FALSE,
- &(VkBufferMemoryBarrier) {
- .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
- .srcAccessMask = VK_ACCESS_HOST_WRITE_BIT,
- .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT,
- .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
- .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
- .buffer = gsk_vulkan_buffer_get_buffer (staging),
- .offset = 0,
- .size = buffer_size,
- });
-
- self = gsk_vulkan_image_new (uploader->vulkan,
- width,
- height,
- VK_IMAGE_TILING_OPTIMAL,
- VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_SAMPLED_BIT,
- VK_IMAGE_LAYOUT_UNDEFINED,
- VK_ACCESS_TRANSFER_WRITE_BIT,
- VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
-
- gsk_vulkan_uploader_add_image_barrier (uploader,
- FALSE,
- self,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- VK_ACCESS_TRANSFER_WRITE_BIT);
-
- vkCmdCopyBufferToImage (gsk_vulkan_uploader_get_copy_buffer (uploader),
- gsk_vulkan_buffer_get_buffer (staging),
- self->vk_image,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- 1,
- (VkBufferImageCopy[1]) {
- {
- .bufferOffset = 0,
- .imageSubresource = {
- .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
- .mipLevel = 0,
- .baseArrayLayer = 0,
- .layerCount = 1
- },
- .imageOffset = { 0, 0, 0 },
- .imageExtent = {
- .width = width,
- .height = height,
- .depth = 1
- }
- }
- });
-
- gsk_vulkan_uploader_add_image_barrier (uploader,
- TRUE,
- self,
- VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
- VK_ACCESS_SHADER_READ_BIT);
-
- uploader->staging_buffer_free_list = g_slist_prepend (uploader->staging_buffer_free_list, staging);
-
- gsk_vulkan_image_ensure_view (self, VK_FORMAT_B8G8R8A8_UNORM);
-
- return self;
-}
-
-static GskVulkanImage *
-gsk_vulkan_image_new_from_data_via_staging_image (GskVulkanUploader *uploader,
- const guchar *data,
- gsize width,
- gsize height,
- gsize stride)
-{
- GskVulkanImage *self, *staging;
-
- staging = gsk_vulkan_image_new (uploader->vulkan,
- width,
- height,
- VK_IMAGE_TILING_LINEAR,
- VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
- VK_IMAGE_LAYOUT_PREINITIALIZED,
- VK_ACCESS_TRANSFER_WRITE_BIT,
- VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
-
- gsk_vulkan_image_upload_data (staging, data, width, height, stride);
-
- self = gsk_vulkan_image_new (uploader->vulkan,
- width,
- height,
- VK_IMAGE_TILING_OPTIMAL,
- VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_SAMPLED_BIT,
- VK_IMAGE_LAYOUT_UNDEFINED,
- VK_ACCESS_TRANSFER_WRITE_BIT,
- VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
-
- gsk_vulkan_uploader_add_image_barrier (uploader,
- FALSE,
- staging,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- VK_ACCESS_TRANSFER_READ_BIT);
-
- gsk_vulkan_uploader_add_image_barrier (uploader,
- FALSE,
- self,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- VK_ACCESS_TRANSFER_WRITE_BIT);
-
- vkCmdCopyImage (gsk_vulkan_uploader_get_copy_buffer (uploader),
- staging->vk_image,
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- self->vk_image,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- 1,
- &(VkImageCopy) {
- .srcSubresource = {
- .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
- .mipLevel = 0,
- .baseArrayLayer = 0,
- .layerCount = 1
- },
- .srcOffset = { 0, 0, 0 },
- .dstSubresource = {
- .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
- .mipLevel = 0,
- .baseArrayLayer = 0,
- .layerCount = 1
- },
- .dstOffset = { 0, 0, 0 },
- .extent = {
- .width = width,
- .height = height,
- .depth = 1
- }
- });
-
- gsk_vulkan_uploader_add_image_barrier (uploader,
- TRUE,
- self,
- VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
- VK_ACCESS_SHADER_READ_BIT);
-
- uploader->staging_image_free_list = g_slist_prepend (uploader->staging_image_free_list, staging);
-
- gsk_vulkan_image_ensure_view (self, VK_FORMAT_B8G8R8A8_UNORM);
-
- return self;
-}
-
-static GskVulkanImage *
-gsk_vulkan_image_new_from_data_directly (GskVulkanUploader *uploader,
- const guchar *data,
- gsize width,
- gsize height,
- gsize stride)
-{
- GskVulkanImage *self;
-
- self = gsk_vulkan_image_new (uploader->vulkan,
- width,
- height,
- VK_IMAGE_TILING_LINEAR,
- VK_IMAGE_USAGE_SAMPLED_BIT,
- VK_IMAGE_LAYOUT_PREINITIALIZED,
- VK_ACCESS_HOST_WRITE_BIT,
- VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
-
- gsk_vulkan_image_upload_data (self, data, width, height, stride);
-
- gsk_vulkan_uploader_add_image_barrier (uploader,
- TRUE,
- self,
- VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
- VK_ACCESS_SHADER_READ_BIT);
-
- gsk_vulkan_image_ensure_view (self, VK_FORMAT_B8G8R8A8_UNORM);
-
- return self;
-}
-
GskVulkanImage *
gsk_vulkan_image_new_from_texture (GskVulkanUploader *uploader,
GdkTexture *texture)
return result;
}
-GskVulkanImage *
-gsk_vulkan_image_new_from_data (GskVulkanUploader *uploader,
- const guchar *data,
- gsize width,
- gsize height,
- gsize stride)
-{
- if (GSK_DEBUG_CHECK (VULKAN_STAGING_BUFFER))
- return gsk_vulkan_image_new_from_data_via_staging_buffer (uploader, data, width, height, stride);
- else if (GSK_DEBUG_CHECK (VULKAN_STAGING_IMAGE))
- return gsk_vulkan_image_new_from_data_via_staging_image (uploader, data, width, height, stride);
- else
- return gsk_vulkan_image_new_from_data_directly (uploader, data, width, height, stride);
-}
-
GskVulkanImage *
gsk_vulkan_image_new_for_upload (GskVulkanUploader *uploader,
gsize width,