aboutsummaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
authorManuel Stoeckl <code@mstoeckl.com>2023-10-21 12:38:20 -0400
committerSimon Ser <contact@emersion.fr>2023-11-21 11:08:55 +0000
commitdbe7fb70273ed1c9008bb5d36546d0d187f1217c (patch)
treea2315395d79219dd97e30729592fb5ff55557de0 /render
parentfe6a432299852f9fce72358999c736172a9065bd (diff)
render/vulkan: undo alpha premult for 8-bpc ARGB/ABGR
When a texel from the Vulkan format VK_FORMAT_B8G8R8A8_SRGB is read, the sRGB to linear conversion is applied independently to the R, G, and B channels; the A channel has no influence on this. However, DRM_FORMAT_ARGB8888 buffers are, per Wayland protocol, not encoded in this fashion; one must first unpremultiply the color channels before doing sRGB to linear conversion. This commit switches to handling ARGB8888 and ABGR8888 formats using the general fragment shader conversion from electrical to optical values.
Diffstat (limited to 'render')
-rw-r--r--render/vulkan/pixel_format.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/render/vulkan/pixel_format.c b/render/vulkan/pixel_format.c
index 90fb5f54..ced6eb24 100644
--- a/render/vulkan/pixel_format.c
+++ b/render/vulkan/pixel_format.c
@@ -33,11 +33,6 @@ static const struct wlr_vk_format formats[] = {
.is_srgb = true,
},
{
- .drm = DRM_FORMAT_ARGB8888,
- .vk = VK_FORMAT_B8G8R8A8_SRGB,
- .is_srgb = true,
- },
- {
.drm = DRM_FORMAT_XRGB8888,
.vk = VK_FORMAT_B8G8R8A8_SRGB,
.is_srgb = true,
@@ -47,12 +42,16 @@ static const struct wlr_vk_format formats[] = {
.vk = VK_FORMAT_R8G8B8A8_SRGB,
.is_srgb = true,
},
+ // The Vulkan _SRGB formats correspond to unpremultiplied alpha, but
+ // the Wayland protocol specifies premultiplied alpha on electrical values
+ {
+ .drm = DRM_FORMAT_ARGB8888,
+ .vk = VK_FORMAT_B8G8R8A8_UNORM,
+ },
{
.drm = DRM_FORMAT_ABGR8888,
- .vk = VK_FORMAT_R8G8B8A8_SRGB,
- .is_srgb = true,
+ .vk = VK_FORMAT_R8G8B8A8_UNORM,
},
-
// Vulkan packed formats have the same channel order as DRM formats on
// little endian systems.
#if WLR_LITTLE_ENDIAN