OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gpu/ipc/service/direct_composition_surface_win.h" | 5 #include "gpu/ipc/service/direct_composition_surface_win.h" |
6 | 6 |
7 #include <d3d11_1.h> | 7 #include <d3d11_1.h> |
8 #include <dcomptypes.h> | 8 #include <dcomptypes.h> |
9 | 9 |
10 #include <deque> | 10 #include <deque> |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 | 123 |
124 base::win::ScopedComPtr<ID3D11Device> d3d11_device = | 124 base::win::ScopedComPtr<ID3D11Device> d3d11_device = |
125 gl::QueryD3D11DeviceObjectFromANGLE(); | 125 gl::QueryD3D11DeviceObjectFromANGLE(); |
126 if (!d3d11_device) { | 126 if (!d3d11_device) { |
127 DLOG(ERROR) << "Failing to create overlay swapchain because couldn't " | 127 DLOG(ERROR) << "Failing to create overlay swapchain because couldn't " |
128 "retrieve D3D11 device from ANGLE."; | 128 "retrieve D3D11 device from ANGLE."; |
129 return false; | 129 return false; |
130 } | 130 } |
131 | 131 |
132 base::win::ScopedComPtr<IDXGIDevice> dxgi_device; | 132 base::win::ScopedComPtr<IDXGIDevice> dxgi_device; |
133 d3d11_device.CopyTo(dxgi_device.Receive()); | 133 d3d11_device.CopyTo(dxgi_device.GetAddressOf()); |
134 base::win::ScopedComPtr<IDXGIAdapter> dxgi_adapter; | 134 base::win::ScopedComPtr<IDXGIAdapter> dxgi_adapter; |
135 dxgi_device->GetAdapter(dxgi_adapter.Receive()); | 135 dxgi_device->GetAdapter(dxgi_adapter.GetAddressOf()); |
136 | 136 |
137 unsigned int i = 0; | 137 unsigned int i = 0; |
138 while (true) { | 138 while (true) { |
139 base::win::ScopedComPtr<IDXGIOutput> output; | 139 base::win::ScopedComPtr<IDXGIOutput> output; |
140 if (FAILED(dxgi_adapter->EnumOutputs(i++, output.Receive()))) | 140 if (FAILED(dxgi_adapter->EnumOutputs(i++, output.GetAddressOf()))) |
141 break; | 141 break; |
142 base::win::ScopedComPtr<IDXGIOutput3> output3; | 142 base::win::ScopedComPtr<IDXGIOutput3> output3; |
143 if (FAILED(output.CopyTo(output3.Receive()))) | 143 if (FAILED(output.CopyTo(output3.GetAddressOf()))) |
144 continue; | 144 continue; |
145 | 145 |
146 UINT flags = 0; | 146 UINT flags = 0; |
147 if (FAILED(output3->CheckOverlaySupport(DXGI_FORMAT_YUY2, | 147 if (FAILED(output3->CheckOverlaySupport(DXGI_FORMAT_YUY2, |
148 d3d11_device.Get(), &flags))) | 148 d3d11_device.Get(), &flags))) |
149 continue; | 149 continue; |
150 | 150 |
151 UMA_HISTOGRAM_SPARSE_SLOWLY("GPU.DirectComposition.OverlaySupportFlags", | 151 UMA_HISTOGRAM_SPARSE_SLOWLY("GPU.DirectComposition.OverlaySupportFlags", |
152 flags); | 152 flags); |
153 | 153 |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 video_processor_enumerator_; | 306 video_processor_enumerator_; |
307 base::win::ScopedComPtr<ID3D11VideoDevice> video_device_; | 307 base::win::ScopedComPtr<ID3D11VideoDevice> video_device_; |
308 base::win::ScopedComPtr<ID3D11VideoContext> video_context_; | 308 base::win::ScopedComPtr<ID3D11VideoContext> video_context_; |
309 | 309 |
310 base::win::ScopedHandle swap_chain_handle_; | 310 base::win::ScopedHandle swap_chain_handle_; |
311 | 311 |
312 DISALLOW_COPY_AND_ASSIGN(SwapChainPresenter); | 312 DISALLOW_COPY_AND_ASSIGN(SwapChainPresenter); |
313 }; | 313 }; |
314 | 314 |
315 bool DCLayerTree::Initialize(HWND window) { | 315 bool DCLayerTree::Initialize(HWND window) { |
316 d3d11_device_.CopyTo(video_device_.Receive()); | 316 d3d11_device_.CopyTo(video_device_.GetAddressOf()); |
317 base::win::ScopedComPtr<ID3D11DeviceContext> context; | 317 base::win::ScopedComPtr<ID3D11DeviceContext> context; |
318 d3d11_device_->GetImmediateContext(context.Receive()); | 318 d3d11_device_->GetImmediateContext(context.GetAddressOf()); |
319 context.CopyTo(video_context_.Receive()); | 319 context.CopyTo(video_context_.GetAddressOf()); |
320 | 320 |
321 base::win::ScopedComPtr<IDCompositionDesktopDevice> desktop_device; | 321 base::win::ScopedComPtr<IDCompositionDesktopDevice> desktop_device; |
322 dcomp_device_.CopyTo(desktop_device.Receive()); | 322 dcomp_device_.CopyTo(desktop_device.GetAddressOf()); |
323 | 323 |
324 HRESULT hr = desktop_device->CreateTargetForHwnd(window, TRUE, | 324 HRESULT hr = desktop_device->CreateTargetForHwnd( |
325 dcomp_target_.Receive()); | 325 window, TRUE, dcomp_target_.GetAddressOf()); |
326 if (FAILED(hr)) | 326 if (FAILED(hr)) |
327 return false; | 327 return false; |
328 | 328 |
329 hr = dcomp_device_->CreateVisual(root_visual_.Receive()); | 329 hr = dcomp_device_->CreateVisual(root_visual_.GetAddressOf()); |
330 if (FAILED(hr)) | 330 if (FAILED(hr)) |
331 return false; | 331 return false; |
332 | 332 |
333 dcomp_target_->SetRoot(root_visual_.Get()); | 333 dcomp_target_->SetRoot(root_visual_.Get()); |
334 return true; | 334 return true; |
335 } | 335 } |
336 | 336 |
337 void DCLayerTree::InitializeVideoProcessor(const gfx::Size& input_size, | 337 void DCLayerTree::InitializeVideoProcessor(const gfx::Size& input_size, |
338 const gfx::Size& output_size) { | 338 const gfx::Size& output_size) { |
339 if (SizeContains(video_input_size_, input_size) && | 339 if (SizeContains(video_input_size_, input_size) && |
340 SizeContains(video_output_size_, output_size)) | 340 SizeContains(video_output_size_, output_size)) |
341 return; | 341 return; |
342 video_input_size_ = input_size; | 342 video_input_size_ = input_size; |
343 video_output_size_ = output_size; | 343 video_output_size_ = output_size; |
344 | 344 |
345 video_processor_.Reset(); | 345 video_processor_.Reset(); |
346 video_processor_enumerator_.Reset(); | 346 video_processor_enumerator_.Reset(); |
347 D3D11_VIDEO_PROCESSOR_CONTENT_DESC desc = {}; | 347 D3D11_VIDEO_PROCESSOR_CONTENT_DESC desc = {}; |
348 desc.InputFrameFormat = D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE; | 348 desc.InputFrameFormat = D3D11_VIDEO_FRAME_FORMAT_PROGRESSIVE; |
349 desc.InputFrameRate.Numerator = 60; | 349 desc.InputFrameRate.Numerator = 60; |
350 desc.InputFrameRate.Denominator = 1; | 350 desc.InputFrameRate.Denominator = 1; |
351 desc.InputWidth = input_size.width(); | 351 desc.InputWidth = input_size.width(); |
352 desc.InputHeight = input_size.height(); | 352 desc.InputHeight = input_size.height(); |
353 desc.OutputFrameRate.Numerator = 60; | 353 desc.OutputFrameRate.Numerator = 60; |
354 desc.OutputFrameRate.Denominator = 1; | 354 desc.OutputFrameRate.Denominator = 1; |
355 desc.OutputWidth = output_size.width(); | 355 desc.OutputWidth = output_size.width(); |
356 desc.OutputHeight = output_size.height(); | 356 desc.OutputHeight = output_size.height(); |
357 desc.Usage = D3D11_VIDEO_USAGE_PLAYBACK_NORMAL; | 357 desc.Usage = D3D11_VIDEO_USAGE_PLAYBACK_NORMAL; |
358 HRESULT hr = video_device_->CreateVideoProcessorEnumerator( | 358 HRESULT hr = video_device_->CreateVideoProcessorEnumerator( |
359 &desc, video_processor_enumerator_.Receive()); | 359 &desc, video_processor_enumerator_.GetAddressOf()); |
360 CHECK(SUCCEEDED(hr)); | 360 CHECK(SUCCEEDED(hr)); |
361 | 361 |
362 hr = video_device_->CreateVideoProcessor(video_processor_enumerator_.Get(), 0, | 362 hr = video_device_->CreateVideoProcessor(video_processor_enumerator_.Get(), 0, |
363 video_processor_.Receive()); | 363 video_processor_.GetAddressOf()); |
364 CHECK(SUCCEEDED(hr)); | 364 CHECK(SUCCEEDED(hr)); |
365 } | 365 } |
366 | 366 |
367 base::win::ScopedComPtr<IDXGISwapChain1> | 367 base::win::ScopedComPtr<IDXGISwapChain1> |
368 DCLayerTree::GetLayerSwapChainForTesting(size_t index) const { | 368 DCLayerTree::GetLayerSwapChainForTesting(size_t index) const { |
369 if (index >= visual_info_.size()) | 369 if (index >= visual_info_.size()) |
370 return base::win::ScopedComPtr<IDXGISwapChain1>(); | 370 return base::win::ScopedComPtr<IDXGISwapChain1>(); |
371 return visual_info_[index].swap_chain; | 371 return visual_info_[index].swap_chain; |
372 } | 372 } |
373 | 373 |
374 DCLayerTree::SwapChainPresenter::SwapChainPresenter( | 374 DCLayerTree::SwapChainPresenter::SwapChainPresenter( |
375 DCLayerTree* surface, | 375 DCLayerTree* surface, |
376 base::win::ScopedComPtr<ID3D11Device> d3d11_device) | 376 base::win::ScopedComPtr<ID3D11Device> d3d11_device) |
377 : surface_(surface), d3d11_device_(d3d11_device) { | 377 : surface_(surface), d3d11_device_(d3d11_device) { |
378 d3d11_device_.CopyTo(video_device_.Receive()); | 378 d3d11_device_.CopyTo(video_device_.GetAddressOf()); |
379 base::win::ScopedComPtr<ID3D11DeviceContext> context; | 379 base::win::ScopedComPtr<ID3D11DeviceContext> context; |
380 d3d11_device_->GetImmediateContext(context.Receive()); | 380 d3d11_device_->GetImmediateContext(context.GetAddressOf()); |
381 context.CopyTo(video_context_.Receive()); | 381 context.CopyTo(video_context_.GetAddressOf()); |
382 HMODULE dcomp = ::GetModuleHandleA("dcomp.dll"); | 382 HMODULE dcomp = ::GetModuleHandleA("dcomp.dll"); |
383 CHECK(dcomp); | 383 CHECK(dcomp); |
384 create_surface_handle_function_ = | 384 create_surface_handle_function_ = |
385 reinterpret_cast<PFN_DCOMPOSITION_CREATE_SURFACE_HANDLE>( | 385 reinterpret_cast<PFN_DCOMPOSITION_CREATE_SURFACE_HANDLE>( |
386 GetProcAddress(dcomp, "DCompositionCreateSurfaceHandle")); | 386 GetProcAddress(dcomp, "DCompositionCreateSurfaceHandle")); |
387 CHECK(create_surface_handle_function_); | 387 CHECK(create_surface_handle_function_); |
388 } | 388 } |
389 | 389 |
390 DCLayerTree::SwapChainPresenter::~SwapChainPresenter() {} | 390 DCLayerTree::SwapChainPresenter::~SwapChainPresenter() {} |
391 | 391 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 desc.Usage = D3D11_USAGE_DYNAMIC; | 432 desc.Usage = D3D11_USAGE_DYNAMIC; |
433 | 433 |
434 // This isn't actually bound to a decoder, but dynamic textures need | 434 // This isn't actually bound to a decoder, but dynamic textures need |
435 // BindFlags to be nonzero and D3D11_BIND_DECODER also works when creating | 435 // BindFlags to be nonzero and D3D11_BIND_DECODER also works when creating |
436 // a VideoProcessorInputView. | 436 // a VideoProcessorInputView. |
437 desc.BindFlags = D3D11_BIND_DECODER; | 437 desc.BindFlags = D3D11_BIND_DECODER; |
438 desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; | 438 desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; |
439 desc.MiscFlags = 0; | 439 desc.MiscFlags = 0; |
440 desc.SampleDesc.Count = 1; | 440 desc.SampleDesc.Count = 1; |
441 base::win::ScopedComPtr<ID3D11Texture2D> texture; | 441 base::win::ScopedComPtr<ID3D11Texture2D> texture; |
442 HRESULT hr = d3d11_device_->CreateTexture2D(&desc, nullptr, | 442 HRESULT hr = d3d11_device_->CreateTexture2D( |
443 staging_texture_.Receive()); | 443 &desc, nullptr, staging_texture_.GetAddressOf()); |
444 CHECK(SUCCEEDED(hr)) << "Creating D3D11 video upload texture failed: " | 444 CHECK(SUCCEEDED(hr)) << "Creating D3D11 video upload texture failed: " |
445 << std::hex << hr; | 445 << std::hex << hr; |
446 staging_texture_size_ = texture_size; | 446 staging_texture_size_ = texture_size; |
447 } | 447 } |
448 base::win::ScopedComPtr<ID3D11DeviceContext> context; | 448 base::win::ScopedComPtr<ID3D11DeviceContext> context; |
449 d3d11_device_->GetImmediateContext(context.Receive()); | 449 d3d11_device_->GetImmediateContext(context.GetAddressOf()); |
450 D3D11_MAPPED_SUBRESOURCE mapped_resource; | 450 D3D11_MAPPED_SUBRESOURCE mapped_resource; |
451 HRESULT hr = context->Map(staging_texture_.Get(), 0, D3D11_MAP_WRITE_DISCARD, | 451 HRESULT hr = context->Map(staging_texture_.Get(), 0, D3D11_MAP_WRITE_DISCARD, |
452 0, &mapped_resource); | 452 0, &mapped_resource); |
453 CHECK(SUCCEEDED(hr)) << "Mapping D3D11 video upload texture failed: " | 453 CHECK(SUCCEEDED(hr)) << "Mapping D3D11 video upload texture failed: " |
454 << std::hex << hr; | 454 << std::hex << hr; |
455 | 455 |
456 size_t dest_stride = mapped_resource.RowPitch; | 456 size_t dest_stride = mapped_resource.RowPitch; |
457 for (int y = 0; y < texture_size.height(); y++) { | 457 for (int y = 0; y < texture_size.height(); y++) { |
458 const uint8_t* y_source = | 458 const uint8_t* y_source = |
459 y_image_memory->memory() + y * y_image_memory->stride(); | 459 y_image_memory->memory() + y * y_image_memory->stride(); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
537 DCHECK(uv_image_memory); | 537 DCHECK(uv_image_memory); |
538 if (!UploadVideoImages(y_image_memory, uv_image_memory)) | 538 if (!UploadVideoImages(y_image_memory, uv_image_memory)) |
539 return; | 539 return; |
540 DCHECK(staging_texture_); | 540 DCHECK(staging_texture_); |
541 input_texture = staging_texture_; | 541 input_texture = staging_texture_; |
542 input_level = 0; | 542 input_level = 0; |
543 } | 543 } |
544 | 544 |
545 if (!out_view_) { | 545 if (!out_view_) { |
546 base::win::ScopedComPtr<ID3D11Texture2D> texture; | 546 base::win::ScopedComPtr<ID3D11Texture2D> texture; |
547 swap_chain_->GetBuffer(0, IID_PPV_ARGS(texture.Receive())); | 547 swap_chain_->GetBuffer(0, IID_PPV_ARGS(texture.GetAddressOf())); |
548 D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC out_desc = {}; | 548 D3D11_VIDEO_PROCESSOR_OUTPUT_VIEW_DESC out_desc = {}; |
549 out_desc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2D; | 549 out_desc.ViewDimension = D3D11_VPOV_DIMENSION_TEXTURE2D; |
550 out_desc.Texture2D.MipSlice = 0; | 550 out_desc.Texture2D.MipSlice = 0; |
551 HRESULT hr = video_device_->CreateVideoProcessorOutputView( | 551 HRESULT hr = video_device_->CreateVideoProcessorOutputView( |
552 texture.Get(), video_processor_enumerator_.Get(), &out_desc, | 552 texture.Get(), video_processor_enumerator_.Get(), &out_desc, |
553 out_view_.Receive()); | 553 out_view_.GetAddressOf()); |
554 CHECK(SUCCEEDED(hr)); | 554 CHECK(SUCCEEDED(hr)); |
555 } | 555 } |
556 | 556 |
557 // TODO(jbauman): Use correct colorspace. | 557 // TODO(jbauman): Use correct colorspace. |
558 gfx::ColorSpace src_color_space = gfx::ColorSpace::CreateREC709(); | 558 gfx::ColorSpace src_color_space = gfx::ColorSpace::CreateREC709(); |
559 base::win::ScopedComPtr<ID3D11VideoContext1> context1; | 559 base::win::ScopedComPtr<ID3D11VideoContext1> context1; |
560 if (SUCCEEDED(video_context_.CopyTo(context1.Receive()))) { | 560 if (SUCCEEDED(video_context_.CopyTo(context1.GetAddressOf()))) { |
561 context1->VideoProcessorSetStreamColorSpace1( | 561 context1->VideoProcessorSetStreamColorSpace1( |
562 video_processor_.Get(), 0, | 562 video_processor_.Get(), 0, |
563 gfx::ColorSpaceWin::GetDXGIColorSpace(src_color_space)); | 563 gfx::ColorSpaceWin::GetDXGIColorSpace(src_color_space)); |
564 } else { | 564 } else { |
565 // This can't handle as many different types of color spaces, so use it | 565 // This can't handle as many different types of color spaces, so use it |
566 // only if ID3D11VideoContext1 isn't available. | 566 // only if ID3D11VideoContext1 isn't available. |
567 D3D11_VIDEO_PROCESSOR_COLOR_SPACE color_space = | 567 D3D11_VIDEO_PROCESSOR_COLOR_SPACE color_space = |
568 gfx::ColorSpaceWin::GetD3D11ColorSpace(src_color_space); | 568 gfx::ColorSpaceWin::GetD3D11ColorSpace(src_color_space); |
569 video_context_->VideoProcessorSetStreamColorSpace(video_processor_.Get(), 0, | 569 video_context_->VideoProcessorSetStreamColorSpace(video_processor_.Get(), 0, |
570 &color_space); | 570 &color_space); |
571 } | 571 } |
572 | 572 |
573 gfx::ColorSpace output_color_space = | 573 gfx::ColorSpace output_color_space = |
574 is_yuy2_swapchain_ ? src_color_space : gfx::ColorSpace::CreateSRGB(); | 574 is_yuy2_swapchain_ ? src_color_space : gfx::ColorSpace::CreateSRGB(); |
575 if (base::FeatureList::IsEnabled(kFallbackBT709VideoToBT601) && | 575 if (base::FeatureList::IsEnabled(kFallbackBT709VideoToBT601) && |
576 (output_color_space == gfx::ColorSpace::CreateREC709())) { | 576 (output_color_space == gfx::ColorSpace::CreateREC709())) { |
577 output_color_space = gfx::ColorSpace::CreateREC601(); | 577 output_color_space = gfx::ColorSpace::CreateREC601(); |
578 } | 578 } |
579 | 579 |
580 base::win::ScopedComPtr<IDXGISwapChain3> swap_chain3; | 580 base::win::ScopedComPtr<IDXGISwapChain3> swap_chain3; |
581 if (SUCCEEDED(swap_chain_.CopyTo(swap_chain3.Receive()))) { | 581 if (SUCCEEDED(swap_chain_.CopyTo(swap_chain3.GetAddressOf()))) { |
582 DXGI_COLOR_SPACE_TYPE color_space = | 582 DXGI_COLOR_SPACE_TYPE color_space = |
583 gfx::ColorSpaceWin::GetDXGIColorSpace(output_color_space); | 583 gfx::ColorSpaceWin::GetDXGIColorSpace(output_color_space); |
584 HRESULT hr = swap_chain3->SetColorSpace1(color_space); | 584 HRESULT hr = swap_chain3->SetColorSpace1(color_space); |
585 CHECK(SUCCEEDED(hr)); | 585 CHECK(SUCCEEDED(hr)); |
586 if (context1) { | 586 if (context1) { |
587 context1->VideoProcessorSetOutputColorSpace1(video_processor_.Get(), | 587 context1->VideoProcessorSetOutputColorSpace1(video_processor_.Get(), |
588 color_space); | 588 color_space); |
589 } else { | 589 } else { |
590 D3D11_VIDEO_PROCESSOR_COLOR_SPACE d3d11_color_space = | 590 D3D11_VIDEO_PROCESSOR_COLOR_SPACE d3d11_color_space = |
591 gfx::ColorSpaceWin::GetD3D11ColorSpace(output_color_space); | 591 gfx::ColorSpaceWin::GetD3D11ColorSpace(output_color_space); |
592 video_context_->VideoProcessorSetOutputColorSpace(video_processor_.Get(), | 592 video_context_->VideoProcessorSetOutputColorSpace(video_processor_.Get(), |
593 &d3d11_color_space); | 593 &d3d11_color_space); |
594 } | 594 } |
595 } | 595 } |
596 | 596 |
597 { | 597 { |
598 D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC in_desc = {}; | 598 D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC in_desc = {}; |
599 in_desc.ViewDimension = D3D11_VPIV_DIMENSION_TEXTURE2D; | 599 in_desc.ViewDimension = D3D11_VPIV_DIMENSION_TEXTURE2D; |
600 in_desc.Texture2D.ArraySlice = input_level; | 600 in_desc.Texture2D.ArraySlice = input_level; |
601 base::win::ScopedComPtr<ID3D11VideoProcessorInputView> in_view; | 601 base::win::ScopedComPtr<ID3D11VideoProcessorInputView> in_view; |
602 HRESULT hr = video_device_->CreateVideoProcessorInputView( | 602 HRESULT hr = video_device_->CreateVideoProcessorInputView( |
603 input_texture.Get(), video_processor_enumerator_.Get(), &in_desc, | 603 input_texture.Get(), video_processor_enumerator_.Get(), &in_desc, |
604 in_view.Receive()); | 604 in_view.GetAddressOf()); |
605 CHECK(SUCCEEDED(hr)); | 605 CHECK(SUCCEEDED(hr)); |
606 | 606 |
607 D3D11_VIDEO_PROCESSOR_STREAM stream = {}; | 607 D3D11_VIDEO_PROCESSOR_STREAM stream = {}; |
608 stream.Enable = true; | 608 stream.Enable = true; |
609 stream.OutputIndex = 0; | 609 stream.OutputIndex = 0; |
610 stream.InputFrameOrField = 0; | 610 stream.InputFrameOrField = 0; |
611 stream.PastFrames = 0; | 611 stream.PastFrames = 0; |
612 stream.FutureFrames = 0; | 612 stream.FutureFrames = 0; |
613 stream.pInputSurface = in_view.Get(); | 613 stream.pInputSurface = in_view.Get(); |
614 RECT dest_rect = gfx::Rect(swap_chain_size).ToRECT(); | 614 RECT dest_rect = gfx::Rect(swap_chain_size).ToRECT(); |
(...skipping 20 matching lines...) Expand all Loading... |
635 swap_chain_->Present(0, 0); | 635 swap_chain_->Present(0, 0); |
636 | 636 |
637 // DirectComposition can display black for a swapchain between the first | 637 // DirectComposition can display black for a swapchain between the first |
638 // and second time it's presented to - maybe the first Present can get | 638 // and second time it's presented to - maybe the first Present can get |
639 // lost somehow and it shows the wrong buffer. In that case copy the | 639 // lost somehow and it shows the wrong buffer. In that case copy the |
640 // buffers so both have the correct contents, which seems to help. The | 640 // buffers so both have the correct contents, which seems to help. The |
641 // first Present() after this needs to have SyncInterval > 0, or else the | 641 // first Present() after this needs to have SyncInterval > 0, or else the |
642 // workaround doesn't help. | 642 // workaround doesn't help. |
643 base::win::ScopedComPtr<ID3D11Texture2D> dest_texture; | 643 base::win::ScopedComPtr<ID3D11Texture2D> dest_texture; |
644 HRESULT hr = | 644 HRESULT hr = |
645 swap_chain_->GetBuffer(0, IID_PPV_ARGS(dest_texture.Receive())); | 645 swap_chain_->GetBuffer(0, IID_PPV_ARGS(dest_texture.GetAddressOf())); |
646 DCHECK(SUCCEEDED(hr)); | 646 DCHECK(SUCCEEDED(hr)); |
647 base::win::ScopedComPtr<ID3D11Texture2D> src_texture; | 647 base::win::ScopedComPtr<ID3D11Texture2D> src_texture; |
648 hr = swap_chain_->GetBuffer(1, IID_PPV_ARGS(src_texture.Receive())); | 648 hr = swap_chain_->GetBuffer(1, IID_PPV_ARGS(src_texture.GetAddressOf())); |
649 DCHECK(SUCCEEDED(hr)); | 649 DCHECK(SUCCEEDED(hr)); |
650 base::win::ScopedComPtr<ID3D11DeviceContext> context; | 650 base::win::ScopedComPtr<ID3D11DeviceContext> context; |
651 d3d11_device_->GetImmediateContext(context.Receive()); | 651 d3d11_device_->GetImmediateContext(context.GetAddressOf()); |
652 context->CopyResource(dest_texture.Get(), src_texture.Get()); | 652 context->CopyResource(dest_texture.Get(), src_texture.Get()); |
653 } | 653 } |
654 | 654 |
655 swap_chain_->Present(1, 0); | 655 swap_chain_->Present(1, 0); |
656 | 656 |
657 UMA_HISTOGRAM_BOOLEAN("GPU.DirectComposition.SwapchainFormat", | 657 UMA_HISTOGRAM_BOOLEAN("GPU.DirectComposition.SwapchainFormat", |
658 is_yuy2_swapchain_); | 658 is_yuy2_swapchain_); |
659 frames_since_color_space_change_++; | 659 frames_since_color_space_change_++; |
660 | 660 |
661 base::win::ScopedComPtr<IDXGISwapChainMedia> swap_chain_media; | 661 base::win::ScopedComPtr<IDXGISwapChainMedia> swap_chain_media; |
662 if (SUCCEEDED(swap_chain_.CopyTo(swap_chain_media.Receive()))) { | 662 if (SUCCEEDED(swap_chain_.CopyTo(swap_chain_media.GetAddressOf()))) { |
663 DXGI_FRAME_STATISTICS_MEDIA stats = {}; | 663 DXGI_FRAME_STATISTICS_MEDIA stats = {}; |
664 if (SUCCEEDED(swap_chain_media->GetFrameStatisticsMedia(&stats))) { | 664 if (SUCCEEDED(swap_chain_media->GetFrameStatisticsMedia(&stats))) { |
665 UMA_HISTOGRAM_SPARSE_SLOWLY("GPU.DirectComposition.CompositionMode", | 665 UMA_HISTOGRAM_SPARSE_SLOWLY("GPU.DirectComposition.CompositionMode", |
666 stats.CompositionMode); | 666 stats.CompositionMode); |
667 presentation_history_.AddSample(stats.CompositionMode); | 667 presentation_history_.AddSample(stats.CompositionMode); |
668 } | 668 } |
669 } | 669 } |
670 } | 670 } |
671 | 671 |
672 bool DCLayerTree::SwapChainPresenter::InitializeVideoProcessor( | 672 bool DCLayerTree::SwapChainPresenter::InitializeVideoProcessor( |
(...skipping 12 matching lines...) Expand all Loading... |
685 // recreated if the enumerator is. | 685 // recreated if the enumerator is. |
686 out_view_.Reset(); | 686 out_view_.Reset(); |
687 return true; | 687 return true; |
688 } | 688 } |
689 | 689 |
690 void DCLayerTree::SwapChainPresenter::ReallocateSwapChain(bool yuy2) { | 690 void DCLayerTree::SwapChainPresenter::ReallocateSwapChain(bool yuy2) { |
691 TRACE_EVENT0("gpu", "DCLayerTree::SwapChainPresenter::ReallocateSwapChain"); | 691 TRACE_EVENT0("gpu", "DCLayerTree::SwapChainPresenter::ReallocateSwapChain"); |
692 DCHECK(!swap_chain_); | 692 DCHECK(!swap_chain_); |
693 | 693 |
694 base::win::ScopedComPtr<IDXGIDevice> dxgi_device; | 694 base::win::ScopedComPtr<IDXGIDevice> dxgi_device; |
695 d3d11_device_.CopyTo(dxgi_device.Receive()); | 695 d3d11_device_.CopyTo(dxgi_device.GetAddressOf()); |
696 base::win::ScopedComPtr<IDXGIAdapter> dxgi_adapter; | 696 base::win::ScopedComPtr<IDXGIAdapter> dxgi_adapter; |
697 dxgi_device->GetAdapter(dxgi_adapter.Receive()); | 697 dxgi_device->GetAdapter(dxgi_adapter.GetAddressOf()); |
698 base::win::ScopedComPtr<IDXGIFactory2> dxgi_factory; | 698 base::win::ScopedComPtr<IDXGIFactory2> dxgi_factory; |
699 dxgi_adapter->GetParent(IID_PPV_ARGS(dxgi_factory.Receive())); | 699 dxgi_adapter->GetParent(IID_PPV_ARGS(dxgi_factory.GetAddressOf())); |
700 | 700 |
701 base::win::ScopedComPtr<IDXGIFactoryMedia> media_factory; | 701 base::win::ScopedComPtr<IDXGIFactoryMedia> media_factory; |
702 dxgi_factory.CopyTo(media_factory.Receive()); | 702 dxgi_factory.CopyTo(media_factory.GetAddressOf()); |
703 DXGI_SWAP_CHAIN_DESC1 desc = {}; | 703 DXGI_SWAP_CHAIN_DESC1 desc = {}; |
704 desc.Width = swap_chain_size_.width(); | 704 desc.Width = swap_chain_size_.width(); |
705 desc.Height = swap_chain_size_.height(); | 705 desc.Height = swap_chain_size_.height(); |
706 desc.Format = DXGI_FORMAT_YUY2; | 706 desc.Format = DXGI_FORMAT_YUY2; |
707 desc.Stereo = FALSE; | 707 desc.Stereo = FALSE; |
708 desc.SampleDesc.Count = 1; | 708 desc.SampleDesc.Count = 1; |
709 desc.BufferCount = 2; | 709 desc.BufferCount = 2; |
710 desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; | 710 desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; |
711 desc.Scaling = DXGI_SCALING_STRETCH; | 711 desc.Scaling = DXGI_SCALING_STRETCH; |
712 desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; | 712 desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; |
(...skipping 14 matching lines...) Expand all Loading... |
727 | 727 |
728 frames_since_color_space_change_ = 0; | 728 frames_since_color_space_change_ = 0; |
729 | 729 |
730 is_yuy2_swapchain_ = false; | 730 is_yuy2_swapchain_ = false; |
731 // The composition surface handle isn't actually used, but | 731 // The composition surface handle isn't actually used, but |
732 // CreateSwapChainForComposition can't create YUY2 swapchains. | 732 // CreateSwapChainForComposition can't create YUY2 swapchains. |
733 HRESULT hr = E_FAIL; | 733 HRESULT hr = E_FAIL; |
734 if (yuy2) { | 734 if (yuy2) { |
735 hr = media_factory->CreateSwapChainForCompositionSurfaceHandle( | 735 hr = media_factory->CreateSwapChainForCompositionSurfaceHandle( |
736 d3d11_device_.Get(), swap_chain_handle_.Get(), &desc, nullptr, | 736 d3d11_device_.Get(), swap_chain_handle_.Get(), &desc, nullptr, |
737 swap_chain_.Receive()); | 737 swap_chain_.GetAddressOf()); |
738 is_yuy2_swapchain_ = SUCCEEDED(hr); | 738 is_yuy2_swapchain_ = SUCCEEDED(hr); |
739 failed_to_create_yuy2_swapchain_ = !is_yuy2_swapchain_; | 739 failed_to_create_yuy2_swapchain_ = !is_yuy2_swapchain_; |
740 } | 740 } |
741 | 741 |
742 if (!is_yuy2_swapchain_) { | 742 if (!is_yuy2_swapchain_) { |
743 if (yuy2) { | 743 if (yuy2) { |
744 DLOG(ERROR) << "YUY2 creation failed with " << std::hex << hr | 744 DLOG(ERROR) << "YUY2 creation failed with " << std::hex << hr |
745 << ". Falling back to BGRA"; | 745 << ". Falling back to BGRA"; |
746 } | 746 } |
747 desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; | 747 desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; |
748 desc.Flags = 0; | 748 desc.Flags = 0; |
749 hr = media_factory->CreateSwapChainForCompositionSurfaceHandle( | 749 hr = media_factory->CreateSwapChainForCompositionSurfaceHandle( |
750 d3d11_device_.Get(), swap_chain_handle_.Get(), &desc, nullptr, | 750 d3d11_device_.Get(), swap_chain_handle_.Get(), &desc, nullptr, |
751 swap_chain_.Receive()); | 751 swap_chain_.GetAddressOf()); |
752 CHECK(SUCCEEDED(hr)); | 752 CHECK(SUCCEEDED(hr)); |
753 } | 753 } |
754 out_view_.Reset(); | 754 out_view_.Reset(); |
755 } | 755 } |
756 | 756 |
757 void DCLayerTree::InitVisual(size_t i) { | 757 void DCLayerTree::InitVisual(size_t i) { |
758 DCHECK_GT(visual_info_.size(), i); | 758 DCHECK_GT(visual_info_.size(), i); |
759 VisualInfo* visual_info = &visual_info_[i]; | 759 VisualInfo* visual_info = &visual_info_[i]; |
760 if (visual_info->content_visual) | 760 if (visual_info->content_visual) |
761 return; | 761 return; |
762 DCHECK(!visual_info->clip_visual); | 762 DCHECK(!visual_info->clip_visual); |
763 base::win::ScopedComPtr<IDCompositionVisual2> visual; | 763 base::win::ScopedComPtr<IDCompositionVisual2> visual; |
764 dcomp_device_->CreateVisual(visual_info->clip_visual.Receive()); | 764 dcomp_device_->CreateVisual(visual_info->clip_visual.GetAddressOf()); |
765 dcomp_device_->CreateVisual(visual.Receive()); | 765 dcomp_device_->CreateVisual(visual.GetAddressOf()); |
766 visual_info->content_visual = visual; | 766 visual_info->content_visual = visual; |
767 visual_info->clip_visual->AddVisual(visual.Get(), FALSE, nullptr); | 767 visual_info->clip_visual->AddVisual(visual.Get(), FALSE, nullptr); |
768 | 768 |
769 IDCompositionVisual2* last_visual = | 769 IDCompositionVisual2* last_visual = |
770 (i > 0) ? visual_info_[i - 1].clip_visual.Get() : nullptr; | 770 (i > 0) ? visual_info_[i - 1].clip_visual.Get() : nullptr; |
771 root_visual_->AddVisual(visual_info->clip_visual.Get(), TRUE, last_visual); | 771 root_visual_->AddVisual(visual_info->clip_visual.Get(), TRUE, last_visual); |
772 } | 772 } |
773 | 773 |
774 void DCLayerTree::UpdateVisualForVideo( | 774 void DCLayerTree::UpdateVisualForVideo( |
775 VisualInfo* visual_info, | 775 VisualInfo* visual_info, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
807 gfx::Transform scale_transform; | 807 gfx::Transform scale_transform; |
808 scale_transform.Scale( | 808 scale_transform.Scale( |
809 visual_info->swap_chain_presenter->swap_chain_scale_x(), | 809 visual_info->swap_chain_presenter->swap_chain_scale_x(), |
810 visual_info->swap_chain_presenter->swap_chain_scale_y()); | 810 visual_info->swap_chain_presenter->swap_chain_scale_y()); |
811 final_transform.PreconcatTransform(scale_transform); | 811 final_transform.PreconcatTransform(scale_transform); |
812 final_transform.Transpose(); | 812 final_transform.Transpose(); |
813 | 813 |
814 dc_visual->SetOffsetX(bounds_rect.x()); | 814 dc_visual->SetOffsetX(bounds_rect.x()); |
815 dc_visual->SetOffsetY(bounds_rect.y()); | 815 dc_visual->SetOffsetY(bounds_rect.y()); |
816 base::win::ScopedComPtr<IDCompositionMatrixTransform> dcomp_transform; | 816 base::win::ScopedComPtr<IDCompositionMatrixTransform> dcomp_transform; |
817 dcomp_device_->CreateMatrixTransform(dcomp_transform.Receive()); | 817 dcomp_device_->CreateMatrixTransform(dcomp_transform.GetAddressOf()); |
818 D2D_MATRIX_3X2_F d2d_matrix = {{{final_transform.matrix().get(0, 0), | 818 D2D_MATRIX_3X2_F d2d_matrix = {{{final_transform.matrix().get(0, 0), |
819 final_transform.matrix().get(0, 1), | 819 final_transform.matrix().get(0, 1), |
820 final_transform.matrix().get(1, 0), | 820 final_transform.matrix().get(1, 0), |
821 final_transform.matrix().get(1, 1), | 821 final_transform.matrix().get(1, 1), |
822 final_transform.matrix().get(3, 0), | 822 final_transform.matrix().get(3, 0), |
823 final_transform.matrix().get(3, 1)}}}; | 823 final_transform.matrix().get(3, 1)}}}; |
824 dcomp_transform->SetMatrix(d2d_matrix); | 824 dcomp_transform->SetMatrix(d2d_matrix); |
825 dc_visual->SetTransform(dcomp_transform.Get()); | 825 dc_visual->SetTransform(dcomp_transform.Get()); |
826 } | 826 } |
827 } | 827 } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
861 const ui::DCRendererLayerParams& params) { | 861 const ui::DCRendererLayerParams& params) { |
862 if (params.is_clipped != visual_info->is_clipped || | 862 if (params.is_clipped != visual_info->is_clipped || |
863 params.clip_rect != visual_info->clip_rect) { | 863 params.clip_rect != visual_info->clip_rect) { |
864 // DirectComposition clips happen in the pre-transform visual | 864 // DirectComposition clips happen in the pre-transform visual |
865 // space, while cc/ clips happen post-transform. So the clip needs | 865 // space, while cc/ clips happen post-transform. So the clip needs |
866 // to go on a separate parent visual that's untransformed. | 866 // to go on a separate parent visual that's untransformed. |
867 visual_info->is_clipped = params.is_clipped; | 867 visual_info->is_clipped = params.is_clipped; |
868 visual_info->clip_rect = params.clip_rect; | 868 visual_info->clip_rect = params.clip_rect; |
869 if (params.is_clipped) { | 869 if (params.is_clipped) { |
870 base::win::ScopedComPtr<IDCompositionRectangleClip> clip; | 870 base::win::ScopedComPtr<IDCompositionRectangleClip> clip; |
871 dcomp_device_->CreateRectangleClip(clip.Receive()); | 871 dcomp_device_->CreateRectangleClip(clip.GetAddressOf()); |
872 gfx::Rect offset_clip = params.clip_rect; | 872 gfx::Rect offset_clip = params.clip_rect; |
873 clip->SetLeft(offset_clip.x()); | 873 clip->SetLeft(offset_clip.x()); |
874 clip->SetRight(offset_clip.right()); | 874 clip->SetRight(offset_clip.right()); |
875 clip->SetBottom(offset_clip.bottom()); | 875 clip->SetBottom(offset_clip.bottom()); |
876 clip->SetTop(offset_clip.y()); | 876 clip->SetTop(offset_clip.y()); |
877 visual_info->clip_visual->SetClip(clip.Get()); | 877 visual_info->clip_visual->SetClip(clip.Get()); |
878 } else { | 878 } else { |
879 visual_info->clip_visual->SetClip(nullptr); | 879 visual_info->clip_visual->SetClip(nullptr); |
880 } | 880 } |
881 } | 881 } |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1017 DCHECK(!swap_chain_); | 1017 DCHECK(!swap_chain_); |
1018 DXGI_FORMAT output_format = | 1018 DXGI_FORMAT output_format = |
1019 base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableHDR) | 1019 base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableHDR) |
1020 ? DXGI_FORMAT_R16G16B16A16_FLOAT | 1020 ? DXGI_FORMAT_R16G16B16A16_FLOAT |
1021 : DXGI_FORMAT_B8G8R8A8_UNORM; | 1021 : DXGI_FORMAT_B8G8R8A8_UNORM; |
1022 if (enable_dc_layers_) { | 1022 if (enable_dc_layers_) { |
1023 // Always treat as premultiplied, because an underlay could cause it to | 1023 // Always treat as premultiplied, because an underlay could cause it to |
1024 // become transparent. | 1024 // become transparent. |
1025 HRESULT hr = dcomp_device_->CreateSurface( | 1025 HRESULT hr = dcomp_device_->CreateSurface( |
1026 size_.width(), size_.height(), output_format, | 1026 size_.width(), size_.height(), output_format, |
1027 DXGI_ALPHA_MODE_PREMULTIPLIED, dcomp_surface_.Receive()); | 1027 DXGI_ALPHA_MODE_PREMULTIPLIED, dcomp_surface_.GetAddressOf()); |
1028 has_been_rendered_to_ = false; | 1028 has_been_rendered_to_ = false; |
1029 CHECK(SUCCEEDED(hr)); | 1029 CHECK(SUCCEEDED(hr)); |
1030 } else { | 1030 } else { |
1031 DXGI_ALPHA_MODE alpha_mode = | 1031 DXGI_ALPHA_MODE alpha_mode = |
1032 has_alpha_ ? DXGI_ALPHA_MODE_PREMULTIPLIED : DXGI_ALPHA_MODE_IGNORE; | 1032 has_alpha_ ? DXGI_ALPHA_MODE_PREMULTIPLIED : DXGI_ALPHA_MODE_IGNORE; |
1033 base::win::ScopedComPtr<IDXGIDevice> dxgi_device; | 1033 base::win::ScopedComPtr<IDXGIDevice> dxgi_device; |
1034 d3d11_device_.CopyTo(dxgi_device.Receive()); | 1034 d3d11_device_.CopyTo(dxgi_device.GetAddressOf()); |
1035 base::win::ScopedComPtr<IDXGIAdapter> dxgi_adapter; | 1035 base::win::ScopedComPtr<IDXGIAdapter> dxgi_adapter; |
1036 dxgi_device->GetAdapter(dxgi_adapter.Receive()); | 1036 dxgi_device->GetAdapter(dxgi_adapter.GetAddressOf()); |
1037 base::win::ScopedComPtr<IDXGIFactory2> dxgi_factory; | 1037 base::win::ScopedComPtr<IDXGIFactory2> dxgi_factory; |
1038 dxgi_adapter->GetParent(IID_PPV_ARGS(dxgi_factory.Receive())); | 1038 dxgi_adapter->GetParent(IID_PPV_ARGS(dxgi_factory.GetAddressOf())); |
1039 | 1039 |
1040 DXGI_SWAP_CHAIN_DESC1 desc = {}; | 1040 DXGI_SWAP_CHAIN_DESC1 desc = {}; |
1041 desc.Width = size_.width(); | 1041 desc.Width = size_.width(); |
1042 desc.Height = size_.height(); | 1042 desc.Height = size_.height(); |
1043 desc.Format = output_format; | 1043 desc.Format = output_format; |
1044 desc.Stereo = FALSE; | 1044 desc.Stereo = FALSE; |
1045 desc.SampleDesc.Count = 1; | 1045 desc.SampleDesc.Count = 1; |
1046 desc.BufferCount = 2; | 1046 desc.BufferCount = 2; |
1047 desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; | 1047 desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; |
1048 desc.Scaling = DXGI_SCALING_STRETCH; | 1048 desc.Scaling = DXGI_SCALING_STRETCH; |
1049 desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; | 1049 desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; |
1050 desc.AlphaMode = alpha_mode; | 1050 desc.AlphaMode = alpha_mode; |
1051 desc.Flags = 0; | 1051 desc.Flags = 0; |
1052 HRESULT hr = dxgi_factory->CreateSwapChainForComposition( | 1052 HRESULT hr = dxgi_factory->CreateSwapChainForComposition( |
1053 d3d11_device_.Get(), &desc, nullptr, swap_chain_.Receive()); | 1053 d3d11_device_.Get(), &desc, nullptr, swap_chain_.GetAddressOf()); |
1054 has_been_rendered_to_ = false; | 1054 has_been_rendered_to_ = false; |
1055 first_swap_ = true; | 1055 first_swap_ = true; |
1056 CHECK(SUCCEEDED(hr)); | 1056 CHECK(SUCCEEDED(hr)); |
1057 } | 1057 } |
1058 } | 1058 } |
1059 | 1059 |
1060 void DirectCompositionSurfaceWin::ReleaseDrawTexture(bool will_discard) { | 1060 void DirectCompositionSurfaceWin::ReleaseDrawTexture(bool will_discard) { |
1061 if (real_surface_) { | 1061 if (real_surface_) { |
1062 eglDestroySurface(GetDisplay(), real_surface_); | 1062 eglDestroySurface(GetDisplay(), real_surface_); |
1063 real_surface_ = nullptr; | 1063 real_surface_ = nullptr; |
1064 } | 1064 } |
1065 if (draw_texture_) { | 1065 if (draw_texture_) { |
1066 draw_texture_.Reset(); | 1066 draw_texture_.Reset(); |
1067 if (dcomp_surface_) { | 1067 if (dcomp_surface_) { |
1068 HRESULT hr = dcomp_surface_->EndDraw(); | 1068 HRESULT hr = dcomp_surface_->EndDraw(); |
1069 CHECK(SUCCEEDED(hr)); | 1069 CHECK(SUCCEEDED(hr)); |
1070 } else if (!will_discard) { | 1070 } else if (!will_discard) { |
1071 DXGI_PRESENT_PARAMETERS params = {}; | 1071 DXGI_PRESENT_PARAMETERS params = {}; |
1072 RECT dirty_rect = swap_rect_.ToRECT(); | 1072 RECT dirty_rect = swap_rect_.ToRECT(); |
1073 params.DirtyRectsCount = 1; | 1073 params.DirtyRectsCount = 1; |
1074 params.pDirtyRects = &dirty_rect; | 1074 params.pDirtyRects = &dirty_rect; |
1075 swap_chain_->Present1(first_swap_ ? 0 : 1, 0, ¶ms); | 1075 swap_chain_->Present1(first_swap_ ? 0 : 1, 0, ¶ms); |
1076 if (first_swap_) { | 1076 if (first_swap_) { |
1077 // Wait for the GPU to finish executing its commands before | 1077 // Wait for the GPU to finish executing its commands before |
1078 // committing the DirectComposition tree, or else the swapchain | 1078 // committing the DirectComposition tree, or else the swapchain |
1079 // may flicker black when it's first presented. | 1079 // may flicker black when it's first presented. |
1080 base::win::ScopedComPtr<IDXGIDevice2> dxgi_device2; | 1080 base::win::ScopedComPtr<IDXGIDevice2> dxgi_device2; |
1081 HRESULT hr = d3d11_device_.CopyTo(dxgi_device2.Receive()); | 1081 HRESULT hr = d3d11_device_.CopyTo(dxgi_device2.GetAddressOf()); |
1082 DCHECK(SUCCEEDED(hr)); | 1082 DCHECK(SUCCEEDED(hr)); |
1083 base::WaitableEvent event( | 1083 base::WaitableEvent event( |
1084 base::WaitableEvent::ResetPolicy::AUTOMATIC, | 1084 base::WaitableEvent::ResetPolicy::AUTOMATIC, |
1085 base::WaitableEvent::InitialState::NOT_SIGNALED); | 1085 base::WaitableEvent::InitialState::NOT_SIGNALED); |
1086 dxgi_device2->EnqueueSetEvent(event.handle()); | 1086 dxgi_device2->EnqueueSetEvent(event.handle()); |
1087 event.Wait(); | 1087 event.Wait(); |
1088 first_swap_ = false; | 1088 first_swap_ = false; |
1089 } | 1089 } |
1090 } | 1090 } |
1091 } | 1091 } |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1233 DLOG(ERROR) << "First draw to surface must draw to everything"; | 1233 DLOG(ERROR) << "First draw to surface must draw to everything"; |
1234 return false; | 1234 return false; |
1235 } | 1235 } |
1236 | 1236 |
1237 CHECK(!g_current_surface); | 1237 CHECK(!g_current_surface); |
1238 | 1238 |
1239 RECT rect = rectangle.ToRECT(); | 1239 RECT rect = rectangle.ToRECT(); |
1240 if (dcomp_surface_) { | 1240 if (dcomp_surface_) { |
1241 POINT update_offset; | 1241 POINT update_offset; |
1242 HRESULT hr = dcomp_surface_->BeginDraw( | 1242 HRESULT hr = dcomp_surface_->BeginDraw( |
1243 &rect, IID_PPV_ARGS(draw_texture_.Receive()), &update_offset); | 1243 &rect, IID_PPV_ARGS(draw_texture_.GetAddressOf()), &update_offset); |
1244 draw_offset_ = gfx::Point(update_offset) - gfx::Rect(rect).origin(); | 1244 draw_offset_ = gfx::Point(update_offset) - gfx::Rect(rect).origin(); |
1245 CHECK(SUCCEEDED(hr)); | 1245 CHECK(SUCCEEDED(hr)); |
1246 } else { | 1246 } else { |
1247 HRESULT hr = | 1247 HRESULT hr = |
1248 swap_chain_->GetBuffer(0, IID_PPV_ARGS(draw_texture_.Receive())); | 1248 swap_chain_->GetBuffer(0, IID_PPV_ARGS(draw_texture_.GetAddressOf())); |
1249 swap_rect_ = rectangle; | 1249 swap_rect_ = rectangle; |
1250 draw_offset_ = gfx::Vector2d(); | 1250 draw_offset_ = gfx::Vector2d(); |
1251 CHECK(SUCCEEDED(hr)); | 1251 CHECK(SUCCEEDED(hr)); |
1252 } | 1252 } |
1253 has_been_rendered_to_ = true; | 1253 has_been_rendered_to_ = true; |
1254 | 1254 |
1255 g_current_surface = dcomp_surface_.Get(); | 1255 g_current_surface = dcomp_surface_.Get(); |
1256 | 1256 |
1257 std::vector<EGLint> pbuffer_attribs{ | 1257 std::vector<EGLint> pbuffer_attribs{ |
1258 EGL_WIDTH, | 1258 EGL_WIDTH, |
(...skipping 21 matching lines...) Expand all Loading... |
1280 DirectCompositionSurfaceWin::GetWindowTaskRunnerForTesting() { | 1280 DirectCompositionSurfaceWin::GetWindowTaskRunnerForTesting() { |
1281 return child_window_.GetTaskRunnerForTesting(); | 1281 return child_window_.GetTaskRunnerForTesting(); |
1282 } | 1282 } |
1283 | 1283 |
1284 base::win::ScopedComPtr<IDXGISwapChain1> | 1284 base::win::ScopedComPtr<IDXGISwapChain1> |
1285 DirectCompositionSurfaceWin::GetLayerSwapChainForTesting(size_t index) const { | 1285 DirectCompositionSurfaceWin::GetLayerSwapChainForTesting(size_t index) const { |
1286 return layer_tree_->GetLayerSwapChainForTesting(index); | 1286 return layer_tree_->GetLayerSwapChainForTesting(index); |
1287 } | 1287 } |
1288 | 1288 |
1289 } // namespace gpu | 1289 } // namespace gpu |
OLD | NEW |