render/vulkan: add wlr_vk_texture_has_alpha

Allow to get whether has alpha channel of the VkImage, it can help an
optimization to disable blending when the texture doesn't have alpha.
Because the VkFormat isn't enough because it's always set to
VK_FORMAT_B8G8R8A8_SRGB or VK_FORMAT_R8G8B8A8_SRGB.
This commit is contained in:
zccrs 2022-11-09 17:57:56 +08:00
parent 65836ce357
commit 5b34fe5513
3 changed files with 11 additions and 2 deletions

View file

@ -253,6 +253,7 @@ struct wlr_vk_texture {
bool dmabuf_imported; bool dmabuf_imported;
bool owned; // if dmabuf_imported: whether we have ownership of the image 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 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 foreign_link; // wlr_vk_renderer.foreign_textures
struct wl_list destroy_link; // wlr_vk_renderer.destroy_textures struct wl_list destroy_link; // wlr_vk_renderer.destroy_textures
struct wl_list link; // wlr_vk_renderer.textures struct wl_list link; // wlr_vk_renderer.textures

View file

@ -32,6 +32,7 @@ bool wlr_texture_is_vk(struct wlr_texture *texture);
void wlr_vk_texture_get_image_attribs(struct wlr_texture *texture, void wlr_vk_texture_get_image_attribs(struct wlr_texture *texture,
struct wlr_vk_image_attribs *attribs); struct wlr_vk_image_attribs *attribs);
bool wlr_vk_texture_has_alpha(struct wlr_texture *texture);
#endif #endif

View file

@ -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); const struct wlr_pixel_format_info *format_info = drm_get_pixel_format_info(drm_fmt);
assert(format_info); assert(format_info);
texture->has_alpha = format_info->has_alpha;
// view // view
VkImageViewCreateInfo view_info = { VkImageViewCreateInfo view_info = {
@ -331,7 +332,7 @@ static struct wlr_texture *vulkan_texture_from_pixels(
.components.r = VK_COMPONENT_SWIZZLE_IDENTITY, .components.r = VK_COMPONENT_SWIZZLE_IDENTITY,
.components.g = VK_COMPONENT_SWIZZLE_IDENTITY, .components.g = VK_COMPONENT_SWIZZLE_IDENTITY,
.components.b = 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_IDENTITY
: VK_COMPONENT_SWIZZLE_ONE, : 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); const struct wlr_pixel_format_info *format_info = drm_get_pixel_format_info(attribs->format);
assert(format_info); assert(format_info);
texture->has_alpha = format_info->has_alpha;
// view // view
VkImageViewCreateInfo view_info = { VkImageViewCreateInfo view_info = {
@ -665,7 +667,7 @@ static struct wlr_vk_texture *vulkan_texture_from_dmabuf(
.components.r = VK_COMPONENT_SWIZZLE_IDENTITY, .components.r = VK_COMPONENT_SWIZZLE_IDENTITY,
.components.g = VK_COMPONENT_SWIZZLE_IDENTITY, .components.g = VK_COMPONENT_SWIZZLE_IDENTITY,
.components.b = 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_IDENTITY
: VK_COMPONENT_SWIZZLE_ONE, : VK_COMPONENT_SWIZZLE_ONE,
@ -779,3 +781,8 @@ void wlr_vk_texture_get_image_attribs(struct wlr_texture *texture,
attribs->layout = vk_texture->transitioned ? attribs->layout = vk_texture->transitioned ?
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_UNDEFINED; 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;
}