diff --git a/render/vulkan/renderer.c b/render/vulkan/renderer.c index 4fae81a8..31ce0b76 100644 --- a/render/vulkan/renderer.c +++ b/render/vulkan/renderer.c @@ -794,17 +794,6 @@ static bool vulkan_render_subtexture_with_matrix(struct wlr_renderer *wlr_render vert_pcr_data.uv_size[1] = -vert_pcr_data.uv_size[1]; } - // When the texture itself does not have alpha information we want - // to ignore the sampled value and just use the alpha passed here, - // we pass a negative value to communicate that. - // See the texture.frag shader for more details. - const struct wlr_pixel_format_info *format_info = drm_get_pixel_format_info( - texture->format->drm_format); - assert(format_info); - if (!format_info->has_alpha) { - alpha *= -1; - } - vkCmdPushConstants(cb, renderer->pipe_layout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(vert_pcr_data), &vert_pcr_data); vkCmdPushConstants(cb, renderer->pipe_layout, diff --git a/render/vulkan/shaders/texture.frag b/render/vulkan/shaders/texture.frag index 7a7b8c57..0f9c52f1 100644 --- a/render/vulkan/shaders/texture.frag +++ b/render/vulkan/shaders/texture.frag @@ -11,15 +11,6 @@ layout(push_constant) uniform UBO { void main() { out_color = textureLod(tex, uv, 0); - - // We expect this shader to output pre-alpha-multiplied color values. - // alpha < 0.0 means that this shader should ignore the texture's alpha - // value. - if (data.alpha < 0.0) { - out_color.a = -data.alpha; - out_color.rgb *= -data.alpha; - } else { - out_color *= data.alpha; - } + out_color *= data.alpha; } diff --git a/render/vulkan/texture.c b/render/vulkan/texture.c index b4ba67ed..f6fbec5a 100644 --- a/render/vulkan/texture.c +++ b/render/vulkan/texture.c @@ -288,6 +288,9 @@ static struct wlr_texture *vulkan_texture_from_pixels(struct wlr_renderer *wlr_r goto error; } + const struct wlr_pixel_format_info *format_info = drm_get_pixel_format_info(drm_fmt); + assert(format_info); + // view VkImageViewCreateInfo view_info = {0}; view_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; @@ -296,7 +299,9 @@ static struct wlr_texture *vulkan_texture_from_pixels(struct wlr_renderer *wlr_r view_info.components.r = VK_COMPONENT_SWIZZLE_IDENTITY; view_info.components.g = VK_COMPONENT_SWIZZLE_IDENTITY; view_info.components.b = VK_COMPONENT_SWIZZLE_IDENTITY; - view_info.components.a = VK_COMPONENT_SWIZZLE_IDENTITY; + view_info.components.a = format_info->has_alpha + ? VK_COMPONENT_SWIZZLE_IDENTITY + : VK_COMPONENT_SWIZZLE_ONE; view_info.subresourceRange = (VkImageSubresourceRange) { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 @@ -613,6 +618,9 @@ static struct wlr_texture *vulkan_texture_from_dmabuf(struct wlr_renderer *wlr_r // return VK_NULL_HANDLE; } + const struct wlr_pixel_format_info *format_info = drm_get_pixel_format_info(attribs->format); + assert(format_info); + // view VkImageViewCreateInfo view_info = {0}; view_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; @@ -621,7 +629,9 @@ static struct wlr_texture *vulkan_texture_from_dmabuf(struct wlr_renderer *wlr_r view_info.components.r = VK_COMPONENT_SWIZZLE_IDENTITY; view_info.components.g = VK_COMPONENT_SWIZZLE_IDENTITY; view_info.components.b = VK_COMPONENT_SWIZZLE_IDENTITY; - view_info.components.a = VK_COMPONENT_SWIZZLE_IDENTITY; + view_info.components.a = format_info->has_alpha + ? VK_COMPONENT_SWIZZLE_IDENTITY + : VK_COMPONENT_SWIZZLE_ONE; view_info.subresourceRange = (VkImageSubresourceRange) { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1