diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 83d98a45b5..a8b4c32fee 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -26,7 +26,7 @@ variables: BACKEND_FLAGS: "-Dx11-backend=true -Dwayland-backend=true -Dbroadway-backend=true" FEATURE_FLAGS: "-Dvulkan=enabled -Dcloudproviders=enabled -Dbuild-testsuite=true -Dintrospection=enabled" MESON_TEST_TIMEOUT_MULTIPLIER: 3 - FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v46" + FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v48" workflow: rules: diff --git a/.gitlab-ci/fedora.Dockerfile b/.gitlab-ci/fedora.Dockerfile index 39c606e856..8523642ed4 100644 --- a/.gitlab-ci/fedora.Dockerfile +++ b/.gitlab-ci/fedora.Dockerfile @@ -32,6 +32,7 @@ RUN dnf -y install \ glib2-static \ glibc-devel \ glibc-headers \ + glslc \ gnupg2 \ gobject-introspection-devel \ graphene-devel \ diff --git a/.gitlab-ci/test-msys2.sh b/.gitlab-ci/test-msys2.sh index ddd66c185f..04894a75b8 100644 --- a/.gitlab-ci/test-msys2.sh +++ b/.gitlab-ci/test-msys2.sh @@ -32,7 +32,8 @@ pacman --noconfirm -S --needed \ mingw-w64-$MSYS2_ARCH-fribidi \ mingw-w64-$MSYS2_ARCH-gst-plugins-bad-libs \ mingw-w64-$MSYS2_ARCH-shared-mime-info \ - mingw-w64-$MSYS2_ARCH-python-gobject + mingw-w64-$MSYS2_ARCH-python-gobject \ + mingw-w64-$MSYS2_ARCH-shaderc mkdir -p _ccache export CCACHE_BASEDIR="$(pwd)" diff --git a/gdk/gdkmemoryformat.c b/gdk/gdkmemoryformat.c index 893624efcb..c4cb2b7d22 100644 --- a/gdk/gdkmemoryformat.c +++ b/gdk/gdkmemoryformat.c @@ -700,6 +700,26 @@ gdk_memory_convert (guchar *dest_data, g_assert (dest_format < GDK_MEMORY_N_FORMATS); g_assert (src_format < GDK_MEMORY_N_FORMATS); + if (src_format == dest_format) + { + gsize bytes_per_row = src_desc->bytes_per_pixel * width; + + if (bytes_per_row == src_stride && bytes_per_row == dest_stride) + { + memcpy (dest_data, src_data, bytes_per_row * height); + } + else + { + for (y = 0; y < height; y++) + { + memcpy (dest_data, src_data, bytes_per_row); + src_data += src_stride; + dest_data += dest_stride; + } + } + return; + } + if (src_format == GDK_MEMORY_R8G8B8A8 && dest_format == GDK_MEMORY_R8G8B8A8_PREMULTIPLIED) func = r8g8b8a8_to_r8g8b8a8_premultiplied; else if (src_format == GDK_MEMORY_B8G8R8A8 && dest_format == GDK_MEMORY_R8G8B8A8_PREMULTIPLIED) diff --git a/gdk/gdkvulkancontext.c b/gdk/gdkvulkancontext.c index 50bf9f8c72..0ad81ed70a 100644 --- a/gdk/gdkvulkancontext.c +++ b/gdk/gdkvulkancontext.c @@ -1050,6 +1050,7 @@ gdk_vulkan_save_pipeline_cache (GdkDisplay *display) { g_warning_once ("Failed to create pipeline cache directory"); g_free (path); + g_free (data); return FALSE; } g_free (path); @@ -1085,6 +1086,7 @@ gdk_vulkan_save_pipeline_cache (GdkDisplay *display) } g_clear_error (&error); g_object_unref (file); + g_free (data); /* try again */ return gdk_vulkan_save_pipeline_cache (display); @@ -1093,10 +1095,12 @@ gdk_vulkan_save_pipeline_cache (GdkDisplay *display) g_warning ("Failed to save pipeline cache: %s", error->message); g_clear_error (&error); g_object_unref (file); + g_free (data); return FALSE; } g_object_unref (file); + g_free (data); g_free (display->vk_pipeline_cache_etag); display->vk_pipeline_cache_etag = etag; @@ -1132,12 +1136,15 @@ gdk_display_create_pipeline_cache (GdkDisplay *display) { display->vk_pipeline_cache = gdk_display_load_pipeline_cache (display); - GDK_VK_CHECK (vkCreatePipelineCache, display->vk_device, - &(VkPipelineCacheCreateInfo) { - .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, - }, - NULL, - &display->vk_pipeline_cache); + if (display->vk_pipeline_cache == VK_NULL_HANDLE) + { + GDK_VK_CHECK (vkCreatePipelineCache, display->vk_device, + &(VkPipelineCacheCreateInfo) { + .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO, + }, + NULL, + &display->vk_pipeline_cache); + } } VkPipelineCache @@ -1649,7 +1656,7 @@ gdk_display_unref_vulkan (GdkDisplay *display) g_assert (display->vk_save_pipeline_cache_source == 0); } vkDestroyPipelineCache (display->vk_device, display->vk_pipeline_cache, NULL); - display->vk_device = VK_NULL_HANDLE; + display->vk_pipeline_cache = VK_NULL_HANDLE; g_clear_pointer (&display->vk_pipeline_cache_etag, g_free); display->vk_pipeline_cache_size = 0; diff --git a/gsk/meson.build b/gsk/meson.build index 5a86498679..489024572a 100644 --- a/gsk/meson.build +++ b/gsk/meson.build @@ -116,6 +116,7 @@ if have_vulkan 'vulkan/gskvulkancolormatrixop.c', 'vulkan/gskvulkancolorop.c', 'vulkan/gskvulkancommandpool.c', + 'vulkan/gskvulkanconvertop.c', 'vulkan/gskvulkancrossfadeop.c', 'vulkan/gskvulkandownloadop.c', 'vulkan/gskvulkanglyphcache.c', diff --git a/gsk/vulkan/gskvulkanconvertop.c b/gsk/vulkan/gskvulkanconvertop.c new file mode 100644 index 0000000000..f1280e4345 --- /dev/null +++ b/gsk/vulkan/gskvulkanconvertop.c @@ -0,0 +1,100 @@ +#include "config.h" + +#include "gskvulkanconvertopprivate.h" + +#include "gskvulkanprivate.h" +#include "gskvulkanshaderopprivate.h" + +#include "vulkan/resources/convert.vert.h" + +typedef struct _GskVulkanConvertOp GskVulkanConvertOp; + +struct _GskVulkanConvertOp +{ + GskVulkanShaderOp op; + + graphene_rect_t rect; + graphene_rect_t tex_rect; + + guint32 image_descriptor; +}; + +static void +gsk_vulkan_convert_op_print (GskVulkanOp *op, + GString *string, + guint indent) +{ + GskVulkanConvertOp *self = (GskVulkanConvertOp *) op; + GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op; + + print_indent (string, indent); + print_rect (string, &self->rect); + g_string_append (string, "convert "); + print_image (string, shader->images[0]); + print_newline (string); +} + +static void +gsk_vulkan_convert_op_collect_vertex_data (GskVulkanOp *op, + guchar *data) +{ + GskVulkanConvertOp *self = (GskVulkanConvertOp *) op; + GskVulkanConvertInstance *instance = (GskVulkanConvertInstance *) (data + ((GskVulkanShaderOp *) op)->vertex_offset); + GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op; + + instance->rect[0] = self->rect.origin.x; + instance->rect[1] = self->rect.origin.y; + instance->rect[2] = self->rect.size.width; + instance->rect[3] = self->rect.size.height; + instance->tex_rect[0] = self->tex_rect.origin.x; + instance->tex_rect[1] = self->tex_rect.origin.y; + instance->tex_rect[2] = self->tex_rect.size.width; + instance->tex_rect[3] = self->tex_rect.size.height; + instance->tex_id = self->image_descriptor; + instance->postprocess = gsk_vulkan_image_get_postprocess (shader->images[0]); +} + +static void +gsk_vulkan_convert_op_reserve_descriptor_sets (GskVulkanOp *op, + GskVulkanRender *render) +{ + GskVulkanConvertOp *self = (GskVulkanConvertOp *) op; + GskVulkanShaderOp *shader = (GskVulkanShaderOp *) op; + + self->image_descriptor = gsk_vulkan_render_get_image_descriptor (render, shader->images[0], GSK_VULKAN_SAMPLER_NEAREST); +} + +static const GskVulkanShaderOpClass GSK_VULKAN_CONVERT_OP_CLASS = { + { + GSK_VULKAN_OP_SIZE (GskVulkanConvertOp), + GSK_VULKAN_STAGE_SHADER, + gsk_vulkan_shader_op_finish, + gsk_vulkan_convert_op_print, + gsk_vulkan_shader_op_count_vertex_data, + gsk_vulkan_convert_op_collect_vertex_data, + gsk_vulkan_convert_op_reserve_descriptor_sets, + gsk_vulkan_shader_op_command + }, + "convert", + 1, + &gsk_vulkan_convert_info, +}; + +void +gsk_vulkan_convert_op (GskVulkanRender *render, + GskVulkanShaderClip clip, + GskVulkanImage *image, + const graphene_rect_t *rect, + const graphene_point_t *offset, + const graphene_rect_t *tex_rect) +{ + GskVulkanConvertOp *self; + + self = (GskVulkanConvertOp *) gsk_vulkan_shader_op_alloc (render, + &GSK_VULKAN_CONVERT_OP_CLASS, + clip, + &image); + + graphene_rect_offset_r (rect, offset->x, offset->y, &self->rect); + gsk_vulkan_normalize_tex_coords (&self->tex_rect, rect, tex_rect); +} diff --git a/gsk/vulkan/gskvulkanconvertopprivate.h b/gsk/vulkan/gskvulkanconvertopprivate.h new file mode 100644 index 0000000000..d52fb4c2dd --- /dev/null +++ b/gsk/vulkan/gskvulkanconvertopprivate.h @@ -0,0 +1,16 @@ +#pragma once + +#include "gskvulkanopprivate.h" + +G_BEGIN_DECLS + +void gsk_vulkan_convert_op (GskVulkanRender *render, + GskVulkanShaderClip clip, + GskVulkanImage *image, + const graphene_rect_t *rect, + const graphene_point_t *offset, + const graphene_rect_t *tex_rect); + + +G_END_DECLS + diff --git a/gsk/vulkan/gskvulkanimage.c b/gsk/vulkan/gskvulkanimage.c index c9eff3f501..459551b214 100644 --- a/gsk/vulkan/gskvulkanimage.c +++ b/gsk/vulkan/gskvulkanimage.c @@ -20,10 +20,12 @@ struct _GskVulkanImage VkFormat vk_format; gsize width; gsize height; + VkImageTiling vk_tiling; VkImageUsageFlags vk_usage; VkImage vk_image; VkImageView vk_image_view; VkFramebuffer vk_framebuffer; + GskVulkanImagePostprocess postprocess; VkPipelineStageFlags vk_pipeline_stage; VkImageLayout vk_image_layout; @@ -40,6 +42,7 @@ struct _GskMemoryFormatInfo { VkFormat format; VkComponentMapping components; + GskVulkanImagePostprocess postprocess; }; static const GskMemoryFormatInfo * @@ -52,8 +55,8 @@ gsk_memory_format_get_vk_format_infos (GdkMemoryFormat format) case GDK_MEMORY_B8G8R8A8_PREMULTIPLIED: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_B8G8R8A8_UNORM, DEFAULT_SWIZZLE }, - { VK_FORMAT_R8G8B8A8_UNORM, SWIZZLE(B, G, R, A) }, + { VK_FORMAT_B8G8R8A8_UNORM, DEFAULT_SWIZZLE, 0 }, + { VK_FORMAT_R8G8B8A8_UNORM, SWIZZLE(B, G, R, A), 0 }, { VK_FORMAT_UNDEFINED } }; return info; @@ -62,7 +65,7 @@ gsk_memory_format_get_vk_format_infos (GdkMemoryFormat format) case GDK_MEMORY_A8R8G8B8_PREMULTIPLIED: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_R8G8B8A8_UNORM, SWIZZLE(G, B, A, R) }, + { VK_FORMAT_R8G8B8A8_UNORM, SWIZZLE(G, B, A, R), 0 }, { VK_FORMAT_UNDEFINED } }; return info; @@ -71,23 +74,53 @@ gsk_memory_format_get_vk_format_infos (GdkMemoryFormat format) case GDK_MEMORY_R8G8B8A8_PREMULTIPLIED: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_R8G8B8A8_UNORM, DEFAULT_SWIZZLE }, + { VK_FORMAT_R8G8B8A8_UNORM, DEFAULT_SWIZZLE, 0 }, { VK_FORMAT_UNDEFINED } }; return info; } -#if 0 - GDK_MEMORY_B8G8R8A8, - GDK_MEMORY_A8R8G8B8, - GDK_MEMORY_R8G8B8A8, - GDK_MEMORY_A8B8G8R8, -#endif + case GDK_MEMORY_B8G8R8A8: + { + static const GskMemoryFormatInfo info[] = { + { VK_FORMAT_B8G8R8A8_UNORM, DEFAULT_SWIZZLE, GSK_VULKAN_IMAGE_PREMULTIPLY }, + { VK_FORMAT_R8G8B8A8_UNORM, SWIZZLE(B, G, R, A), GSK_VULKAN_IMAGE_PREMULTIPLY }, + { VK_FORMAT_UNDEFINED } + }; + return info; + } + + case GDK_MEMORY_A8R8G8B8: + { + static const GskMemoryFormatInfo info[] = { + { VK_FORMAT_R8G8B8A8_UNORM, SWIZZLE(G, B, A, R), GSK_VULKAN_IMAGE_PREMULTIPLY }, + { VK_FORMAT_UNDEFINED } + }; + return info; + } + + case GDK_MEMORY_R8G8B8A8: + { + static const GskMemoryFormatInfo info[] = { + { VK_FORMAT_R8G8B8A8_UNORM, DEFAULT_SWIZZLE, GSK_VULKAN_IMAGE_PREMULTIPLY }, + { VK_FORMAT_UNDEFINED } + }; + return info; + } + + case GDK_MEMORY_A8B8G8R8: + { + static const GskMemoryFormatInfo info[] = { + { VK_FORMAT_R8G8B8A8_UNORM, SWIZZLE(A, B, G, R), GSK_VULKAN_IMAGE_PREMULTIPLY }, + { VK_FORMAT_UNDEFINED } + }; + return info; + } case GDK_MEMORY_R8G8B8: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_R8G8B8_UNORM, DEFAULT_SWIZZLE }, + { VK_FORMAT_R8G8B8_UNORM, DEFAULT_SWIZZLE, 0 }, { VK_FORMAT_UNDEFINED } }; return info; @@ -96,8 +129,8 @@ gsk_memory_format_get_vk_format_infos (GdkMemoryFormat format) case GDK_MEMORY_B8G8R8: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_B8G8R8_UNORM, DEFAULT_SWIZZLE }, - { VK_FORMAT_R8G8B8_UNORM, SWIZZLE(B, G, R, A) }, + { VK_FORMAT_B8G8R8_UNORM, DEFAULT_SWIZZLE, 0 }, + { VK_FORMAT_R8G8B8_UNORM, SWIZZLE(B, G, R, A), 0 }, { VK_FORMAT_UNDEFINED } }; return info; @@ -106,7 +139,7 @@ gsk_memory_format_get_vk_format_infos (GdkMemoryFormat format) case GDK_MEMORY_R16G16B16: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_R16G16B16_UNORM, DEFAULT_SWIZZLE }, + { VK_FORMAT_R16G16B16_UNORM, DEFAULT_SWIZZLE, 0 }, { VK_FORMAT_UNDEFINED } }; return info; @@ -115,20 +148,25 @@ gsk_memory_format_get_vk_format_infos (GdkMemoryFormat format) case GDK_MEMORY_R16G16B16A16_PREMULTIPLIED: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_R16G16B16A16_UNORM, DEFAULT_SWIZZLE }, + { VK_FORMAT_R16G16B16A16_UNORM, DEFAULT_SWIZZLE, 0 }, { VK_FORMAT_UNDEFINED } }; return info; } -#if 0 - GDK_MEMORY_R16G16B16A16, -#endif + case GDK_MEMORY_R16G16B16A16: + { + static const GskMemoryFormatInfo info[] = { + { VK_FORMAT_R16G16B16A16_UNORM, DEFAULT_SWIZZLE, GSK_VULKAN_IMAGE_PREMULTIPLY }, + { VK_FORMAT_UNDEFINED } + }; + return info; + } case GDK_MEMORY_R16G16B16_FLOAT: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_R16G16B16_SFLOAT, DEFAULT_SWIZZLE }, + { VK_FORMAT_R16G16B16_SFLOAT, DEFAULT_SWIZZLE, 0 }, { VK_FORMAT_UNDEFINED } }; return info; @@ -137,20 +175,25 @@ gsk_memory_format_get_vk_format_infos (GdkMemoryFormat format) case GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_R16G16B16A16_SFLOAT, DEFAULT_SWIZZLE }, + { VK_FORMAT_R16G16B16A16_SFLOAT, DEFAULT_SWIZZLE, 0 }, { VK_FORMAT_UNDEFINED } }; return info; } -#if 0 - GDK_MEMORY_R16G16B16A16_FLOAT, -#endif + case GDK_MEMORY_R16G16B16A16_FLOAT: + { + static const GskMemoryFormatInfo info[] = { + { VK_FORMAT_R16G16B16A16_SFLOAT, DEFAULT_SWIZZLE, GSK_VULKAN_IMAGE_PREMULTIPLY }, + { VK_FORMAT_UNDEFINED } + }; + return info; + } case GDK_MEMORY_R32G32B32_FLOAT: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_R32G32B32_SFLOAT, DEFAULT_SWIZZLE }, + { VK_FORMAT_R32G32B32_SFLOAT, DEFAULT_SWIZZLE, 0 }, { VK_FORMAT_UNDEFINED } }; return info; @@ -159,33 +202,43 @@ gsk_memory_format_get_vk_format_infos (GdkMemoryFormat format) case GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_R32G32B32A32_SFLOAT, DEFAULT_SWIZZLE }, + { VK_FORMAT_R32G32B32A32_SFLOAT, DEFAULT_SWIZZLE, 0 }, { VK_FORMAT_UNDEFINED } }; return info; } -#if 0 - GDK_MEMORY_R32G32B32A32_FLOAT, -#endif + case GDK_MEMORY_R32G32B32A32_FLOAT: + { + static const GskMemoryFormatInfo info[] = { + { VK_FORMAT_R32G32B32A32_SFLOAT, DEFAULT_SWIZZLE, GSK_VULKAN_IMAGE_PREMULTIPLY }, + { VK_FORMAT_UNDEFINED } + }; + return info; + } case GDK_MEMORY_G8A8_PREMULTIPLIED: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_R8G8_UNORM, SWIZZLE (R, R, R, G) }, + { VK_FORMAT_R8G8_UNORM, SWIZZLE (R, R, R, G), 0 }, { VK_FORMAT_UNDEFINED } }; return info; } -#if 0 - GDK_MEMORY_G8A8, -#endif + case GDK_MEMORY_G8A8: + { + static const GskMemoryFormatInfo info[] = { + { VK_FORMAT_R8G8_UNORM, SWIZZLE (R, R, R, G), GSK_VULKAN_IMAGE_PREMULTIPLY }, + { VK_FORMAT_UNDEFINED } + }; + return info; + } case GDK_MEMORY_G8: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_R8_UNORM, SWIZZLE (R, R, R, ONE) }, + { VK_FORMAT_R8_UNORM, SWIZZLE (R, R, R, ONE), 0 }, { VK_FORMAT_UNDEFINED } }; return info; @@ -194,20 +247,25 @@ gsk_memory_format_get_vk_format_infos (GdkMemoryFormat format) case GDK_MEMORY_G16A16_PREMULTIPLIED: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_R16G16_UNORM, SWIZZLE (R, R, R, G) }, + { VK_FORMAT_R16G16_UNORM, SWIZZLE (R, R, R, G), 0 }, { VK_FORMAT_UNDEFINED } }; return info; } -#if 0 - GDK_MEMORY_G16A16 -#endif + case GDK_MEMORY_G16A16: + { + static const GskMemoryFormatInfo info[] = { + { VK_FORMAT_R16G16_UNORM, SWIZZLE (R, R, R, G), GSK_VULKAN_IMAGE_PREMULTIPLY }, + { VK_FORMAT_UNDEFINED } + }; + return info; + } case GDK_MEMORY_G16: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_R16_UNORM, SWIZZLE (R, R, R, ONE) }, + { VK_FORMAT_R16_UNORM, SWIZZLE (R, R, R, ONE), 0 }, { VK_FORMAT_UNDEFINED } }; return info; @@ -216,7 +274,7 @@ gsk_memory_format_get_vk_format_infos (GdkMemoryFormat format) case GDK_MEMORY_A8: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_R8_UNORM, SWIZZLE (R, R, R, R) }, + { VK_FORMAT_R8_UNORM, SWIZZLE (R, R, R, R), 0 }, { VK_FORMAT_UNDEFINED } }; return info; @@ -225,23 +283,7 @@ gsk_memory_format_get_vk_format_infos (GdkMemoryFormat format) case GDK_MEMORY_A16: { static const GskMemoryFormatInfo info[] = { - { VK_FORMAT_R16_UNORM, SWIZZLE (R, R, R, R) }, - { VK_FORMAT_UNDEFINED } - }; - return info; - } - - case GDK_MEMORY_B8G8R8A8: - case GDK_MEMORY_A8R8G8B8: - case GDK_MEMORY_R8G8B8A8: - case GDK_MEMORY_A8B8G8R8: - case GDK_MEMORY_R16G16B16A16: - case GDK_MEMORY_R16G16B16A16_FLOAT: - case GDK_MEMORY_R32G32B32A32_FLOAT: - case GDK_MEMORY_G8A8: - case GDK_MEMORY_G16A16: - { - static const GskMemoryFormatInfo info[] = { + { VK_FORMAT_R16_UNORM, SWIZZLE (R, R, R, R), 0 }, { VK_FORMAT_UNDEFINED } }; return info; @@ -262,53 +304,53 @@ gsk_memory_format_get_fallback (GdkMemoryFormat format) switch (format) { case GDK_MEMORY_B8G8R8A8_PREMULTIPLIED: - return GDK_MEMORY_R8G8B8A8_PREMULTIPLIED; case GDK_MEMORY_A8R8G8B8_PREMULTIPLIED: - return GDK_MEMORY_R8G8B8A8_PREMULTIPLIED; case GDK_MEMORY_R8G8B8A8_PREMULTIPLIED: - return GDK_MEMORY_R8G8B8A8_PREMULTIPLIED; case GDK_MEMORY_B8G8R8A8: - return GDK_MEMORY_B8G8R8A8_PREMULTIPLIED; case GDK_MEMORY_A8R8G8B8: - return GDK_MEMORY_A8R8G8B8_PREMULTIPLIED; case GDK_MEMORY_R8G8B8A8: - return GDK_MEMORY_R8G8B8A8_PREMULTIPLIED; case GDK_MEMORY_A8B8G8R8: - return GDK_MEMORY_R8G8B8A8_PREMULTIPLIED; case GDK_MEMORY_R8G8B8: return GDK_MEMORY_R8G8B8A8_PREMULTIPLIED; + case GDK_MEMORY_B8G8R8: return GDK_MEMORY_R8G8B8; - case GDK_MEMORY_R16G16B16: - return GDK_MEMORY_R16G16B16A16_PREMULTIPLIED; + case GDK_MEMORY_R16G16B16A16_PREMULTIPLIED: return GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED; + + case GDK_MEMORY_R16G16B16: case GDK_MEMORY_R16G16B16A16: return GDK_MEMORY_R16G16B16A16_PREMULTIPLIED; - case GDK_MEMORY_R16G16B16_FLOAT: - return GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED; + case GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED: return GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED; + + case GDK_MEMORY_R16G16B16_FLOAT: case GDK_MEMORY_R16G16B16A16_FLOAT: return GDK_MEMORY_R16G16B16A16_FLOAT_PREMULTIPLIED; - case GDK_MEMORY_R32G32B32_FLOAT: - return GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED; + case GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED: return GDK_MEMORY_R8G8B8A8_PREMULTIPLIED; + + case GDK_MEMORY_R32G32B32_FLOAT: case GDK_MEMORY_R32G32B32A32_FLOAT: return GDK_MEMORY_R32G32B32A32_FLOAT_PREMULTIPLIED; + case GDK_MEMORY_G8A8_PREMULTIPLIED: - return GDK_MEMORY_R8G8B8A8_PREMULTIPLIED; case GDK_MEMORY_G8A8: - return GDK_MEMORY_G8A8_PREMULTIPLIED; + return GDK_MEMORY_R8G8B8A8_PREMULTIPLIED; + case GDK_MEMORY_G8: return GDK_MEMORY_R8G8B8; + case GDK_MEMORY_G16A16_PREMULTIPLIED: - return GDK_MEMORY_R16G16B16A16_PREMULTIPLIED; case GDK_MEMORY_G16A16: - return GDK_MEMORY_G16A16_PREMULTIPLIED; + return GDK_MEMORY_R16G16B16A16_PREMULTIPLIED; + case GDK_MEMORY_G16: return GDK_MEMORY_R16G16B16; + case GDK_MEMORY_A8: return GDK_MEMORY_R8G8B8A8_PREMULTIPLIED; case GDK_MEMORY_A16: @@ -321,20 +363,57 @@ gsk_memory_format_get_fallback (GdkMemoryFormat format) } static gboolean -gsk_vulkan_context_supports_format (GdkVulkanContext *context, - VkFormat format) +gsk_vulkan_context_supports_format (GdkVulkanContext *context, + VkFormat format, + VkImageTiling tiling, + VkImageUsageFlags usage, + gsize width, + gsize height) { VkFormatProperties properties; + VkImageFormatProperties image_properties; + VkFormatFeatureFlags features, required; + VkResult res; vkGetPhysicalDeviceFormatProperties (gdk_vulkan_context_get_physical_device (context), format, &properties); - if ((properties.linearTilingFeatures & (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT)) && - (properties.optimalTilingFeatures & (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT))) - return TRUE; + switch ((int) tiling) + { + case VK_IMAGE_TILING_OPTIMAL: + features = properties.optimalTilingFeatures; + break; + case VK_IMAGE_TILING_LINEAR: + features = properties.optimalTilingFeatures; + break; + default: + return FALSE; + } + required = 0; + if (usage & VK_IMAGE_USAGE_SAMPLED_BIT) + required |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT; + if (usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) + required |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT; - return FALSE; + if ((features & required) != required) + return FALSE; + + res = vkGetPhysicalDeviceImageFormatProperties (gdk_vulkan_context_get_physical_device (context), + format, + VK_IMAGE_TYPE_2D, + tiling, + usage, + 0, + &image_properties); + if (res != VK_SUCCESS) + return FALSE; + + if (image_properties.maxExtent.width < width || + image_properties.maxExtent.height < height) + return FALSE; + + return TRUE; } static void @@ -361,16 +440,17 @@ gsk_vulkan_image_create_view (GskVulkanImage *self, } static GskVulkanImage * -gsk_vulkan_image_new (GdkVulkanContext *context, - GdkMemoryFormat format, - gsize width, - gsize height, - VkImageTiling tiling, - VkImageUsageFlags usage, - VkPipelineStageFlags stage, - VkImageLayout layout, - VkAccessFlags access, - VkMemoryPropertyFlags memory) +gsk_vulkan_image_new (GdkVulkanContext *context, + GdkMemoryFormat format, + gsize width, + gsize height, + GskVulkanImagePostprocess allowed_postprocess, + VkImageTiling tiling, + VkImageUsageFlags usage, + VkPipelineStageFlags stage, + VkImageLayout layout, + VkAccessFlags access, + VkMemoryPropertyFlags memory) { VkMemoryRequirements requirements; GskVulkanImage *self; @@ -384,8 +464,24 @@ gsk_vulkan_image_new (GdkVulkanContext *context, vk_format->format != VK_FORMAT_UNDEFINED; vk_format++) { - if (gsk_vulkan_context_supports_format (context, vk_format->format)) + if (vk_format->postprocess & ~allowed_postprocess) + continue; + + if (gsk_vulkan_context_supports_format (context, + vk_format->format, + tiling, usage, + width, height)) break; + + if (tiling != VK_IMAGE_TILING_OPTIMAL && + gsk_vulkan_context_supports_format (context, + vk_format->format, + VK_IMAGE_TILING_OPTIMAL, usage, + width, height)) + { + tiling = VK_IMAGE_TILING_OPTIMAL; + break; + } } if (vk_format->format != VK_FORMAT_UNDEFINED) break; @@ -398,8 +494,10 @@ gsk_vulkan_image_new (GdkVulkanContext *context, self->vulkan = g_object_ref (context); self->format = format; self->vk_format = vk_format->format; + self->postprocess = vk_format->postprocess; self->width = width; self->height = height; + self->vk_tiling = tiling; self->vk_usage = usage; self->vk_pipeline_stage = stage; self->vk_image_layout = layout; @@ -454,6 +552,7 @@ gsk_vulkan_image_new_for_upload (GdkVulkanContext *context, format, width, height, + -1, VK_IMAGE_TILING_LINEAR, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, @@ -471,6 +570,9 @@ gsk_vulkan_image_can_map (GskVulkanImage *self) if (GSK_DEBUG_CHECK (STAGING)) return FALSE; + if (self->vk_tiling != VK_IMAGE_TILING_LINEAR) + return FALSE; + if (self->vk_image_layout != VK_IMAGE_LAYOUT_PREINITIALIZED && self->vk_image_layout != VK_IMAGE_LAYOUT_GENERAL) return FALSE; @@ -525,6 +627,7 @@ gsk_vulkan_image_new_for_swapchain (GdkVulkanContext *context, self->vulkan = g_object_ref (context); self->width = width; self->height = height; + self->vk_tiling = VK_IMAGE_TILING_OPTIMAL; self->vk_image = image; self->vk_format = format; self->vk_pipeline_stage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; @@ -555,6 +658,7 @@ gsk_vulkan_image_new_for_atlas (GdkVulkanContext *context, GDK_MEMORY_DEFAULT, width, height, + 0, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, @@ -577,6 +681,7 @@ gsk_vulkan_image_new_for_offscreen (GdkVulkanContext *context, preferred_format, width, height, + 0, VK_IMAGE_TILING_LINEAR, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | @@ -663,6 +768,12 @@ gsk_vulkan_image_get_height (GskVulkanImage *self) return self->height; } +GskVulkanImagePostprocess +gsk_vulkan_image_get_postprocess (GskVulkanImage *self) +{ + return self->postprocess; +} + VkImage gsk_vulkan_image_get_vk_image (GskVulkanImage *self) { diff --git a/gsk/vulkan/gskvulkanimageprivate.h b/gsk/vulkan/gskvulkanimageprivate.h index d0c9e6bc45..53055531ba 100644 --- a/gsk/vulkan/gskvulkanimageprivate.h +++ b/gsk/vulkan/gskvulkanimageprivate.h @@ -8,6 +8,12 @@ G_BEGIN_DECLS +/* required postprocessing steps before the image van be used */ +typedef enum +{ + GSK_VULKAN_IMAGE_PREMULTIPLY = (1 << 0), +} GskVulkanImagePostprocess; + #define GSK_TYPE_VULKAN_IMAGE (gsk_vulkan_image_get_type ()) G_DECLARE_FINAL_TYPE (GskVulkanImage, gsk_vulkan_image, GSK, VULKAN_IMAGE, GObject) @@ -48,6 +54,8 @@ void gsk_vulkan_image_unmap (GskVulk gsize gsk_vulkan_image_get_width (GskVulkanImage *self); gsize gsk_vulkan_image_get_height (GskVulkanImage *self); +GskVulkanImagePostprocess + gsk_vulkan_image_get_postprocess (GskVulkanImage *self); VkPipelineStageFlags gsk_vulkan_image_get_vk_pipeline_stage (GskVulkanImage *self); VkImageLayout gsk_vulkan_image_get_vk_image_layout (GskVulkanImage *self); VkAccessFlags gsk_vulkan_image_get_vk_access (GskVulkanImage *self); diff --git a/gsk/vulkan/gskvulkanrender.c b/gsk/vulkan/gskvulkanrender.c index 3fb7f46ff2..b84810cab2 100644 --- a/gsk/vulkan/gskvulkanrender.c +++ b/gsk/vulkan/gskvulkanrender.c @@ -491,19 +491,33 @@ gsk_vulkan_render_add_node (GskVulkanRender *self, GskVulkanDownloadFunc download_func, gpointer download_data) { + GskVulkanRenderPass *render_pass; graphene_vec2_t scale; + cairo_rectangle_int_t extents; graphene_vec2_init (&scale, self->scale, self->scale); + cairo_region_get_extents (self->clip, &extents); - gsk_vulkan_render_pass_op (self, - self->vulkan, - g_object_ref (self->target), - self->clip, - &scale, - &self->viewport, - node, - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); + gsk_vulkan_render_pass_begin_op (self, + g_object_ref (self->target), + &extents, + &self->viewport.size, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); + + + render_pass = gsk_vulkan_render_pass_new (); + gsk_vulkan_render_pass_add (render_pass, + self, + &scale, + &self->viewport, + &extents, + node); + gsk_vulkan_render_pass_free (render_pass); + + gsk_vulkan_render_pass_end_op (self, + g_object_ref (self->target), + VK_IMAGE_LAYOUT_PRESENT_SRC_KHR); if (download_func) gsk_vulkan_download_op (self, self->target, download_func, download_data); @@ -1007,6 +1021,7 @@ gsk_vulkan_render_free (GskVulkanRender *self) gsk_vulkan_render_cleanup (self); + g_clear_pointer (&self->storage_buffer, gsk_vulkan_buffer_free); g_clear_pointer (&self->vertex_buffer, gsk_vulkan_buffer_free); device = gdk_vulkan_context_get_device (self->vulkan); diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index 59f338568d..b680b8c9b0 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -16,6 +16,7 @@ #include "gskvulkanclipprivate.h" #include "gskvulkancolormatrixopprivate.h" #include "gskvulkancoloropprivate.h" +#include "gskvulkanconvertopprivate.h" #include "gskvulkancrossfadeopprivate.h" #include "gskvulkanglyphopprivate.h" #include "gskvulkaninsetshadowopprivate.h" @@ -42,13 +43,7 @@ typedef struct _GskVulkanParseState GskVulkanParseState; struct _GskVulkanRenderPass { - GdkVulkanContext *vulkan; - - GskVulkanImage *target; - graphene_rect_t viewport; - cairo_region_t *clip; - - graphene_vec2_t scale; + int empty; }; struct _GskVulkanParseState @@ -61,37 +56,12 @@ struct _GskVulkanParseState GskVulkanClip clip; }; -#ifdef G_ENABLE_DEBUG -static GQuark fallback_pixels_quark; -static GQuark texture_pixels_quark; -#endif - GskVulkanRenderPass * -gsk_vulkan_render_pass_new (GdkVulkanContext *context, - GskVulkanRender *render, - GskVulkanImage *target, - const graphene_vec2_t *scale, - const graphene_rect_t *viewport, - cairo_region_t *clip, - GskRenderNode *node) +gsk_vulkan_render_pass_new (void) { GskVulkanRenderPass *self; self = g_new0 (GskVulkanRenderPass, 1); - self->vulkan = g_object_ref (context); - - self->target = g_object_ref (target); - self->clip = cairo_region_copy (clip); - self->viewport = *viewport; - graphene_vec2_init_from_vec2 (&self->scale, scale); - -#ifdef G_ENABLE_DEBUG - if (fallback_pixels_quark == 0) - { - fallback_pixels_quark = g_quark_from_static_string ("fallback-pixels"); - texture_pixels_quark = g_quark_from_static_string ("texture-pixels"); - } -#endif return self; } @@ -99,10 +69,6 @@ gsk_vulkan_render_pass_new (GdkVulkanContext *context, void gsk_vulkan_render_pass_free (GskVulkanRenderPass *self) { - g_object_unref (self->vulkan); - g_object_unref (self->target); - cairo_region_destroy (self->clip); - g_free (self); } @@ -175,6 +141,52 @@ gsk_vulkan_parse_rect_is_integer (const GskVulkanParseState *state, && int_rect->height == rect->size.height * scale_y; } +static GskVulkanImage * +gsk_vulkan_render_pass_upload_texture (GskVulkanRender *render, + GdkTexture *texture) +{ + GskVulkanImage *image, *better_image; + int width, height; + GskVulkanImagePostprocess postproc; + graphene_matrix_t projection; + graphene_vec2_t scale; + + image = gsk_vulkan_upload_texture_op (render, texture); + postproc = gsk_vulkan_image_get_postprocess (image); + if (postproc == 0) + return image; + + width = gdk_texture_get_width (texture); + height = gdk_texture_get_height (texture); + better_image = gsk_vulkan_image_new_for_offscreen (gsk_vulkan_render_get_context (render), + gdk_texture_get_format (texture), + width, height); + gsk_vulkan_render_pass_begin_op (render, + g_object_ref (better_image), + &(cairo_rectangle_int_t) { 0, 0, width, height }, + &GRAPHENE_SIZE_INIT(width, height), + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + gsk_vulkan_scissor_op (render, &(cairo_rectangle_int_t) { 0, 0, width, height }); + graphene_matrix_init_ortho (&projection, + 0, width, + 0, height, + 2 * ORTHO_NEAR_PLANE - ORTHO_FAR_PLANE, + ORTHO_FAR_PLANE); + graphene_vec2_init (&scale, 1.0, 1.0); + gsk_vulkan_push_constants_op (render, &scale, &projection, &GSK_ROUNDED_RECT_INIT(0, 0, width, height)); + gsk_vulkan_convert_op (render, + GSK_VULKAN_SHADER_CLIP_NONE, + image, + &GRAPHENE_RECT_INIT (0, 0, width, height), + &GRAPHENE_POINT_INIT (0, 0), + &GRAPHENE_RECT_INIT (0, 0, width, height)); + gsk_vulkan_render_pass_end_op (render, + better_image, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + return better_image; +} + static GskVulkanImage * gsk_vulkan_render_pass_get_node_as_image (GskVulkanRenderPass *self, GskVulkanRender *render, @@ -193,7 +205,7 @@ gsk_vulkan_render_pass_get_node_as_image (GskVulkanRenderPass *self, result = gsk_vulkan_renderer_get_texture_image (renderer, texture); if (result == NULL) { - result = gsk_vulkan_upload_texture_op (render, self->vulkan, texture); + result = gsk_vulkan_render_pass_upload_texture (render, texture); gsk_vulkan_renderer_add_texture_image (renderer, texture, result); } @@ -212,7 +224,6 @@ gsk_vulkan_render_pass_get_node_as_image (GskVulkanRenderPass *self, return NULL; result = gsk_vulkan_upload_cairo_op (render, - self->vulkan, node, &state->scale, &clipped); @@ -237,7 +248,6 @@ gsk_vulkan_render_pass_get_node_as_image (GskVulkanRenderPass *self, *tex_bounds = clipped; result = gsk_vulkan_render_pass_op_offscreen (render, - self->vulkan, &state->scale, &clipped, node); @@ -269,7 +279,6 @@ gsk_vulkan_render_pass_add_fallback_node (GskVulkanRenderPass *self, return TRUE; image = gsk_vulkan_upload_cairo_op (render, - self->vulkan, node, &state->scale, &clipped); @@ -471,7 +480,7 @@ gsk_vulkan_render_pass_add_texture_node (GskVulkanRenderPass *self, image = gsk_vulkan_renderer_get_texture_image (renderer, texture); if (image == NULL) { - image = gsk_vulkan_upload_texture_op (render, self->vulkan, texture); + image = gsk_vulkan_render_pass_upload_texture (render, texture); gsk_vulkan_renderer_add_texture_image (renderer, texture, image); } @@ -514,7 +523,7 @@ gsk_vulkan_render_pass_add_texture_scale_node (GskVulkanRenderPass *self, image = gsk_vulkan_renderer_get_texture_image (renderer, texture); if (image == NULL) { - image = gsk_vulkan_upload_texture_op (render, self->vulkan, texture); + image = gsk_vulkan_render_pass_upload_texture (render, texture); gsk_vulkan_renderer_add_texture_image (renderer, texture, image); } @@ -901,7 +910,6 @@ gsk_vulkan_render_pass_add_repeat_node (GskVulkanRenderPass *self, return TRUE; image = gsk_vulkan_render_pass_op_offscreen (render, - self->vulkan, &state->scale, child_bounds, gsk_repeat_node_get_child (node)); @@ -1292,31 +1300,33 @@ gsk_vulkan_render_pass_add_node (GskVulkanRenderPass *self, } void -gsk_vulkan_render_pass_add (GskVulkanRenderPass *self, - GskVulkanRender *render, - GskRenderNode *node) +gsk_vulkan_render_pass_add (GskVulkanRenderPass *self, + GskVulkanRender *render, + const graphene_vec2_t *scale, + const graphene_rect_t *viewport, + cairo_rectangle_int_t *clip, + GskRenderNode *node) { GskVulkanParseState state; - graphene_rect_t clip; + graphene_rect_t scaled_clip; float scale_x, scale_y; - scale_x = 1 / graphene_vec2_get_x (&self->scale); - scale_y = 1 / graphene_vec2_get_y (&self->scale); - cairo_region_get_extents (self->clip, &state.scissor); - clip = GRAPHENE_RECT_INIT(state.scissor.x, state.scissor.y, - state.scissor.width, state.scissor.height); - graphene_rect_scale (&clip, scale_x, scale_y, &clip); - gsk_vulkan_clip_init_empty (&state.clip, &clip); + scale_x = 1 / graphene_vec2_get_x (scale); + scale_y = 1 / graphene_vec2_get_y (scale); + state.scissor = *clip; + scaled_clip = GRAPHENE_RECT_INIT(clip->x, clip->y, clip->width, clip->height); + graphene_rect_scale (&scaled_clip, scale_x, scale_y, &scaled_clip); + gsk_vulkan_clip_init_empty (&state.clip, &scaled_clip); state.modelview = NULL; graphene_matrix_init_ortho (&state.projection, - 0, self->viewport.size.width, - 0, self->viewport.size.height, + 0, viewport->size.width, + 0, viewport->size.height, 2 * ORTHO_NEAR_PLANE - ORTHO_FAR_PLANE, ORTHO_FAR_PLANE); - graphene_vec2_init_from_vec2 (&state.scale, &self->scale); - state.offset = GRAPHENE_POINT_INIT (-self->viewport.origin.x * scale_x, - -self->viewport.origin.y * scale_y); + graphene_vec2_init_from_vec2 (&state.scale, scale); + state.offset = GRAPHENE_POINT_INIT (-viewport->origin.x * scale_x, + -viewport->origin.y * scale_y); gsk_vulkan_render_pass_append_scissor (render, node, &state); gsk_vulkan_render_pass_append_push_constants (render, node, &state); diff --git a/gsk/vulkan/gskvulkanrenderpassop.c b/gsk/vulkan/gskvulkanrenderpassop.c index a85469cd8e..0a785984d2 100644 --- a/gsk/vulkan/gskvulkanrenderpassop.c +++ b/gsk/vulkan/gskvulkanrenderpassop.c @@ -15,7 +15,6 @@ struct _GskVulkanRenderPassOp GskVulkanOp op; GskVulkanImage *image; - GskVulkanRenderPass *render_pass; cairo_rectangle_int_t area; graphene_size_t viewport_size; @@ -29,7 +28,6 @@ gsk_vulkan_render_pass_op_finish (GskVulkanOp *op) GskVulkanRenderPassOp *self = (GskVulkanRenderPassOp *) op; g_object_unref (self->image); - gsk_vulkan_render_pass_free (self->render_pass); } static void @@ -243,54 +241,47 @@ static const GskVulkanOpClass GSK_VULKAN_RENDER_PASS_END_OP_CLASS = { }; void -gsk_vulkan_render_pass_op (GskVulkanRender *render, - GdkVulkanContext *context, - GskVulkanImage *image, - cairo_region_t *clip, - const graphene_vec2_t *scale, - const graphene_rect_t *viewport, - GskRenderNode *node, - VkImageLayout initial_layout, - VkImageLayout final_layout) +gsk_vulkan_render_pass_begin_op (GskVulkanRender *render, + GskVulkanImage *image, + const cairo_rectangle_int_t *area, + const graphene_size_t *viewport_size, + VkImageLayout initial_layout, + VkImageLayout final_layout) { GskVulkanRenderPassOp *self; - GskVulkanRenderPassEndOp *end; self = (GskVulkanRenderPassOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_RENDER_PASS_OP_CLASS); - self->image = image; + self->image = g_object_ref (image); self->initial_layout = initial_layout; self->final_layout = final_layout; - cairo_region_get_extents (clip, &self->area); - self->viewport_size = viewport->size; + self->area = *area; + self->viewport_size = *viewport_size; +} - self->render_pass = gsk_vulkan_render_pass_new (context, - render, - self->image, - scale, - viewport, - clip, - node); +void +gsk_vulkan_render_pass_end_op (GskVulkanRender *render, + GskVulkanImage *image, + VkImageLayout final_layout) +{ + GskVulkanRenderPassEndOp *self; - /* This invalidates the self pointer */ - gsk_vulkan_render_pass_add (self->render_pass, render, node); + self = (GskVulkanRenderPassEndOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_RENDER_PASS_END_OP_CLASS); - end = (GskVulkanRenderPassEndOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_RENDER_PASS_END_OP_CLASS); - - end->image = g_object_ref (image); - end->final_layout = final_layout; + self->image = g_object_ref (image); + self->final_layout = final_layout; } GskVulkanImage * gsk_vulkan_render_pass_op_offscreen (GskVulkanRender *render, - GdkVulkanContext *context, const graphene_vec2_t *scale, const graphene_rect_t *viewport, GskRenderNode *node) { + GskVulkanRenderPass *render_pass; + GdkVulkanContext *context; graphene_rect_t view; GskVulkanImage *image; - cairo_region_t *clip; float scale_x, scale_y; scale_x = graphene_vec2_get_x (scale); @@ -300,28 +291,39 @@ gsk_vulkan_render_pass_op_offscreen (GskVulkanRender *render, ceil (scale_x * viewport->size.width), ceil (scale_y * viewport->size.height)); + context = gsk_vulkan_render_get_context (render); image = gsk_vulkan_image_new_for_offscreen (context, gdk_vulkan_context_get_offscreen_format (context, gsk_render_node_get_preferred_depth (node)), view.size.width, view.size.height); - clip = cairo_region_create_rectangle (&(cairo_rectangle_int_t) { - 0, 0, - gsk_vulkan_image_get_width (image), - gsk_vulkan_image_get_height (image) - }); + gsk_vulkan_render_pass_begin_op (render, + image, + &(cairo_rectangle_int_t) { + 0, 0, + gsk_vulkan_image_get_width (image), + gsk_vulkan_image_get_height (image) + }, + &viewport->size, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - gsk_vulkan_render_pass_op (render, - context, - image, - clip, - scale, - &view, - node, - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + render_pass = gsk_vulkan_render_pass_new (); + gsk_vulkan_render_pass_add (render_pass, + render, + scale, + viewport, + &(cairo_rectangle_int_t) { + 0, 0, + gsk_vulkan_image_get_width (image), + gsk_vulkan_image_get_height (image) + }, + node); + gsk_vulkan_render_pass_free (render_pass); - cairo_region_destroy (clip); + gsk_vulkan_render_pass_end_op (render, + image, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); return image; } diff --git a/gsk/vulkan/gskvulkanrenderpassopprivate.h b/gsk/vulkan/gskvulkanrenderpassopprivate.h index 7765a9f211..ad7b90ddc2 100644 --- a/gsk/vulkan/gskvulkanrenderpassopprivate.h +++ b/gsk/vulkan/gskvulkanrenderpassopprivate.h @@ -4,17 +4,18 @@ G_BEGIN_DECLS -void gsk_vulkan_render_pass_op (GskVulkanRender *render, - GdkVulkanContext *context, + +void gsk_vulkan_render_pass_begin_op (GskVulkanRender *render, GskVulkanImage *image, - cairo_region_t *clip, - const graphene_vec2_t *scale, - const graphene_rect_t *viewport, - GskRenderNode *node, + const cairo_rectangle_int_t *area, + const graphene_size_t *viewport_size, VkImageLayout initial_layout, VkImageLayout final_layout); +void gsk_vulkan_render_pass_end_op (GskVulkanRender *render, + GskVulkanImage *image, + VkImageLayout final_layout); + GskVulkanImage * gsk_vulkan_render_pass_op_offscreen (GskVulkanRender *render, - GdkVulkanContext *context, const graphene_vec2_t *scale, const graphene_rect_t *viewport, GskRenderNode *node); diff --git a/gsk/vulkan/gskvulkanrenderpassprivate.h b/gsk/vulkan/gskvulkanrenderpassprivate.h index 08505e8b62..62b31ee143 100644 --- a/gsk/vulkan/gskvulkanrenderpassprivate.h +++ b/gsk/vulkan/gskvulkanrenderpassprivate.h @@ -10,18 +10,15 @@ G_BEGIN_DECLS -GskVulkanRenderPass * gsk_vulkan_render_pass_new (GdkVulkanContext *context, - GskVulkanRender *render, - GskVulkanImage *target, - const graphene_vec2_t *scale, - const graphene_rect_t *viewport, - cairo_region_t *clip, - GskRenderNode *node); +GskVulkanRenderPass * gsk_vulkan_render_pass_new (void); void gsk_vulkan_render_pass_free (GskVulkanRenderPass *self); void gsk_vulkan_render_pass_add (GskVulkanRenderPass *self, GskVulkanRender *render, + const graphene_vec2_t *scale, + const graphene_rect_t *viewport, + cairo_rectangle_int_t *clip, GskRenderNode *node); G_END_DECLS diff --git a/gsk/vulkan/gskvulkanuploadop.c b/gsk/vulkan/gskvulkanuploadop.c index 7c7d6132f0..428590f559 100644 --- a/gsk/vulkan/gskvulkanuploadop.c +++ b/gsk/vulkan/gskvulkanuploadop.c @@ -214,7 +214,6 @@ static const GskVulkanOpClass GSK_VULKAN_UPLOAD_TEXTURE_OP_CLASS = { GskVulkanImage * gsk_vulkan_upload_texture_op (GskVulkanRender *render, - GdkVulkanContext *context, GdkTexture *texture) { GskVulkanUploadTextureOp *self; @@ -222,7 +221,7 @@ gsk_vulkan_upload_texture_op (GskVulkanRender *render, 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, + self->image = gsk_vulkan_image_new_for_upload (gsk_vulkan_render_get_context (render), gdk_texture_get_format (texture), gdk_texture_get_width (texture), gdk_texture_get_height (texture)); @@ -327,7 +326,6 @@ static const GskVulkanOpClass GSK_VULKAN_UPLOAD_CAIRO_OP_CLASS = { GskVulkanImage * gsk_vulkan_upload_cairo_op (GskVulkanRender *render, - GdkVulkanContext *context, GskRenderNode *node, const graphene_vec2_t *scale, const graphene_rect_t *viewport) @@ -337,10 +335,11 @@ gsk_vulkan_upload_cairo_op (GskVulkanRender *render, self = (GskVulkanUploadCairoOp *) gsk_vulkan_op_alloc (render, &GSK_VULKAN_UPLOAD_CAIRO_OP_CLASS); self->node = gsk_render_node_ref (node); - self->image = gsk_vulkan_image_new_for_upload (context, + self->image = gsk_vulkan_image_new_for_upload (gsk_vulkan_render_get_context (render), GDK_MEMORY_DEFAULT, ceil (graphene_vec2_get_x (scale) * viewport->size.width), ceil (graphene_vec2_get_y (scale) * viewport->size.height)); + g_assert (gsk_vulkan_image_get_postprocess (self->image) == 0); self->viewport = *viewport; return self->image; diff --git a/gsk/vulkan/gskvulkanuploadopprivate.h b/gsk/vulkan/gskvulkanuploadopprivate.h index 675337e032..cffe2c2443 100644 --- a/gsk/vulkan/gskvulkanuploadopprivate.h +++ b/gsk/vulkan/gskvulkanuploadopprivate.h @@ -5,11 +5,9 @@ G_BEGIN_DECLS GskVulkanImage * gsk_vulkan_upload_texture_op (GskVulkanRender *render, - GdkVulkanContext *context, GdkTexture *texture); GskVulkanImage * gsk_vulkan_upload_cairo_op (GskVulkanRender *render, - GdkVulkanContext *context, GskRenderNode *node, const graphene_vec2_t *scale, const graphene_rect_t *viewport); diff --git a/gsk/vulkan/resources/blend-mode-clip-rounded.frag.spv b/gsk/vulkan/resources/blend-mode-clip-rounded.frag.spv deleted file mode 100644 index 27db073e84..0000000000 Binary files a/gsk/vulkan/resources/blend-mode-clip-rounded.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/blend-mode-clip-rounded.vert.spv b/gsk/vulkan/resources/blend-mode-clip-rounded.vert.spv deleted file mode 100644 index e5ceee3beb..0000000000 Binary files a/gsk/vulkan/resources/blend-mode-clip-rounded.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/blend-mode-clip.frag.spv b/gsk/vulkan/resources/blend-mode-clip.frag.spv deleted file mode 100644 index b8f13d34bc..0000000000 Binary files a/gsk/vulkan/resources/blend-mode-clip.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/blend-mode-clip.vert.spv b/gsk/vulkan/resources/blend-mode-clip.vert.spv deleted file mode 100644 index e5ceee3beb..0000000000 Binary files a/gsk/vulkan/resources/blend-mode-clip.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/blend-mode.frag.spv b/gsk/vulkan/resources/blend-mode.frag.spv deleted file mode 100644 index b8f13d34bc..0000000000 Binary files a/gsk/vulkan/resources/blend-mode.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/blend-mode.vert.spv b/gsk/vulkan/resources/blend-mode.vert.spv deleted file mode 100644 index 99cf303f03..0000000000 Binary files a/gsk/vulkan/resources/blend-mode.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/blendmode-rect-rounded.frag.spv b/gsk/vulkan/resources/blendmode-rect-rounded.frag.spv deleted file mode 100644 index 55ce955e83..0000000000 Binary files a/gsk/vulkan/resources/blendmode-rect-rounded.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/blendmode-rect.frag.spv b/gsk/vulkan/resources/blendmode-rect.frag.spv deleted file mode 100644 index 7d0fdd1fa7..0000000000 Binary files a/gsk/vulkan/resources/blendmode-rect.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/blur-clip-rounded.frag.spv b/gsk/vulkan/resources/blur-clip-rounded.frag.spv deleted file mode 100644 index 221c06ffcb..0000000000 Binary files a/gsk/vulkan/resources/blur-clip-rounded.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/blur-clip-rounded.vert.spv b/gsk/vulkan/resources/blur-clip-rounded.vert.spv deleted file mode 100644 index 150e783e53..0000000000 Binary files a/gsk/vulkan/resources/blur-clip-rounded.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/blur-clip.frag.spv b/gsk/vulkan/resources/blur-clip.frag.spv deleted file mode 100644 index 3169660bf6..0000000000 Binary files a/gsk/vulkan/resources/blur-clip.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/blur-clip.vert.spv b/gsk/vulkan/resources/blur-clip.vert.spv deleted file mode 100644 index 150e783e53..0000000000 Binary files a/gsk/vulkan/resources/blur-clip.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/blur.frag.spv b/gsk/vulkan/resources/blur.frag.spv deleted file mode 100644 index 3169660bf6..0000000000 Binary files a/gsk/vulkan/resources/blur.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/blur.vert.spv b/gsk/vulkan/resources/blur.vert.spv deleted file mode 100644 index 2d80428e3f..0000000000 Binary files a/gsk/vulkan/resources/blur.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/border-clip-rounded.frag.spv b/gsk/vulkan/resources/border-clip-rounded.frag.spv deleted file mode 100644 index 80135c9ff3..0000000000 Binary files a/gsk/vulkan/resources/border-clip-rounded.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/border-clip-rounded.vert.spv b/gsk/vulkan/resources/border-clip-rounded.vert.spv deleted file mode 100644 index f2e2b8307f..0000000000 Binary files a/gsk/vulkan/resources/border-clip-rounded.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/border-clip.frag.spv b/gsk/vulkan/resources/border-clip.frag.spv deleted file mode 100644 index b2e28636be..0000000000 Binary files a/gsk/vulkan/resources/border-clip.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/border-clip.vert.spv b/gsk/vulkan/resources/border-clip.vert.spv deleted file mode 100644 index f2e2b8307f..0000000000 Binary files a/gsk/vulkan/resources/border-clip.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/border.frag.spv b/gsk/vulkan/resources/border.frag.spv deleted file mode 100644 index b2e28636be..0000000000 Binary files a/gsk/vulkan/resources/border.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/border.vert.spv b/gsk/vulkan/resources/border.vert.spv deleted file mode 100644 index c9a3756466..0000000000 Binary files a/gsk/vulkan/resources/border.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/color-clip-rounded.frag.spv b/gsk/vulkan/resources/color-clip-rounded.frag.spv deleted file mode 100644 index f038851aa6..0000000000 Binary files a/gsk/vulkan/resources/color-clip-rounded.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/color-clip-rounded.vert.spv b/gsk/vulkan/resources/color-clip-rounded.vert.spv deleted file mode 100644 index d202725245..0000000000 Binary files a/gsk/vulkan/resources/color-clip-rounded.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/color-clip.frag.spv b/gsk/vulkan/resources/color-clip.frag.spv deleted file mode 100644 index dd3637925d..0000000000 Binary files a/gsk/vulkan/resources/color-clip.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/color-clip.vert.spv b/gsk/vulkan/resources/color-clip.vert.spv deleted file mode 100644 index d202725245..0000000000 Binary files a/gsk/vulkan/resources/color-clip.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/color-matrix-clip-rounded.frag.spv b/gsk/vulkan/resources/color-matrix-clip-rounded.frag.spv deleted file mode 100644 index 78e0e03fa4..0000000000 Binary files a/gsk/vulkan/resources/color-matrix-clip-rounded.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/color-matrix-clip-rounded.vert.spv b/gsk/vulkan/resources/color-matrix-clip-rounded.vert.spv deleted file mode 100644 index 3b66db714f..0000000000 Binary files a/gsk/vulkan/resources/color-matrix-clip-rounded.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/color-matrix-clip.frag.spv b/gsk/vulkan/resources/color-matrix-clip.frag.spv deleted file mode 100644 index f5dfbb474b..0000000000 Binary files a/gsk/vulkan/resources/color-matrix-clip.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/color-matrix-clip.vert.spv b/gsk/vulkan/resources/color-matrix-clip.vert.spv deleted file mode 100644 index 3b66db714f..0000000000 Binary files a/gsk/vulkan/resources/color-matrix-clip.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/color-matrix.frag.spv b/gsk/vulkan/resources/color-matrix.frag.spv deleted file mode 100644 index f5dfbb474b..0000000000 Binary files a/gsk/vulkan/resources/color-matrix.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/color-matrix.vert.spv b/gsk/vulkan/resources/color-matrix.vert.spv deleted file mode 100644 index 5c5b37ad79..0000000000 Binary files a/gsk/vulkan/resources/color-matrix.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/color.frag.spv b/gsk/vulkan/resources/color.frag.spv deleted file mode 100644 index dd3637925d..0000000000 Binary files a/gsk/vulkan/resources/color.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/color.vert.spv b/gsk/vulkan/resources/color.vert.spv deleted file mode 100644 index 3992c82071..0000000000 Binary files a/gsk/vulkan/resources/color.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/convert.frag b/gsk/vulkan/resources/convert.frag new file mode 100644 index 0000000000..862285b1df --- /dev/null +++ b/gsk/vulkan/resources/convert.frag @@ -0,0 +1,29 @@ +#version 450 + +#include "common.frag.glsl" +#include "clip.frag.glsl" +#include "rect.frag.glsl" + +#define GSK_VULKAN_IMAGE_PREMULTIPLY (1 << 0) +# +layout(location = 0) in vec2 in_pos; +layout(location = 1) in Rect in_rect; +layout(location = 2) in vec2 in_tex_coord; +layout(location = 3) flat in uint in_tex_id; +layout(location = 4) in flat uint in_postprocess; + +layout(location = 0) out vec4 color; + +void main() +{ + float alpha = rect_coverage (in_rect, in_pos); + + /* warning: This breaks with filters other than nearest, + as linear filtering needs premultiplied alpha */ + vec4 pixel = texture (get_sampler (in_tex_id), in_tex_coord); + + if ((in_postprocess & GSK_VULKAN_IMAGE_PREMULTIPLY) != 0) + pixel.rgb *= pixel.a; + + color = clip_scaled (in_pos, pixel * alpha); +} diff --git a/gsk/vulkan/resources/convert.vert b/gsk/vulkan/resources/convert.vert new file mode 100644 index 0000000000..d0777b9785 --- /dev/null +++ b/gsk/vulkan/resources/convert.vert @@ -0,0 +1,26 @@ +#version 450 + +#include "common.vert.glsl" +#include "rect.vert.glsl" + +layout(location = 0) in vec4 in_rect; +layout(location = 1) in vec4 in_tex_rect; +layout(location = 2) in uint in_tex_id; +layout(location = 3) in uint in_postprocess; + +layout(location = 0) out vec2 out_pos; +layout(location = 1) out flat Rect out_rect; +layout(location = 2) out vec2 out_tex_coord; +layout(location = 3) out flat uint out_tex_id; +layout(location = 4) out flat uint out_postprocess; + +void main() { + Rect r = rect_from_gsk (in_rect); + vec2 pos = set_position_from_rect (r); + + out_pos = pos; + out_rect = r; + out_tex_coord = scale_tex_coord (pos, r, in_tex_rect); + out_tex_id = in_tex_id; + out_postprocess = in_postprocess; +} diff --git a/gsk/vulkan/resources/cross-fade-clip-rounded.frag.spv b/gsk/vulkan/resources/cross-fade-clip-rounded.frag.spv deleted file mode 100644 index 9b1b94bee3..0000000000 Binary files a/gsk/vulkan/resources/cross-fade-clip-rounded.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/cross-fade-clip-rounded.vert.spv b/gsk/vulkan/resources/cross-fade-clip-rounded.vert.spv deleted file mode 100644 index 90df226fad..0000000000 Binary files a/gsk/vulkan/resources/cross-fade-clip-rounded.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/cross-fade-clip.frag.spv b/gsk/vulkan/resources/cross-fade-clip.frag.spv deleted file mode 100644 index 1885651b1a..0000000000 Binary files a/gsk/vulkan/resources/cross-fade-clip.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/cross-fade-clip.vert.spv b/gsk/vulkan/resources/cross-fade-clip.vert.spv deleted file mode 100644 index 90df226fad..0000000000 Binary files a/gsk/vulkan/resources/cross-fade-clip.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/cross-fade-rect.vert.spv b/gsk/vulkan/resources/cross-fade-rect.vert.spv deleted file mode 100644 index 9ed91e1326..0000000000 Binary files a/gsk/vulkan/resources/cross-fade-rect.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/cross-fade.frag.spv b/gsk/vulkan/resources/cross-fade.frag.spv deleted file mode 100644 index 1885651b1a..0000000000 Binary files a/gsk/vulkan/resources/cross-fade.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/cross-fade.vert.spv b/gsk/vulkan/resources/cross-fade.vert.spv deleted file mode 100644 index 90dc433993..0000000000 Binary files a/gsk/vulkan/resources/cross-fade.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/glyph-clip-rounded.frag.spv b/gsk/vulkan/resources/glyph-clip-rounded.frag.spv deleted file mode 100644 index ff2212a266..0000000000 Binary files a/gsk/vulkan/resources/glyph-clip-rounded.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/glyph-clip-rounded.vert.spv b/gsk/vulkan/resources/glyph-clip-rounded.vert.spv deleted file mode 100644 index d177868088..0000000000 Binary files a/gsk/vulkan/resources/glyph-clip-rounded.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/glyph-clip.frag.spv b/gsk/vulkan/resources/glyph-clip.frag.spv deleted file mode 100644 index bfd95cdd2e..0000000000 Binary files a/gsk/vulkan/resources/glyph-clip.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/glyph-clip.vert.spv b/gsk/vulkan/resources/glyph-clip.vert.spv deleted file mode 100644 index d177868088..0000000000 Binary files a/gsk/vulkan/resources/glyph-clip.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/glyph.frag.spv b/gsk/vulkan/resources/glyph.frag.spv deleted file mode 100644 index bfd95cdd2e..0000000000 Binary files a/gsk/vulkan/resources/glyph.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/glyph.vert.spv b/gsk/vulkan/resources/glyph.vert.spv deleted file mode 100644 index e92bf9249a..0000000000 Binary files a/gsk/vulkan/resources/glyph.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/inset-shadow-clip-rounded.frag.spv b/gsk/vulkan/resources/inset-shadow-clip-rounded.frag.spv deleted file mode 100644 index b6b7445339..0000000000 Binary files a/gsk/vulkan/resources/inset-shadow-clip-rounded.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/inset-shadow-clip-rounded.vert.spv b/gsk/vulkan/resources/inset-shadow-clip-rounded.vert.spv deleted file mode 100644 index 009f7f81fd..0000000000 Binary files a/gsk/vulkan/resources/inset-shadow-clip-rounded.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/inset-shadow-clip.frag.spv b/gsk/vulkan/resources/inset-shadow-clip.frag.spv deleted file mode 100644 index d1239f0a09..0000000000 Binary files a/gsk/vulkan/resources/inset-shadow-clip.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/inset-shadow-clip.vert.spv b/gsk/vulkan/resources/inset-shadow-clip.vert.spv deleted file mode 100644 index 009f7f81fd..0000000000 Binary files a/gsk/vulkan/resources/inset-shadow-clip.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/inset-shadow.frag.spv b/gsk/vulkan/resources/inset-shadow.frag.spv deleted file mode 100644 index d1239f0a09..0000000000 Binary files a/gsk/vulkan/resources/inset-shadow.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/inset-shadow.vert.spv b/gsk/vulkan/resources/inset-shadow.vert.spv deleted file mode 100644 index df47abb26c..0000000000 Binary files a/gsk/vulkan/resources/inset-shadow.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/linear-clip-rounded.frag.spv b/gsk/vulkan/resources/linear-clip-rounded.frag.spv deleted file mode 100644 index 14fc8d79c1..0000000000 Binary files a/gsk/vulkan/resources/linear-clip-rounded.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/linear-clip-rounded.vert.spv b/gsk/vulkan/resources/linear-clip-rounded.vert.spv deleted file mode 100644 index ba5af49500..0000000000 Binary files a/gsk/vulkan/resources/linear-clip-rounded.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/linear-clip.frag.spv b/gsk/vulkan/resources/linear-clip.frag.spv deleted file mode 100644 index 46a4fbbc99..0000000000 Binary files a/gsk/vulkan/resources/linear-clip.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/linear-clip.vert.spv b/gsk/vulkan/resources/linear-clip.vert.spv deleted file mode 100644 index ba5af49500..0000000000 Binary files a/gsk/vulkan/resources/linear-clip.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/linear.frag.spv b/gsk/vulkan/resources/linear.frag.spv deleted file mode 100644 index 46a4fbbc99..0000000000 Binary files a/gsk/vulkan/resources/linear.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/linear.vert.spv b/gsk/vulkan/resources/linear.vert.spv deleted file mode 100644 index aa6d52676d..0000000000 Binary files a/gsk/vulkan/resources/linear.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/mask-clip-rounded.frag.spv b/gsk/vulkan/resources/mask-clip-rounded.frag.spv deleted file mode 100644 index 08d05b81e1..0000000000 Binary files a/gsk/vulkan/resources/mask-clip-rounded.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/mask-clip-rounded.vert.spv b/gsk/vulkan/resources/mask-clip-rounded.vert.spv deleted file mode 100644 index 81145c547e..0000000000 Binary files a/gsk/vulkan/resources/mask-clip-rounded.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/mask-clip.frag.spv b/gsk/vulkan/resources/mask-clip.frag.spv deleted file mode 100644 index e8f8b561f7..0000000000 Binary files a/gsk/vulkan/resources/mask-clip.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/mask-clip.vert.spv b/gsk/vulkan/resources/mask-clip.vert.spv deleted file mode 100644 index 81145c547e..0000000000 Binary files a/gsk/vulkan/resources/mask-clip.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/mask.frag.spv b/gsk/vulkan/resources/mask.frag.spv deleted file mode 100644 index e8f8b561f7..0000000000 Binary files a/gsk/vulkan/resources/mask.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/mask.vert.spv b/gsk/vulkan/resources/mask.vert.spv deleted file mode 100644 index fc04ff59b9..0000000000 Binary files a/gsk/vulkan/resources/mask.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/meson.build b/gsk/vulkan/resources/meson.build index 8881eb1b6b..444a1dce38 100644 --- a/gsk/vulkan/resources/meson.build +++ b/gsk/vulkan/resources/meson.build @@ -17,6 +17,7 @@ gsk_private_vulkan_fragment_shaders = [ 'border.frag', 'color.frag', 'color-matrix.frag', + 'convert.frag', 'cross-fade.frag', 'glyph.frag', 'inset-shadow.frag', @@ -32,6 +33,7 @@ gsk_private_vulkan_vertex_shaders = [ 'border.vert', 'color.vert', 'color-matrix.vert', + 'convert.vert', 'cross-fade.vert', 'glyph.vert', 'inset-shadow.vert', @@ -44,7 +46,6 @@ gsk_private_vulkan_vertex_shaders = [ gsk_private_vulkan_shaders += gsk_private_vulkan_fragment_shaders gsk_private_vulkan_shaders += gsk_private_vulkan_vertex_shaders -glslc = find_program('glslc', required: false) foreach shader: gsk_private_vulkan_shaders basefn = shader.split('.').get(0) suffix = shader.split('.').get(1) @@ -54,45 +55,41 @@ foreach shader: gsk_private_vulkan_shaders clip_spv_shader = '@0@-clip.@1@.spv'.format(basefn, suffix) clip_rounded_spv_shader = '@0@-clip-rounded.@1@.spv'.format(basefn, suffix) - if glslc.found() - compiled_shader = custom_target(spv_shader, - input: shader, - output: spv_shader, - depend_files: gsk_private_vulkan_include_shaders, - command: [ - glslc, - stage_arg, - '-DCLIP_NONE', - '@INPUT@', - '-o', '@OUTPUT@' - ]) - compiled_clip_shader = custom_target(clip_spv_shader, - input: shader, - output: clip_spv_shader, - depend_files: gsk_private_vulkan_include_shaders, - command: [ - glslc, - stage_arg, - '-DCLIP_RECT', - '@INPUT@', - '-o', '@OUTPUT@' - ]) - compiled_clip_rounded_shader = custom_target(clip_rounded_spv_shader, - input: shader, - output: clip_rounded_spv_shader, - depend_files: gsk_private_vulkan_include_shaders, - command: [ - glslc, - stage_arg, - '-DCLIP_ROUNDED_RECT', - '@INPUT@', - '-o', '@OUTPUT@' - ]) - gsk_private_vulkan_compiled_shaders_deps += [compiled_shader, compiled_clip_shader, compiled_clip_rounded_shader] - gsk_private_vulkan_compiled_shaders += [spv_shader, clip_spv_shader, clip_rounded_spv_shader] - else - gsk_private_vulkan_compiled_shaders += files(spv_shader, clip_spv_shader, clip_rounded_spv_shader) - endif + compiled_shader = custom_target(spv_shader, + input: shader, + output: spv_shader, + depend_files: gsk_private_vulkan_include_shaders, + command: [ + glslc, + stage_arg, + '-DCLIP_NONE', + '@INPUT@', + '-o', '@OUTPUT@' + ]) + compiled_clip_shader = custom_target(clip_spv_shader, + input: shader, + output: clip_spv_shader, + depend_files: gsk_private_vulkan_include_shaders, + command: [ + glslc, + stage_arg, + '-DCLIP_RECT', + '@INPUT@', + '-o', '@OUTPUT@' + ]) + compiled_clip_rounded_shader = custom_target(clip_rounded_spv_shader, + input: shader, + output: clip_rounded_spv_shader, + depend_files: gsk_private_vulkan_include_shaders, + command: [ + glslc, + stage_arg, + '-DCLIP_ROUNDED_RECT', + '@INPUT@', + '-o', '@OUTPUT@' + ]) + gsk_private_vulkan_compiled_shaders_deps += [compiled_shader, compiled_clip_shader, compiled_clip_rounded_shader] + gsk_private_vulkan_compiled_shaders += [spv_shader, clip_spv_shader, clip_rounded_spv_shader] endforeach foreach shader: gsk_private_vulkan_vertex_shaders diff --git a/gsk/vulkan/resources/outset-shadow-clip-rounded.frag.spv b/gsk/vulkan/resources/outset-shadow-clip-rounded.frag.spv deleted file mode 100644 index 48e3538a10..0000000000 Binary files a/gsk/vulkan/resources/outset-shadow-clip-rounded.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/outset-shadow-clip-rounded.vert.spv b/gsk/vulkan/resources/outset-shadow-clip-rounded.vert.spv deleted file mode 100644 index 2f12a13f64..0000000000 Binary files a/gsk/vulkan/resources/outset-shadow-clip-rounded.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/outset-shadow-clip.frag.spv b/gsk/vulkan/resources/outset-shadow-clip.frag.spv deleted file mode 100644 index ca5e278709..0000000000 Binary files a/gsk/vulkan/resources/outset-shadow-clip.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/outset-shadow-clip.vert.spv b/gsk/vulkan/resources/outset-shadow-clip.vert.spv deleted file mode 100644 index 2f12a13f64..0000000000 Binary files a/gsk/vulkan/resources/outset-shadow-clip.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/outset-shadow.frag.spv b/gsk/vulkan/resources/outset-shadow.frag.spv deleted file mode 100644 index ca5e278709..0000000000 Binary files a/gsk/vulkan/resources/outset-shadow.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/outset-shadow.vert.spv b/gsk/vulkan/resources/outset-shadow.vert.spv deleted file mode 100644 index 198b1c956e..0000000000 Binary files a/gsk/vulkan/resources/outset-shadow.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/texture-clip-rounded.frag.spv b/gsk/vulkan/resources/texture-clip-rounded.frag.spv deleted file mode 100644 index d3f3be951d..0000000000 Binary files a/gsk/vulkan/resources/texture-clip-rounded.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/texture-clip-rounded.vert.spv b/gsk/vulkan/resources/texture-clip-rounded.vert.spv deleted file mode 100644 index 512ad8573c..0000000000 Binary files a/gsk/vulkan/resources/texture-clip-rounded.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/texture-clip.frag.spv b/gsk/vulkan/resources/texture-clip.frag.spv deleted file mode 100644 index 71703d84e0..0000000000 Binary files a/gsk/vulkan/resources/texture-clip.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/texture-clip.vert.spv b/gsk/vulkan/resources/texture-clip.vert.spv deleted file mode 100644 index 512ad8573c..0000000000 Binary files a/gsk/vulkan/resources/texture-clip.vert.spv and /dev/null differ diff --git a/gsk/vulkan/resources/texture.frag.spv b/gsk/vulkan/resources/texture.frag.spv deleted file mode 100644 index 71703d84e0..0000000000 Binary files a/gsk/vulkan/resources/texture.frag.spv and /dev/null differ diff --git a/gsk/vulkan/resources/texture.vert.spv b/gsk/vulkan/resources/texture.vert.spv deleted file mode 100644 index 367ee34342..0000000000 Binary files a/gsk/vulkan/resources/texture.vert.spv and /dev/null differ diff --git a/meson.build b/meson.build index 6d5ef1c434..ee75e706c7 100644 --- a/meson.build +++ b/meson.build @@ -599,6 +599,7 @@ endif # to use a custom path for the Vulkan SDK. Bugs that are found with it should # be reported upstream and fixed. vulkan_dep = dependency('vulkan', required: get_option('vulkan')) +glslc = find_program('glslc', required: get_option('vulkan')) if vulkan_dep.found() have_vulkan = true vulkan_pkg_found = vulkan_dep.type_name() == 'pkgconfig'