| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "media/gpu/dxva_video_decode_accelerator_win.h" | 5 #include "media/gpu/dxva_video_decode_accelerator_win.h" | 
| 6 | 6 | 
| 7 #include <memory> | 7 #include <memory> | 
| 8 | 8 | 
| 9 #if !defined(OS_WIN) | 9 #if !defined(OS_WIN) | 
| 10 #error This file should only be built on Windows. | 10 #error This file should only be built on Windows. | 
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 378 template <class T> | 378 template <class T> | 
| 379 base::win::ScopedComPtr<T> QueryDeviceObjectFromANGLE(int object_type) { | 379 base::win::ScopedComPtr<T> QueryDeviceObjectFromANGLE(int object_type) { | 
| 380   base::win::ScopedComPtr<T> device_object; | 380   base::win::ScopedComPtr<T> device_object; | 
| 381 | 381 | 
| 382   EGLDisplay egl_display = nullptr; | 382   EGLDisplay egl_display = nullptr; | 
| 383   intptr_t egl_device = 0; | 383   intptr_t egl_device = 0; | 
| 384   intptr_t device = 0; | 384   intptr_t device = 0; | 
| 385 | 385 | 
| 386   { | 386   { | 
| 387     TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. GetHardwareDisplay"); | 387     TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. GetHardwareDisplay"); | 
| 388     egl_display = gfx::GLSurfaceEGL::GetHardwareDisplay(); | 388     egl_display = gl::GLSurfaceEGL::GetHardwareDisplay(); | 
| 389   } | 389   } | 
| 390 | 390 | 
| 391   RETURN_ON_FAILURE(gfx::GLSurfaceEGL::HasEGLExtension("EGL_EXT_device_query"), | 391   RETURN_ON_FAILURE(gl::GLSurfaceEGL::HasEGLExtension("EGL_EXT_device_query"), | 
| 392                     "EGL_EXT_device_query missing", device_object); | 392                     "EGL_EXT_device_query missing", device_object); | 
| 393 | 393 | 
| 394   PFNEGLQUERYDISPLAYATTRIBEXTPROC QueryDisplayAttribEXT = nullptr; | 394   PFNEGLQUERYDISPLAYATTRIBEXTPROC QueryDisplayAttribEXT = nullptr; | 
| 395 | 395 | 
| 396   { | 396   { | 
| 397     TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. eglGetProcAddress"); | 397     TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. eglGetProcAddress"); | 
| 398 | 398 | 
| 399     QueryDisplayAttribEXT = reinterpret_cast<PFNEGLQUERYDISPLAYATTRIBEXTPROC>( | 399     QueryDisplayAttribEXT = reinterpret_cast<PFNEGLQUERYDISPLAYATTRIBEXTPROC>( | 
| 400         eglGetProcAddress("eglQueryDisplayAttribEXT")); | 400         eglGetProcAddress("eglQueryDisplayAttribEXT")); | 
| 401 | 401 | 
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 658   } | 658   } | 
| 659 #endif | 659 #endif | 
| 660   // If we don't find the MFCreateDXGIDeviceManager API we fallback to D3D9 | 660   // If we don't find the MFCreateDXGIDeviceManager API we fallback to D3D9 | 
| 661   // decoding. | 661   // decoding. | 
| 662   if (dxgi_manager_dll && !create_dxgi_device_manager_) { | 662   if (dxgi_manager_dll && !create_dxgi_device_manager_) { | 
| 663     create_dxgi_device_manager_ = reinterpret_cast<CreateDXGIDeviceManager>( | 663     create_dxgi_device_manager_ = reinterpret_cast<CreateDXGIDeviceManager>( | 
| 664         ::GetProcAddress(dxgi_manager_dll, "MFCreateDXGIDeviceManager")); | 664         ::GetProcAddress(dxgi_manager_dll, "MFCreateDXGIDeviceManager")); | 
| 665   } | 665   } | 
| 666 | 666 | 
| 667   RETURN_AND_NOTIFY_ON_FAILURE( | 667   RETURN_AND_NOTIFY_ON_FAILURE( | 
| 668       gfx::g_driver_egl.ext.b_EGL_ANGLE_surface_d3d_texture_2d_share_handle, | 668       gl::g_driver_egl.ext.b_EGL_ANGLE_surface_d3d_texture_2d_share_handle, | 
| 669       "EGL_ANGLE_surface_d3d_texture_2d_share_handle unavailable", | 669       "EGL_ANGLE_surface_d3d_texture_2d_share_handle unavailable", | 
| 670       PLATFORM_FAILURE, false); | 670       PLATFORM_FAILURE, false); | 
| 671 | 671 | 
| 672   RETURN_AND_NOTIFY_ON_FAILURE(gfx::GLFence::IsSupported(), | 672   RETURN_AND_NOTIFY_ON_FAILURE(gl::GLFence::IsSupported(), | 
| 673                                "GL fences are unsupported", PLATFORM_FAILURE, | 673                                "GL fences are unsupported", PLATFORM_FAILURE, | 
| 674                                false); | 674                                false); | 
| 675 | 675 | 
| 676   State state = GetState(); | 676   State state = GetState(); | 
| 677   RETURN_AND_NOTIFY_ON_FAILURE((state == kUninitialized), | 677   RETURN_AND_NOTIFY_ON_FAILURE((state == kUninitialized), | 
| 678                                "Initialize: invalid state: " << state, | 678                                "Initialize: invalid state: " << state, | 
| 679                                ILLEGAL_STATE, false); | 679                                ILLEGAL_STATE, false); | 
| 680 | 680 | 
| 681   media::InitializeMediaFoundation(); | 681   media::InitializeMediaFoundation(); | 
| 682 | 682 | 
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 988   DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); | 988   DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); | 
| 989   OutputBuffers::iterator it = output_picture_buffers_.find(picture_buffer_id); | 989   OutputBuffers::iterator it = output_picture_buffers_.find(picture_buffer_id); | 
| 990   if (it == output_picture_buffers_.end()) | 990   if (it == output_picture_buffers_.end()) | 
| 991     return; | 991     return; | 
| 992 | 992 | 
| 993   DXVAPictureBuffer* picture_buffer = it->second.get(); | 993   DXVAPictureBuffer* picture_buffer = it->second.get(); | 
| 994 | 994 | 
| 995   DCHECK(!picture_buffer->available()); | 995   DCHECK(!picture_buffer->available()); | 
| 996   DCHECK(picture_buffer->waiting_to_reuse()); | 996   DCHECK(picture_buffer->waiting_to_reuse()); | 
| 997 | 997 | 
| 998   gfx::GLFence* fence = picture_buffer->reuse_fence(); | 998   gl::GLFence* fence = picture_buffer->reuse_fence(); | 
| 999   RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_cb_.Run(), | 999   RETURN_AND_NOTIFY_ON_FAILURE(make_context_current_cb_.Run(), | 
| 1000                                "Failed to make context current", | 1000                                "Failed to make context current", | 
| 1001                                PLATFORM_FAILURE, ); | 1001                                PLATFORM_FAILURE, ); | 
| 1002   if (count <= kMaxIterationsForANGLEReuseFlush && !fence->HasCompleted()) { | 1002   if (count <= kMaxIterationsForANGLEReuseFlush && !fence->HasCompleted()) { | 
| 1003     main_thread_task_runner_->PostDelayedTask( | 1003     main_thread_task_runner_->PostDelayedTask( | 
| 1004         FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::WaitForOutputBuffer, | 1004         FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::WaitForOutputBuffer, | 
| 1005                               weak_this_factory_.GetWeakPtr(), | 1005                               weak_this_factory_.GetWeakPtr(), | 
| 1006                               picture_buffer_id, count + 1), | 1006                               picture_buffer_id, count + 1), | 
| 1007         base::TimeDelta::FromMilliseconds(kFlushDecoderSurfaceTimeoutMs)); | 1007         base::TimeDelta::FromMilliseconds(kFlushDecoderSurfaceTimeoutMs)); | 
| 1008     return; | 1008     return; | 
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1420   } | 1420   } | 
| 1421 | 1421 | 
| 1422   hr = decoder_->ProcessMessage(MFT_MESSAGE_SET_D3D_MANAGER, | 1422   hr = decoder_->ProcessMessage(MFT_MESSAGE_SET_D3D_MANAGER, | 
| 1423                                 device_manager_to_use); | 1423                                 device_manager_to_use); | 
| 1424   if (use_dx11_) { | 1424   if (use_dx11_) { | 
| 1425     RETURN_ON_HR_FAILURE(hr, "Failed to pass DX11 manager to decoder", false); | 1425     RETURN_ON_HR_FAILURE(hr, "Failed to pass DX11 manager to decoder", false); | 
| 1426   } else { | 1426   } else { | 
| 1427     RETURN_ON_HR_FAILURE(hr, "Failed to pass D3D manager to decoder", false); | 1427     RETURN_ON_HR_FAILURE(hr, "Failed to pass D3D manager to decoder", false); | 
| 1428   } | 1428   } | 
| 1429 | 1429 | 
| 1430   EGLDisplay egl_display = gfx::GLSurfaceEGL::GetHardwareDisplay(); | 1430   EGLDisplay egl_display = gl::GLSurfaceEGL::GetHardwareDisplay(); | 
| 1431 | 1431 | 
| 1432   EGLint config_attribs[] = {EGL_BUFFER_SIZE,  32, | 1432   EGLint config_attribs[] = {EGL_BUFFER_SIZE,  32, | 
| 1433                              EGL_RED_SIZE,     8, | 1433                              EGL_RED_SIZE,     8, | 
| 1434                              EGL_GREEN_SIZE,   8, | 1434                              EGL_GREEN_SIZE,   8, | 
| 1435                              EGL_BLUE_SIZE,    8, | 1435                              EGL_BLUE_SIZE,    8, | 
| 1436                              EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, | 1436                              EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, | 
| 1437                              EGL_ALPHA_SIZE,   0, | 1437                              EGL_ALPHA_SIZE,   0, | 
| 1438                              EGL_NONE}; | 1438                              EGL_NONE}; | 
| 1439 | 1439 | 
| 1440   EGLint num_configs; | 1440   EGLint num_configs; | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1476   //    this. This should always be true for Windows 8+. | 1476   //    this. This should always be true for Windows 8+. | 
| 1477   // 3. ANGLE is using DX11. | 1477   // 3. ANGLE is using DX11. | 
| 1478   if (create_dxgi_device_manager_ && | 1478   if (create_dxgi_device_manager_ && | 
| 1479       (gl_context->GetGLRenderer().find("Direct3D11") != std::string::npos)) { | 1479       (gl_context->GetGLRenderer().find("Direct3D11") != std::string::npos)) { | 
| 1480     UINT32 dx11_aware = 0; | 1480     UINT32 dx11_aware = 0; | 
| 1481     attributes->GetUINT32(MF_SA_D3D11_AWARE, &dx11_aware); | 1481     attributes->GetUINT32(MF_SA_D3D11_AWARE, &dx11_aware); | 
| 1482     use_dx11_ = !!dx11_aware; | 1482     use_dx11_ = !!dx11_aware; | 
| 1483   } | 1483   } | 
| 1484 | 1484 | 
| 1485   use_keyed_mutex_ = | 1485   use_keyed_mutex_ = | 
| 1486       use_dx11_ && gfx::GLSurfaceEGL::HasEGLExtension("EGL_ANGLE_keyed_mutex"); | 1486       use_dx11_ && gl::GLSurfaceEGL::HasEGLExtension("EGL_ANGLE_keyed_mutex"); | 
| 1487 | 1487 | 
| 1488   if (!use_dx11_ || | 1488   if (!use_dx11_ || | 
| 1489       !gfx::g_driver_egl.ext.b_EGL_ANGLE_stream_producer_d3d_texture_nv12 || | 1489       !gl::g_driver_egl.ext.b_EGL_ANGLE_stream_producer_d3d_texture_nv12 || | 
| 1490       !gfx::g_driver_egl.ext.b_EGL_KHR_stream || | 1490       !gl::g_driver_egl.ext.b_EGL_KHR_stream || | 
| 1491       !gfx::g_driver_egl.ext.b_EGL_KHR_stream_consumer_gltexture || | 1491       !gl::g_driver_egl.ext.b_EGL_KHR_stream_consumer_gltexture || | 
| 1492       !gfx::g_driver_egl.ext.b_EGL_NV_stream_consumer_gltexture_yuv) { | 1492       !gl::g_driver_egl.ext.b_EGL_NV_stream_consumer_gltexture_yuv) { | 
| 1493     share_nv12_textures_ = false; | 1493     share_nv12_textures_ = false; | 
| 1494   } | 1494   } | 
| 1495 | 1495 | 
| 1496   return true; | 1496   return true; | 
| 1497 } | 1497 } | 
| 1498 | 1498 | 
| 1499 bool DXVAVideoDecodeAccelerator::SetDecoderMediaTypes() { | 1499 bool DXVAVideoDecodeAccelerator::SetDecoderMediaTypes() { | 
| 1500   RETURN_ON_FAILURE(SetDecoderInputMediaType(), | 1500   RETURN_ON_FAILURE(SetDecoderInputMediaType(), | 
| 1501                     "Failed to set decoder input media type", false); | 1501                     "Failed to set decoder input media type", false); | 
| 1502   return SetDecoderOutputMediaType(MFVideoFormat_NV12); | 1502   return SetDecoderOutputMediaType(MFVideoFormat_NV12); | 
| (...skipping 1142 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2645   DismissStaleBuffers(true); | 2645   DismissStaleBuffers(true); | 
| 2646   Invalidate(); | 2646   Invalidate(); | 
| 2647   Initialize(config_, client_); | 2647   Initialize(config_, client_); | 
| 2648   decoder_thread_task_runner_->PostTask( | 2648   decoder_thread_task_runner_->PostTask( | 
| 2649       FROM_HERE, | 2649       FROM_HERE, | 
| 2650       base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers, | 2650       base::Bind(&DXVAVideoDecodeAccelerator::DecodePendingInputBuffers, | 
| 2651                  base::Unretained(this))); | 2651                  base::Unretained(this))); | 
| 2652 } | 2652 } | 
| 2653 | 2653 | 
| 2654 }  // namespace media | 2654 }  // namespace media | 
| OLD | NEW | 
|---|