Index: gpu/ipc/service/direct_composition_surface_win.cc |
diff --git a/gpu/ipc/service/direct_composition_surface_win.cc b/gpu/ipc/service/direct_composition_surface_win.cc |
index acbc271b0dd81360928050c87c9ecec203fc9e08..73ea79818b11eab217f3ccf18df336c8e9c52130 100644 |
--- a/gpu/ipc/service/direct_composition_surface_win.cc |
+++ b/gpu/ipc/service/direct_composition_surface_win.cc |
@@ -722,12 +722,16 @@ void DirectCompositionSurfaceWin::InitializeSurface() { |
? DXGI_FORMAT_R16G16B16A16_FLOAT |
: DXGI_FORMAT_B8G8R8A8_UNORM; |
if (enable_dc_layers_) { |
+ // Always treat as premultiplied, because an underlay could cause it to |
+ // become transparent. |
HRESULT hr = dcomp_device_->CreateSurface( |
size_.width(), size_.height(), output_format, |
DXGI_ALPHA_MODE_PREMULTIPLIED, dcomp_surface_.Receive()); |
has_been_rendered_to_ = false; |
CHECK(SUCCEEDED(hr)); |
} else { |
+ DXGI_ALPHA_MODE alpha_mode = |
+ has_alpha_ ? DXGI_ALPHA_MODE_PREMULTIPLIED : DXGI_ALPHA_MODE_IGNORE; |
base::win::ScopedComPtr<IDXGIDevice> dxgi_device; |
d3d11_device_.QueryInterface(dxgi_device.Receive()); |
base::win::ScopedComPtr<IDXGIAdapter> dxgi_adapter; |
@@ -745,7 +749,7 @@ void DirectCompositionSurfaceWin::InitializeSurface() { |
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; |
desc.Scaling = DXGI_SCALING_STRETCH; |
desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; |
- desc.AlphaMode = DXGI_ALPHA_MODE_PREMULTIPLIED; |
+ desc.AlphaMode = alpha_mode; |
desc.Flags = 0; |
HRESULT hr = dxgi_factory->CreateSwapChainForComposition( |
d3d11_device_.get(), &desc, nullptr, swap_chain_.Receive()); |
@@ -830,7 +834,7 @@ void* DirectCompositionSurfaceWin::GetHandle() { |
bool DirectCompositionSurfaceWin::Resize(const gfx::Size& size, |
float scale_factor, |
bool has_alpha) { |
- if (size == GetSize()) |
+ if ((size == GetSize()) && (has_alpha == has_alpha_)) |
return true; |
// Force a resize and redraw (but not a move, activate, etc.). |
@@ -840,6 +844,7 @@ bool DirectCompositionSurfaceWin::Resize(const gfx::Size& size, |
return false; |
} |
size_ = size; |
+ has_alpha_ = has_alpha; |
ScopedReleaseCurrent release_current(this); |
// New surface will be initialized in SetDrawRectangle. |
ReleaseCurrentSurface(); |