diff --git a/include/render/vulkan.h b/include/render/vulkan.h index 716c5ace..5dfc3d37 100644 --- a/include/render/vulkan.h +++ b/include/render/vulkan.h @@ -253,6 +253,7 @@ struct wlr_vk_texture { bool dmabuf_imported; bool owned; // if dmabuf_imported: whether we have ownership of the image bool transitioned; // if dma_imported: whether we transitioned it away from preinit + bool has_alpha; // whether the image is has alpha channel struct wl_list foreign_link; // wlr_vk_renderer.foreign_textures struct wl_list destroy_link; // wlr_vk_renderer.destroy_textures struct wl_list link; // wlr_vk_renderer.textures diff --git a/include/wlr/render/vulkan.h b/include/wlr/render/vulkan.h index aec3a3c2..04c877e4 100644 --- a/include/wlr/render/vulkan.h +++ b/include/wlr/render/vulkan.h @@ -32,6 +32,7 @@ bool wlr_texture_is_vk(struct wlr_texture *texture); void wlr_vk_texture_get_image_attribs(struct wlr_texture *texture, struct wlr_vk_image_attribs *attribs); +bool wlr_vk_texture_has_alpha(struct wlr_texture *texture); #endif diff --git a/render/vulkan/texture.c b/render/vulkan/texture.c index 1f70bc44..6c6e9825 100644 --- a/render/vulkan/texture.c +++ b/render/vulkan/texture.c @@ -322,6 +322,7 @@ static struct wlr_texture *vulkan_texture_from_pixels( const struct wlr_pixel_format_info *format_info = drm_get_pixel_format_info(drm_fmt); assert(format_info); + texture->has_alpha = format_info->has_alpha; // view VkImageViewCreateInfo view_info = { @@ -331,7 +332,7 @@ static struct wlr_texture *vulkan_texture_from_pixels( .components.r = VK_COMPONENT_SWIZZLE_IDENTITY, .components.g = VK_COMPONENT_SWIZZLE_IDENTITY, .components.b = VK_COMPONENT_SWIZZLE_IDENTITY, - .components.a = format_info->has_alpha + .components.a = texture->has_alpha ? VK_COMPONENT_SWIZZLE_IDENTITY : VK_COMPONENT_SWIZZLE_ONE, @@ -656,6 +657,7 @@ static struct wlr_vk_texture *vulkan_texture_from_dmabuf( const struct wlr_pixel_format_info *format_info = drm_get_pixel_format_info(attribs->format); assert(format_info); + texture->has_alpha = format_info->has_alpha; // view VkImageViewCreateInfo view_info = { @@ -665,7 +667,7 @@ static struct wlr_vk_texture *vulkan_texture_from_dmabuf( .components.r = VK_COMPONENT_SWIZZLE_IDENTITY, .components.g = VK_COMPONENT_SWIZZLE_IDENTITY, .components.b = VK_COMPONENT_SWIZZLE_IDENTITY, - .components.a = format_info->has_alpha + .components.a = texture->has_alpha ? VK_COMPONENT_SWIZZLE_IDENTITY : VK_COMPONENT_SWIZZLE_ONE, @@ -779,3 +781,8 @@ void wlr_vk_texture_get_image_attribs(struct wlr_texture *texture, attribs->layout = vk_texture->transitioned ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_UNDEFINED; } + +bool wlr_vk_texture_has_alpha(struct wlr_texture *texture) { + struct wlr_vk_texture *vk_texture = vulkan_get_texture(texture); + return vk_texture->has_alpha; +}