diff --git a/include/render/vulkan.h b/include/render/vulkan.h index 76397aae..25111fb6 100644 --- a/include/render/vulkan.h +++ b/include/render/vulkan.h @@ -150,6 +150,7 @@ enum wlr_vk_shader_source { struct wlr_vk_pipeline_key { enum wlr_vk_shader_source source; struct wlr_vk_pipeline_layout *layout; + enum wlr_render_blend_mode blend_mode; // only used if source is texture enum wlr_vk_texture_transform texture_transform; diff --git a/render/vulkan/renderer.c b/render/vulkan/renderer.c index 064f5055..039f6ef7 100644 --- a/render/vulkan/renderer.c +++ b/render/vulkan/renderer.c @@ -2100,6 +2100,10 @@ static bool pipeline_key_equals(const struct wlr_vk_pipeline_key *a, return false; } + if (a->blend_mode != b->blend_mode) { + return false; + } + if (a->source != b->source) { return false; } @@ -2194,7 +2198,7 @@ struct wlr_vk_pipeline *setup_get_or_create_pipeline( }; VkPipelineColorBlendAttachmentState blend_attachment = { - .blendEnable = true, + .blendEnable = key->blend_mode == WLR_RENDER_BLEND_MODE_PREMULTIPLIED, // we generally work with pre-multiplied alpha .srcColorBlendFactor = VK_BLEND_FACTOR_ONE, .dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,