@@ -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