Skip to content

Commit 787a066

Browse files
committed
Allow transparent clear color if specified
1 parent 4fa3a95 commit 787a066

1 file changed

Lines changed: 42 additions & 18 deletions

File tree

src/dawn/native/vulkan/SwapChainVk.cpp

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -302,26 +302,50 @@ ResultOrError<SwapChain::Config> SwapChain::ChooseConfig(
302302

303303
config.transform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
304304

305-
config.alphaMode = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
306-
#if !DAWN_PLATFORM_IS(ANDROID)
307-
DAWN_INVALID_IF(
308-
(surfaceInfo.capabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR) == 0,
309-
"Vulkan SwapChain must support opaque alpha.");
310-
#else
311-
// TODO(dawn:286): investigate composite alpha for WebGPU native
312-
VkCompositeAlphaFlagBitsKHR compositeAlphaFlags[4] = {
313-
VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
314-
VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR,
315-
VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR,
316-
VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR,
317-
};
318-
for (uint32_t i = 0; i < 4; i++) {
319-
if (surfaceInfo.capabilities.supportedCompositeAlpha & compositeAlphaFlags[i]) {
320-
config.alphaMode = compositeAlphaFlags[i];
321-
break;
305+
// Honor the WebGPU surface descriptor's alphaMode on all platforms.
306+
// Previously the non-Android path hardcoded OPAQUE which silently
307+
// dropped per-pixel transparency requests. See dawn:286.
308+
{
309+
VkCompositeAlphaFlagBitsKHR requestedVk = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
310+
switch (GetAlphaMode()) {
311+
case wgpu::CompositeAlphaMode::Premultiplied:
312+
requestedVk = VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR;
313+
break;
314+
case wgpu::CompositeAlphaMode::Unpremultiplied:
315+
requestedVk = VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR;
316+
break;
317+
case wgpu::CompositeAlphaMode::Inherit:
318+
requestedVk = VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR;
319+
break;
320+
case wgpu::CompositeAlphaMode::Opaque:
321+
case wgpu::CompositeAlphaMode::Auto:
322+
default:
323+
requestedVk = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
324+
break;
325+
}
326+
if (surfaceInfo.capabilities.supportedCompositeAlpha & requestedVk) {
327+
config.alphaMode = requestedVk;
328+
} else {
329+
// Fall back to the first supported mode — order chosen so
330+
// OPAQUE is the last resort if the surface refuses it.
331+
VkCompositeAlphaFlagBitsKHR fallbacks[4] = {
332+
VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR,
333+
VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR,
334+
VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR,
335+
VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
336+
};
337+
config.alphaMode = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
338+
for (uint32_t i = 0; i < 4; i++) {
339+
if (surfaceInfo.capabilities.supportedCompositeAlpha & fallbacks[i]) {
340+
config.alphaMode = fallbacks[i];
341+
break;
342+
}
343+
}
322344
}
345+
DAWN_INVALID_IF(
346+
(surfaceInfo.capabilities.supportedCompositeAlpha & config.alphaMode) == 0,
347+
"Vulkan SwapChain: no supported composite alpha mode.");
323348
}
324-
#endif // #if !DAWN_PLATFORM_IS(ANDROID)
325349

326350
// Choose the number of images for the swapchain= and clamp it to the min and max from the
327351
// surface capabilities. maxImageCount = 0 means there is no limit.

0 commit comments

Comments
 (0)