#include "gdk/gdkmemoryformatprivate.h"
-typedef struct _GskVulkanUploadOp GskVulkanUploadOp;
+static void
+gsk_vulkan_upload_op_upload (GskVulkanOp *op,
+ GskVulkanUploader *uploader)
+{
+}
+
+static gsize
+gsk_vulkan_upload_op_count_vertex_data (GskVulkanOp *op,
+ gsize n_bytes)
+{
+ return n_bytes;
+}
+
+static void
+gsk_vulkan_upload_op_collect_vertex_data (GskVulkanOp *op,
+ guchar *data)
+{
+}
+
+static void
+gsk_vulkan_upload_op_reserve_descriptor_sets (GskVulkanOp *op,
+ GskVulkanRender *render)
+{
+}
+
+static GskVulkanOp *
+gsk_vulkan_upload_op_command (GskVulkanOp *op,
+ GskVulkanRender *render,
+ VkPipelineLayout pipeline_layout,
+ VkCommandBuffer command_buffer,
+ GskVulkanImage *image,
+ void (* draw_func) (GskVulkanOp *, guchar *, gsize),
+ GskVulkanBuffer **buffer)
+{
+ gsize stride;
+ guchar *data;
+
+ data = gsk_vulkan_image_try_map (image, &stride);
+ if (data)
+ {
+ draw_func (op, data, stride);
+
+ gsk_vulkan_image_unmap (image);
+ *buffer = NULL;
+ }
+ else
+ {
+ stride = gsk_vulkan_image_get_width (image) *
+ gdk_memory_format_bytes_per_pixel (gsk_vulkan_image_get_format (image));
+ *buffer = gsk_vulkan_buffer_new_map (gsk_vulkan_render_get_context (render),
+ gsk_vulkan_image_get_height (image) * stride,
+ GSK_VULKAN_WRITE);
+ data = gsk_vulkan_buffer_map (*buffer);
+
+ draw_func (op, data, stride);
+
+ gsk_vulkan_buffer_unmap (*buffer);
+
+ vkCmdPipelineBarrier (command_buffer,
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
+ 0,
+ 0, NULL,
+ 1, &(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 (*buffer),
+ .offset = 0,
+ .size = VK_WHOLE_SIZE,
+ },
+ 1, &(VkImageMemoryBarrier) {
+ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+ .srcAccessMask = gsk_vulkan_image_get_vk_access (image),
+ .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
+ .oldLayout = gsk_vulkan_image_get_vk_image_layout (image),
+ .newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .image = gsk_vulkan_image_get_vk_image (image),
+ .subresourceRange = {
+ .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+ .baseMipLevel = 0,
+ .levelCount = 1,
+ .baseArrayLayer = 0,
+ .layerCount = 1
+ },
+ });
+ gsk_vulkan_image_set_vk_image_layout (image,
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ VK_ACCESS_TRANSFER_WRITE_BIT);
+
+ vkCmdCopyBufferToImage (command_buffer,
+ gsk_vulkan_buffer_get_buffer (*buffer),
+ gsk_vulkan_image_get_vk_image (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 = gsk_vulkan_image_get_width (image),
+ .height = gsk_vulkan_image_get_height (image),
+ .depth = 1
+ }
+ }
+ });
+ }
+
+ vkCmdPipelineBarrier (command_buffer,
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
+ 0,
+ 0, NULL,
+ 0, NULL,
+ 1, &(VkImageMemoryBarrier) {
+ .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+ .srcAccessMask = gsk_vulkan_image_get_vk_access (image),
+ .dstAccessMask = VK_ACCESS_SHADER_READ_BIT,
+ .oldLayout = gsk_vulkan_image_get_vk_image_layout (image),
+ .newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
+ .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
+ .image = gsk_vulkan_image_get_vk_image (image),
+ .subresourceRange = {
+ .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+ .baseMipLevel = 0,
+ .levelCount = 1,
+ .baseArrayLayer = 0,
+ .layerCount = 1
+ },
+ });
-struct _GskVulkanUploadOp
+ gsk_vulkan_image_set_vk_image_layout (image,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
+ VK_ACCESS_SHADER_READ_BIT);
+
+ return op->next;
+}
+
+typedef struct _GskVulkanUploadTextureOp GskVulkanUploadTextureOp;
+
+struct _GskVulkanUploadTextureOp
{
GskVulkanOp op;
GskVulkanImage *image;
+ GskVulkanBuffer *buffer;
GdkTexture *texture;
};
static void
-gsk_vulkan_upload_op_finish (GskVulkanOp *op)
+gsk_vulkan_upload_texture_op_finish (GskVulkanOp *op)
{
- GskVulkanUploadOp *self = (GskVulkanUploadOp *) op;
+ GskVulkanUploadTextureOp *self = (GskVulkanUploadTextureOp *) op;
g_object_unref (self->image);
+ g_clear_pointer (&self->buffer, gsk_vulkan_buffer_free);
g_object_unref (self->texture);
}
static void
-gsk_vulkan_upload_op_print (GskVulkanOp *op,
- GString *string,
- guint indent)
+gsk_vulkan_upload_texture_op_print (GskVulkanOp *op,
+ GString *string,
+ guint indent)
{
- GskVulkanUploadOp *self = (GskVulkanUploadOp *) op;
+ GskVulkanUploadTextureOp *self = (GskVulkanUploadTextureOp *) op;
print_indent (string, indent);
- g_string_append (string, "upload ");
+ g_string_append (string, "upload-texture ");
print_image (string, self->image);
print_newline (string);
}
static void
-gsk_vulkan_upload_op_upload (GskVulkanOp *op,
- GskVulkanUploader *uploader)
+gsk_vulkan_upload_texture_op_draw (GskVulkanOp *op,
+ guchar *data,
+ gsize stride)
{
- GskVulkanUploadOp *self = (GskVulkanUploadOp *) op;
+ GskVulkanUploadTextureOp *self = (GskVulkanUploadTextureOp *) op;
GdkTextureDownloader *downloader;
- GskVulkanImageMap map;
downloader = gdk_texture_downloader_new (self->texture);
gdk_texture_downloader_set_format (downloader, gsk_vulkan_image_get_format (self->image));
- gsk_vulkan_image_map_memory (self->image, uploader, GSK_VULKAN_WRITE, &map);
- gdk_texture_downloader_download_into (downloader, map.data, map.stride);
- gsk_vulkan_image_unmap_memory (self->image, uploader, &map);
+ gdk_texture_downloader_download_into (downloader, data, stride);
gdk_texture_downloader_free (downloader);
}
-static gsize
-gsk_vulkan_upload_op_count_vertex_data (GskVulkanOp *op,
- gsize n_bytes)
-{
- return n_bytes;
-}
-
-static void
-gsk_vulkan_upload_op_collect_vertex_data (GskVulkanOp *op,
- guchar *data)
-{
-}
-
-static void
-gsk_vulkan_upload_op_reserve_descriptor_sets (GskVulkanOp *op,
- GskVulkanRender *render)
-{
-}
-
static GskVulkanOp *
-gsk_vulkan_upload_op_command (GskVulkanOp *op,
- GskVulkanRender *render,
- VkPipelineLayout pipeline_layout,
- VkCommandBuffer command_buffer)
+gsk_vulkan_upload_texture_op_command (GskVulkanOp *op,
+ GskVulkanRender *render,
+ VkPipelineLayout pipeline_layout,
+ VkCommandBuffer command_buffer)
{
- return op->next;
+ GskVulkanUploadTextureOp *self = (GskVulkanUploadTextureOp *) op;
+
+ return gsk_vulkan_upload_op_command (op,
+ render,
+ pipeline_layout,
+ command_buffer,
+ self->image,
+ gsk_vulkan_upload_texture_op_draw,
+ &self->buffer);
}
-static const GskVulkanOpClass GSK_VULKAN_UPLOAD_OP_CLASS = {
- GSK_VULKAN_OP_SIZE (GskVulkanUploadOp),
+static const GskVulkanOpClass GSK_VULKAN_UPLOAD_TEXTURE_OP_CLASS = {
+ GSK_VULKAN_OP_SIZE (GskVulkanUploadTextureOp),
GSK_VULKAN_STAGE_UPLOAD,
NULL,
NULL,
- gsk_vulkan_upload_op_finish,
- gsk_vulkan_upload_op_print,
+ gsk_vulkan_upload_texture_op_finish,
+ gsk_vulkan_upload_texture_op_print,
gsk_vulkan_upload_op_upload,
gsk_vulkan_upload_op_count_vertex_data,
gsk_vulkan_upload_op_collect_vertex_data,
gsk_vulkan_upload_op_reserve_descriptor_sets,
- gsk_vulkan_upload_op_command
+ gsk_vulkan_upload_texture_op_command
};
GskVulkanImage *
-gsk_vulkan_upload_op (GskVulkanRender *render,
- GdkVulkanContext *context,
- GdkTexture *texture)
+gsk_vulkan_upload_texture_op (GskVulkanRender *render,
+ GdkVulkanContext *context,
+ GdkTexture *texture)
{
- GskVulkanUploadOp *self;
+ GskVulkanUploadTextureOp *self;
- self = (GskVulkanUploadOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_UPLOAD_OP_CLASS);
+ self = (GskVulkanUploadTextureOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_UPLOAD_TEXTURE_OP_CLASS);
self->texture = g_object_ref (texture);
self->image = gsk_vulkan_image_new_for_upload (context,
}
static void
-gsk_vulkan_upload_cairo_op_draw (GskVulkanUploadCairoOp *self,
- guchar *data,
- gsize stride)
+gsk_vulkan_upload_cairo_op_draw (GskVulkanOp *op,
+ guchar *data,
+ gsize stride)
{
+ GskVulkanUploadCairoOp *self = (GskVulkanUploadCairoOp *) op;
cairo_surface_t *surface;
cairo_t *cr;
int width, height;
cairo_surface_destroy (surface);
}
-static void
-gsk_vulkan_upload_cairo_op_upload (GskVulkanOp *op,
- GskVulkanUploader *uploader)
-{
-}
-
-static gsize
-gsk_vulkan_upload_cairo_op_count_vertex_data (GskVulkanOp *op,
- gsize n_bytes)
-{
- return n_bytes;
-}
-
-static void
-gsk_vulkan_upload_cairo_op_collect_vertex_data (GskVulkanOp *op,
- guchar *data)
-{
-}
-
-static void
-gsk_vulkan_upload_cairo_op_reserve_descriptor_sets (GskVulkanOp *op,
- GskVulkanRender *render)
-{
-}
-
static GskVulkanOp *
gsk_vulkan_upload_cairo_op_command (GskVulkanOp *op,
GskVulkanRender *render,
VkCommandBuffer command_buffer)
{
GskVulkanUploadCairoOp *self = (GskVulkanUploadCairoOp *) op;
- gsize stride;
- guchar *data;
-
- data = gsk_vulkan_image_try_map (self->image, &stride);
- if (data)
- {
- gsk_vulkan_upload_cairo_op_draw (self, data, stride);
-
- gsk_vulkan_image_unmap (self->image);
- }
- else
- {
- stride = gsk_vulkan_image_get_width (self->image) *
- gdk_memory_format_bytes_per_pixel (gsk_vulkan_image_get_format (self->image));
- self->buffer = gsk_vulkan_buffer_new_map (gsk_vulkan_render_get_context (render),
- gsk_vulkan_image_get_height (self->image) * stride,
- GSK_VULKAN_WRITE);
- data = gsk_vulkan_buffer_map (self->buffer);
-
- gsk_vulkan_upload_cairo_op_draw (self, data, stride);
-
- gsk_vulkan_buffer_unmap (self->buffer);
-
- vkCmdPipelineBarrier (command_buffer,
- VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
- VK_PIPELINE_STAGE_TRANSFER_BIT,
- 0,
- 0, NULL,
- 1, &(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 (self->buffer),
- .offset = 0,
- .size = VK_WHOLE_SIZE,
- },
- 1, &(VkImageMemoryBarrier) {
- .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
- .srcAccessMask = gsk_vulkan_image_get_vk_access (self->image),
- .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
- .oldLayout = gsk_vulkan_image_get_vk_image_layout (self->image),
- .newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
- .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
- .image = gsk_vulkan_image_get_vk_image (self->image),
- .subresourceRange = {
- .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
- .baseMipLevel = 0,
- .levelCount = 1,
- .baseArrayLayer = 0,
- .layerCount = 1
- },
- });
- gsk_vulkan_image_set_vk_image_layout (self->image,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- VK_ACCESS_TRANSFER_WRITE_BIT);
-
- vkCmdCopyBufferToImage (command_buffer,
- gsk_vulkan_buffer_get_buffer (self->buffer),
- gsk_vulkan_image_get_vk_image (self->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 = gsk_vulkan_image_get_width (self->image),
- .height = gsk_vulkan_image_get_height (self->image),
- .depth = 1
- }
- }
- });
- }
- vkCmdPipelineBarrier (command_buffer,
- VK_PIPELINE_STAGE_TRANSFER_BIT,
- VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
- 0,
- 0, NULL,
- 0, NULL,
- 1, &(VkImageMemoryBarrier) {
- .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
- .srcAccessMask = gsk_vulkan_image_get_vk_access (self->image),
- .dstAccessMask = VK_ACCESS_SHADER_READ_BIT,
- .oldLayout = gsk_vulkan_image_get_vk_image_layout (self->image),
- .newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
- .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
- .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
- .image = gsk_vulkan_image_get_vk_image (self->image),
- .subresourceRange = {
- .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
- .baseMipLevel = 0,
- .levelCount = 1,
- .baseArrayLayer = 0,
- .layerCount = 1
- },
- });
-
- gsk_vulkan_image_set_vk_image_layout (self->image,
- VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
- VK_ACCESS_SHADER_READ_BIT);
-
- return op->next;
+ return gsk_vulkan_upload_op_command (op,
+ render,
+ pipeline_layout,
+ command_buffer,
+ self->image,
+ gsk_vulkan_upload_cairo_op_draw,
+ &self->buffer);
}
static const GskVulkanOpClass GSK_VULKAN_UPLOAD_CAIRO_OP_CLASS = {
NULL,
gsk_vulkan_upload_cairo_op_finish,
gsk_vulkan_upload_cairo_op_print,
- gsk_vulkan_upload_cairo_op_upload,
- gsk_vulkan_upload_cairo_op_count_vertex_data,
- gsk_vulkan_upload_cairo_op_collect_vertex_data,
- gsk_vulkan_upload_cairo_op_reserve_descriptor_sets,
+ gsk_vulkan_upload_op_upload,
+ gsk_vulkan_upload_op_count_vertex_data,
+ gsk_vulkan_upload_op_collect_vertex_data,
+ gsk_vulkan_upload_op_reserve_descriptor_sets,
gsk_vulkan_upload_cairo_op_command
};