Skip to content

Commit

Permalink
Unify code to query D3D device object from ANGLE
Browse files Browse the repository at this point in the history
We need to be able to do this in several places (soon including some
outside media/).
CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:linux_optional_gpu_tests_rel;master.tryserver.chromium.mac:mac_optional_gpu_tests_rel;master.tryserver.chromium.win:win_optional_gpu_tests_rel

Review-Url: https://codereview.chromium.org/2565123002
Cr-Commit-Position: refs/heads/master@{#438923}
  • Loading branch information
jbauman2 authored and Commit bot committed Dec 15, 2016
1 parent fc0257d commit 575788b
Show file tree
Hide file tree
Showing 6 changed files with 122 additions and 156 deletions.
80 changes: 2 additions & 78 deletions media/gpu/d3d11_video_decode_accelerator_win.cc
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,9 @@
#include "media/gpu/d3d11_h264_accelerator.h"
#include "media/gpu/h264_decoder.h"
#include "media/gpu/h264_dpb.h"
#include "third_party/angle/include/EGL/egl.h"
#include "third_party/angle/include/EGL/eglext.h"
#include "ui/gfx/color_space.h"
#include "ui/gl/gl_angle_util_win.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
#include "ui/gl/gl_surface_egl.h"

namespace media {

Expand All @@ -36,79 +33,6 @@ namespace media {
} \
} while (0)

// Helper function to query the ANGLE device object. The template argument T
// identifies the device interface being queried. IDirect3DDevice9Ex for d3d9
// and ID3D11Device for dx11.
template <class T>
base::win::ScopedComPtr<T> QueryDeviceObjectFromANGLE(int object_type) {
base::win::ScopedComPtr<T> device_object;

EGLDisplay egl_display = nullptr;
intptr_t egl_device = 0;
intptr_t device = 0;

{
TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. GetHardwareDisplay");
egl_display = gl::GLSurfaceEGL::GetHardwareDisplay();
}

RETURN_ON_FAILURE(gl::GLSurfaceEGL::HasEGLExtension("EGL_EXT_device_query"),
"EGL_EXT_device_query missing", device_object);

PFNEGLQUERYDISPLAYATTRIBEXTPROC QueryDisplayAttribEXT = nullptr;

{
TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. eglGetProcAddress");

QueryDisplayAttribEXT = reinterpret_cast<PFNEGLQUERYDISPLAYATTRIBEXTPROC>(
eglGetProcAddress("eglQueryDisplayAttribEXT"));

RETURN_ON_FAILURE(
QueryDisplayAttribEXT,
"Failed to get the eglQueryDisplayAttribEXT function from ANGLE",
device_object);
}

PFNEGLQUERYDEVICEATTRIBEXTPROC QueryDeviceAttribEXT = nullptr;

{
TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. eglGetProcAddress");

QueryDeviceAttribEXT = reinterpret_cast<PFNEGLQUERYDEVICEATTRIBEXTPROC>(
eglGetProcAddress("eglQueryDeviceAttribEXT"));

RETURN_ON_FAILURE(
QueryDeviceAttribEXT,
"Failed to get the eglQueryDeviceAttribEXT function from ANGLE",
device_object);
}

{
TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. QueryDisplayAttribEXT");

RETURN_ON_FAILURE(
QueryDisplayAttribEXT(egl_display, EGL_DEVICE_EXT, &egl_device),
"The eglQueryDisplayAttribEXT function failed to get the EGL device",
device_object);
}

RETURN_ON_FAILURE(egl_device, "Failed to get the EGL device", device_object);

{
TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. QueryDisplayAttribEXT");

RETURN_ON_FAILURE(
QueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(egl_device),
object_type, &device),
"The eglQueryDeviceAttribEXT function failed to get the device",
device_object);

RETURN_ON_FAILURE(device, "Failed to get the ANGLE device", device_object);
}

device_object = reinterpret_cast<T*>(device);
return device_object;
}

D3D11VideoDecodeAccelerator::D3D11VideoDecodeAccelerator(
const GetGLContextCallback& get_gl_context_cb,
Expand All @@ -123,7 +47,7 @@ bool D3D11VideoDecodeAccelerator::Initialize(const Config& config,
client_ = client;
make_context_current_cb_.Run();

device_ = QueryDeviceObjectFromANGLE<ID3D11Device>(EGL_D3D11_DEVICE_ANGLE);
device_ = gl::QueryD3D11DeviceObjectFromANGLE();
device_->GetImmediateContext(device_context_.Receive());

HRESULT hr = device_context_.QueryInterface(video_context_.Receive());
Expand Down
82 changes: 4 additions & 78 deletions media/gpu/dxva_video_decode_accelerator_win.cc
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
#include "third_party/angle/include/EGL/egl.h"
#include "third_party/angle/include/EGL/eglext.h"
#include "ui/gfx/color_space_win.h"
#include "ui/gl/gl_angle_util_win.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
#include "ui/gl/gl_fence.h"
Expand Down Expand Up @@ -346,80 +347,6 @@ HRESULT CreateCOMObjectFromDll(HMODULE dll,
return hr;
}

// Helper function to query the ANGLE device object. The template argument T
// identifies the device interface being queried. IDirect3DDevice9Ex for d3d9
// and ID3D11Device for dx11.
template <class T>
base::win::ScopedComPtr<T> QueryDeviceObjectFromANGLE(int object_type) {
base::win::ScopedComPtr<T> device_object;

EGLDisplay egl_display = nullptr;
intptr_t egl_device = 0;
intptr_t device = 0;

{
TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. GetHardwareDisplay");
egl_display = gl::GLSurfaceEGL::GetHardwareDisplay();
}

RETURN_ON_FAILURE(gl::GLSurfaceEGL::HasEGLExtension("EGL_EXT_device_query"),
"EGL_EXT_device_query missing", device_object);

PFNEGLQUERYDISPLAYATTRIBEXTPROC QueryDisplayAttribEXT = nullptr;

{
TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. eglGetProcAddress");

QueryDisplayAttribEXT = reinterpret_cast<PFNEGLQUERYDISPLAYATTRIBEXTPROC>(
eglGetProcAddress("eglQueryDisplayAttribEXT"));

RETURN_ON_FAILURE(
QueryDisplayAttribEXT,
"Failed to get the eglQueryDisplayAttribEXT function from ANGLE",
device_object);
}

PFNEGLQUERYDEVICEATTRIBEXTPROC QueryDeviceAttribEXT = nullptr;

{
TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. eglGetProcAddress");

QueryDeviceAttribEXT = reinterpret_cast<PFNEGLQUERYDEVICEATTRIBEXTPROC>(
eglGetProcAddress("eglQueryDeviceAttribEXT"));

RETURN_ON_FAILURE(
QueryDeviceAttribEXT,
"Failed to get the eglQueryDeviceAttribEXT function from ANGLE",
device_object);
}

{
TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. QueryDisplayAttribEXT");

RETURN_ON_FAILURE(
QueryDisplayAttribEXT(egl_display, EGL_DEVICE_EXT, &egl_device),
"The eglQueryDisplayAttribEXT function failed to get the EGL device",
device_object);
}

RETURN_ON_FAILURE(egl_device, "Failed to get the EGL device", device_object);

{
TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. QueryDisplayAttribEXT");

RETURN_ON_FAILURE(
QueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(egl_device),
object_type, &device),
"The eglQueryDeviceAttribEXT function failed to get the device",
device_object);

RETURN_ON_FAILURE(device, "Failed to get the ANGLE device", device_object);
}

device_object = reinterpret_cast<T*>(device);
return device_object;
}

H264ConfigChangeDetector::H264ConfigChangeDetector()
: last_sps_id_(0),
last_pps_id_(0),
Expand Down Expand Up @@ -728,7 +655,7 @@ bool DXVAVideoDecodeAccelerator::CreateD3DDevManager() {
false);

base::win::ScopedComPtr<IDirect3DDevice9> angle_device =
QueryDeviceObjectFromANGLE<IDirect3DDevice9>(EGL_D3D9_DEVICE_ANGLE);
gl::QueryD3D9DeviceObjectFromANGLE();
if (angle_device.get())
using_angle_device_ = true;

Expand Down Expand Up @@ -868,8 +795,7 @@ bool DXVAVideoDecodeAccelerator::CreateDX11DevManager() {
d3d11_device_manager_.Receive());
RETURN_ON_HR_FAILURE(hr, "MFCreateDXGIDeviceManager failed", false);

angle_device_ =
QueryDeviceObjectFromANGLE<ID3D11Device>(EGL_D3D11_DEVICE_ANGLE);
angle_device_ = gl::QueryD3D11DeviceObjectFromANGLE();
if (!angle_device_)
copy_nv12_textures_ = false;
if (share_nv12_textures_) {
Expand Down Expand Up @@ -1371,7 +1297,7 @@ std::pair<int, int> DXVAVideoDecodeAccelerator::GetMaxH264Resolution() {
TRACE_EVENT0("gpu,startup",
"GetMaxH264Resolution. QueryDeviceObjectFromANGLE");

device = QueryDeviceObjectFromANGLE<ID3D11Device>(EGL_D3D11_DEVICE_ANGLE);
device = gl::QueryD3D11DeviceObjectFromANGLE();
if (!device.get())
return max_resolution;
}
Expand Down
4 changes: 4 additions & 0 deletions ui/gl/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,8 @@ component("gl") {
}
if (is_win) {
sources += [
"gl_angle_util_win.cc",
"gl_angle_util_win.h",
"gl_bindings_autogen_wgl.cc",
"gl_bindings_autogen_wgl.h",
"gl_context_wgl.cc",
Expand All @@ -243,6 +245,8 @@ component("gl") {
"//third_party/angle:libGLESv2",
"//third_party/mesa:osmesa",
]

deps += [ "//third_party/angle:includes" ]
}
if (is_mac) {
sources += [
Expand Down
4 changes: 4 additions & 0 deletions ui/gl/DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,8 @@ specific_include_rules = {
"angle_platform_impl.h": [
"+third_party/angle/include/platform/Platform.h",
],
"gl_angle_util_win.cc": [
"+third_party/angle/include/EGL/egl.h",
"+third_party/angle/include/EGL/eglext.h",
],
}
85 changes: 85 additions & 0 deletions ui/gl/gl_angle_util_win.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/gl/gl_angle_util_win.h"

#include "base/trace_event/trace_event.h"
#include "third_party/angle/include/EGL/egl.h"
#include "third_party/angle/include/EGL/eglext.h"
#include "ui/gl/gl_surface_egl.h"

namespace gl {

void* QueryDeviceObjectFromANGLE(int object_type) {
EGLDisplay egl_display = nullptr;
intptr_t egl_device = 0;
intptr_t device = 0;

{
TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. GetHardwareDisplay");
egl_display = gl::GLSurfaceEGL::GetHardwareDisplay();
}

if (!gl::GLSurfaceEGL::HasEGLExtension("EGL_EXT_device_query"))
return nullptr;

PFNEGLQUERYDISPLAYATTRIBEXTPROC QueryDisplayAttribEXT = nullptr;

{
TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. eglGetProcAddress");

QueryDisplayAttribEXT = reinterpret_cast<PFNEGLQUERYDISPLAYATTRIBEXTPROC>(
eglGetProcAddress("eglQueryDisplayAttribEXT"));

if (!QueryDisplayAttribEXT)
return nullptr;
}

PFNEGLQUERYDEVICEATTRIBEXTPROC QueryDeviceAttribEXT = nullptr;

{
TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. eglGetProcAddress");

QueryDeviceAttribEXT = reinterpret_cast<PFNEGLQUERYDEVICEATTRIBEXTPROC>(
eglGetProcAddress("eglQueryDeviceAttribEXT"));
if (!QueryDeviceAttribEXT)
return nullptr;
}

{
TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. QueryDisplayAttribEXT");

if (!QueryDisplayAttribEXT(egl_display, EGL_DEVICE_EXT, &egl_device))
return nullptr;
}
if (!egl_device)
return nullptr;

{
TRACE_EVENT0("gpu", "QueryDeviceObjectFromANGLE. QueryDisplayAttribEXT");

if (!QueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(egl_device),
object_type, &device)) {
return nullptr;
}
}

return reinterpret_cast<void*>(device);
}

base::win::ScopedComPtr<ID3D11Device> QueryD3D11DeviceObjectFromANGLE() {
base::win::ScopedComPtr<ID3D11Device> d3d11_device;
d3d11_device = reinterpret_cast<ID3D11Device*>(
QueryDeviceObjectFromANGLE(EGL_D3D11_DEVICE_ANGLE));
return d3d11_device;
}

base::win::ScopedComPtr<IDirect3DDevice9> QueryD3D9DeviceObjectFromANGLE() {
base::win::ScopedComPtr<IDirect3DDevice9> d3d9_device;
d3d9_device = reinterpret_cast<IDirect3DDevice9*>(
QueryDeviceObjectFromANGLE(EGL_D3D9_DEVICE_ANGLE));
return d3d9_device;
}

} // namespace gl
23 changes: 23 additions & 0 deletions ui/gl/gl_angle_util_win.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_GL_GL_ANGLE_UTIL_WIN_H_
#define UI_GL_GL_ANGLE_UTIL_WIN_H_

#include <d3d11.h>
#include <d3d9.h>

#include "base/win/scoped_comptr.h"
#include "ui/gl/gl_export.h"

namespace gl {

GL_EXPORT base::win::ScopedComPtr<ID3D11Device>
QueryD3D11DeviceObjectFromANGLE();
GL_EXPORT base::win::ScopedComPtr<IDirect3DDevice9>
QueryD3D9DeviceObjectFromANGLE();

} // namespace gl

#endif // UI_GL_GL_ANGLE_UTIL_WIN_H_

0 comments on commit 575788b

Please sign in to comment.