Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(184)

Unified Diff: content/common/gpu/media/dxva_video_decode_accelerator.cc

Issue 11411249: Do DXVA pre-sandbox initialization off the main thread. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/common/gpu/media/dxva_video_decode_accelerator.cc
===================================================================
--- content/common/gpu/media/dxva_video_decode_accelerator.cc (revision 169901)
+++ content/common/gpu/media/dxva_video_decode_accelerator.cc (working copy)
@@ -24,6 +24,7 @@
#include "base/message_loop.h"
#include "base/process_util.h"
#include "base/shared_memory.h"
+#include "base/threading/worker_pool.h"
#include "media/video/video_decode_accelerator.h"
#include "third_party/angle/include/EGL/egl.h"
#include "third_party/angle/include/EGL/eglext.h"
@@ -367,10 +368,14 @@
DXVAVideoDecodeAccelerator::PendingSampleInfo::~PendingSampleInfo() {}
// static
-void DXVAVideoDecodeAccelerator::PreSandboxInitialization() {
+// Initializes DXVA on a separate thread.
+void DXVAVideoDecodeAccelerator::PreSandboxInitialization(
+ const base::Closure& completion_task) {
// Should be called only once during program startup.
DCHECK(!pre_sandbox_init_done_);
+ base::ScopedClosureRunner scoped_completion_runner(completion_task);
+
static wchar_t* decoding_dlls[] = {
L"d3d9.dll",
L"dxva2.dll",
@@ -387,15 +392,24 @@
}
}
- RETURN_ON_FAILURE(CreateD3DDevManager(),
- "Failed to initialize D3D device and manager",);
- pre_sandbox_init_done_ = true;
+ HRESULT hr = Direct3DCreate9Ex(D3D_SDK_VERSION, &d3d9_);
+ RETURN_ON_HR_FAILURE(hr,
+ "Failed to initialize D3D9.",);
+
+ // Initialize H/W video decoding stuff which fails in the sandbox. This is
+ // done on a worker thread because it takes 10s of ms.
+ scoped_completion_runner.Release();
+ base::WorkerPool::PostTask(
+ FROM_HERE,
+ base::Bind(&DXVAVideoDecodeAccelerator::CreateD3DDevManager,
+ completion_task),
+ true);
}
// static
-bool DXVAVideoDecodeAccelerator::CreateD3DDevManager() {
- HRESULT hr = Direct3DCreate9Ex(D3D_SDK_VERSION, &d3d9_);
- RETURN_ON_HR_FAILURE(hr, "Direct3DCreate9Ex failed", false);
+void DXVAVideoDecodeAccelerator::CreateD3DDevManager(
+ const base::Closure& completion_task) {
+ base::ScopedClosureRunner scoped_completion_runner(completion_task);
D3DPRESENT_PARAMETERS present_params = {0};
present_params.BackBufferWidth = 1;
@@ -409,32 +423,34 @@
present_params.FullScreen_RefreshRateInHz = 0;
present_params.PresentationInterval = 0;
- hr = d3d9_->CreateDeviceEx(D3DADAPTER_DEFAULT,
- D3DDEVTYPE_HAL,
- ::GetShellWindow(),
- D3DCREATE_FPU_PRESERVE |
- D3DCREATE_SOFTWARE_VERTEXPROCESSING |
- D3DCREATE_DISABLE_PSGP_THREADING |
- D3DCREATE_MULTITHREADED,
- &present_params,
- NULL,
- &device_);
- RETURN_ON_HR_FAILURE(hr, "Failed to create D3D device", false);
+ HRESULT hr = d3d9_->CreateDeviceEx(D3DADAPTER_DEFAULT,
+ D3DDEVTYPE_HAL,
+ ::GetShellWindow(),
+ D3DCREATE_FPU_PRESERVE |
+ D3DCREATE_SOFTWARE_VERTEXPROCESSING |
+ D3DCREATE_DISABLE_PSGP_THREADING |
+ D3DCREATE_MULTITHREADED,
+ &present_params,
+ NULL,
+ &device_);
+ RETURN_ON_HR_FAILURE(hr, "Failed to create D3D device",);
hr = DXVA2CreateDirect3DDeviceManager9(&dev_manager_reset_token_,
&device_manager_);
- RETURN_ON_HR_FAILURE(hr, "DXVA2CreateDirect3DDeviceManager9 failed", false);
+ RETURN_ON_HR_FAILURE(hr, "DXVA2CreateDirect3DDeviceManager9 failed",);
hr = device_manager_->ResetDevice(device_, dev_manager_reset_token_);
- RETURN_ON_HR_FAILURE(hr, "Failed to reset device", false);
+ RETURN_ON_HR_FAILURE(hr, "Failed to reset device",);
hr = device_->CreateQuery(D3DQUERYTYPE_EVENT, &query_);
- RETURN_ON_HR_FAILURE(hr, "Failed to create D3D device query", false);
+ RETURN_ON_HR_FAILURE(hr, "Failed to create D3D device query",);
+
// Ensure query_ API works (to avoid an infinite loop later in
// CopyOutputSampleDataToPictureBuffer).
hr = query_->Issue(D3DISSUE_END);
- RETURN_ON_HR_FAILURE(hr, "Failed to issue END test query", false);
- return true;
+ RETURN_ON_HR_FAILURE(hr, "Failed to issue END test query",);
+
+ pre_sandbox_init_done_ = true;
}
DXVAVideoDecodeAccelerator::DXVAVideoDecodeAccelerator(

Powered by Google App Engine
This is Rietveld 408576698