summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorsheu@chromium.org <sheu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-22 23:23:15 +0000
committersheu@chromium.org <sheu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-22 23:23:15 +0000
commit499bf84ff8932f84d0499fbf833b81e9a8c434c1 (patch)
treeb0993dd89e68d9706d35457ac2831f8c6b6ee4f4 /content
parent41ad897a9ccc9fe972994b99ef8be86bffed998a (diff)
downloadchromium_src-499bf84ff8932f84d0499fbf833b81e9a8c434c1.zip
chromium_src-499bf84ff8932f84d0499fbf833b81e9a8c434c1.tar.gz
chromium_src-499bf84ff8932f84d0499fbf833b81e9a8c434c1.tar.bz2
Use ui/gl/gl_bindings.h for content/common/gpu/media/
Use GPU process GL bindings for video decoders. This also requires video_decode_accelerator_unittest to properly set up the GL bindings now. BUG=chromium:169433 TEST=local build, run on snow; trybots Change-Id: I4087085f215960c7b67fdb1177707cf7323e7868 Review URL: https://chromiumcodereview.appspot.com/11867008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@178150 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r--content/common/gpu/media/dxva_video_decode_accelerator.cc2
-rw-r--r--content/common/gpu/media/exynos_video_decode_accelerator.cc107
-rw-r--r--content/common/gpu/media/exynos_video_decode_accelerator.h3
-rw-r--r--content/common/gpu/media/gles2_texture_to_egl_image_translator.cc54
-rw-r--r--content/common/gpu/media/gles2_texture_to_egl_image_translator.h5
-rw-r--r--content/common/gpu/media/omx_video_decode_accelerator.cc30
-rw-r--r--content/common/gpu/media/omx_video_decode_accelerator.h3
-rw-r--r--content/common/gpu/media/rendering_helper_gl.cc98
-rw-r--r--content/common/gpu/media/rendering_helper_mac.mm1
-rw-r--r--content/common/gpu/media/vaapi_video_decode_accelerator.h3
10 files changed, 131 insertions, 175 deletions
diff --git a/content/common/gpu/media/dxva_video_decode_accelerator.cc b/content/common/gpu/media/dxva_video_decode_accelerator.cc
index ec46901..d354f24 100644
--- a/content/common/gpu/media/dxva_video_decode_accelerator.cc
+++ b/content/common/gpu/media/dxva_video_decode_accelerator.cc
@@ -26,8 +26,6 @@
#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"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_surface.h"
#include "ui/gl/gl_switches.h"
diff --git a/content/common/gpu/media/exynos_video_decode_accelerator.cc b/content/common/gpu/media/exynos_video_decode_accelerator.cc
index ae464aa..8c6762e 100644
--- a/content/common/gpu/media/exynos_video_decode_accelerator.cc
+++ b/content/common/gpu/media/exynos_video_decode_accelerator.cc
@@ -20,7 +20,6 @@
#include "content/common/gpu/gl_scoped_binders.h"
#include "content/common/gpu/media/exynos_video_decode_accelerator.h"
#include "content/common/gpu/media/h264_parser.h"
-#include "third_party/angle/include/GLES2/gl2.h"
namespace content {
@@ -49,44 +48,18 @@ namespace content {
} \
} while (0)
-#define POSTSANDBOX_DLSYM(lib, func, type, name) \
- func = reinterpret_cast<type>(dlsym(lib, name)); \
- if (func == NULL) { \
- DPLOG(ERROR) << "PostSandboxInitialization(): failed to dlsym() " \
- << name << ": " << dlerror(); \
- return false; \
- }
-
namespace {
const char kExynosMfcDevice[] = "/dev/mfc-dec";
const char kExynosGscDevice[] = "/dev/gsc1";
const char kMaliDriver[] = "libmali.so";
-// TODO(sheu): fix OpenGL ES header includes, remove unnecessary redefinitions.
-// http://crbug.com/169433
-typedef void* GLeglImageOES;
typedef EGLBoolean (*MaliEglImageGetBufferExtPhandleFunc)(EGLImageKHR, EGLint*,
void*);
-typedef EGLImageKHR (*EglCreateImageKhrFunc)(EGLDisplay, EGLContext, EGLenum,
- EGLClientBuffer, const EGLint*);
-typedef EGLBoolean (*EglDestroyImageKhrFunc)(EGLDisplay, EGLImageKHR);
-typedef EGLSyncKHR (*EglCreateSyncKhrFunc)(EGLDisplay, EGLenum, const EGLint*);
-typedef EGLBoolean (*EglDestroySyncKhrFunc)(EGLDisplay, EGLSyncKHR);
-typedef EGLint (*EglClientWaitSyncKhrFunc)(EGLDisplay, EGLSyncKHR, EGLint,
- EGLTimeKHR);
-typedef void (*GlEglImageTargetTexture2dOesFunc)(GLenum, GLeglImageOES);
void* libmali_handle = NULL;
MaliEglImageGetBufferExtPhandleFunc
mali_egl_image_get_buffer_ext_phandle = NULL;
-EglCreateImageKhrFunc egl_create_image_khr = NULL;
-EglDestroyImageKhrFunc egl_destroy_image_khr = NULL;
-EglCreateSyncKhrFunc egl_create_sync_khr = NULL;
-EglDestroySyncKhrFunc egl_destroy_sync_khr = NULL;
-EglClientWaitSyncKhrFunc egl_client_wait_sync_khr = NULL;
-GlEglImageTargetTexture2dOesFunc gl_egl_image_target_texture_2d_oes = NULL;
-
} // anonymous namespace
struct ExynosVideoDecodeAccelerator::BitstreamBufferRef {
@@ -161,7 +134,7 @@ ExynosVideoDecodeAccelerator::PictureBufferArrayRef::~PictureBufferArrayRef() {
for (size_t i = 0; i < picture_buffers.size(); ++i) {
PictureBufferRef& buffer = picture_buffers[i];
if (buffer.egl_image != EGL_NO_IMAGE_KHR)
- egl_destroy_image_khr(egl_display, buffer.egl_image);
+ eglDestroyImageKHR(egl_display, buffer.egl_image);
if (buffer.egl_image_fd != -1)
HANDLE_EINTR(close(buffer.egl_image_fd));
}
@@ -175,7 +148,7 @@ ExynosVideoDecodeAccelerator::EGLSyncKHRRef::EGLSyncKHRRef(
ExynosVideoDecodeAccelerator::EGLSyncKHRRef::~EGLSyncKHRRef() {
if (egl_sync != EGL_NO_SYNC_KHR)
- egl_destroy_sync_khr(egl_display, egl_sync);
+ eglDestroySyncKHR(egl_display, egl_sync);
}
ExynosVideoDecodeAccelerator::MfcInputRecord::MfcInputRecord()
@@ -336,6 +309,19 @@ bool ExynosVideoDecodeAccelerator::Initialize(
return false;
}
+ // We need the context to be initialized to query extensions.
+ if (!make_context_current_.Run()) {
+ DLOG(ERROR) << "Initialize(): could not make context current";
+ NOTIFY_ERROR(PLATFORM_FAILURE);
+ return false;
+ }
+
+ if (!gfx::g_driver_egl.ext.b_EGL_KHR_fence_sync) {
+ DLOG(ERROR) << "Initialize(): context does not have EGL_KHR_fence_sync";
+ NOTIFY_ERROR(PLATFORM_FAILURE);
+ return false;
+ }
+
// Open the video devices.
DVLOG(2) << "Initialize(): opening MFC device: " << kExynosMfcDevice;
mfc_fd_ = HANDLE_EINTR(open(kExynosMfcDevice,
@@ -393,12 +379,6 @@ bool ExynosVideoDecodeAccelerator::Initialize(
control.value = 8; // Magic number from Samsung folks.
IOCTL_OR_ERROR_RETURN_FALSE(mfc_fd_, VIDIOC_S_CTRL, &control);
- if (!make_context_current_.Run()) {
- DLOG(ERROR) << "Initialize(): could not make context current";
- NOTIFY_ERROR(PLATFORM_FAILURE);
- return false;
- }
-
if (!CreateMfcInputBuffers())
return false;
@@ -490,7 +470,7 @@ void ExynosVideoDecodeAccelerator::AssignPictureBuffers(
return;
}
glBindTexture(GL_TEXTURE_2D, buffers[i].texture_id());
- EGLImageKHR egl_image = egl_create_image_khr(
+ EGLImageKHR egl_image = eglCreateImageKHR(
egl_display_, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR,
(EGLClientBuffer)pixmap, kImageAttrs);
// We can free the X pixmap immediately -- according to the
@@ -511,7 +491,7 @@ void ExynosVideoDecodeAccelerator::AssignPictureBuffers(
return;
}
buffer.egl_image_fd = fd;
- gl_egl_image_target_texture_2d_oes(GL_TEXTURE_2D, egl_image);
+ glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, egl_image);
buffer.client_id = buffers[i].id();
}
decoder_thread_.message_loop()->PostTask(FROM_HERE, base::Bind(
@@ -531,7 +511,7 @@ void ExynosVideoDecodeAccelerator::ReusePictureBuffer(int32 picture_buffer_id) {
}
EGLSyncKHR egl_sync =
- egl_create_sync_khr(egl_display_, EGL_SYNC_FENCE_KHR, NULL);
+ eglCreateSyncKHR(egl_display_, EGL_SYNC_FENCE_KHR, NULL);
if (egl_sync == EGL_NO_SYNC_KHR) {
DLOG(ERROR) << "ReusePictureBuffer(): eglCreateSyncKHR() failed";
NOTIFY_ERROR(PLATFORM_FAILURE);
@@ -604,41 +584,14 @@ bool ExynosVideoDecodeAccelerator::PostSandboxInitialization() {
}
dlerror();
-
- POSTSANDBOX_DLSYM(libmali_handle,
- mali_egl_image_get_buffer_ext_phandle,
- MaliEglImageGetBufferExtPhandleFunc,
- "mali_egl_image_get_buffer_ext_phandle");
-
- POSTSANDBOX_DLSYM(libmali_handle,
- egl_create_image_khr,
- EglCreateImageKhrFunc,
- "eglCreateImageKHR");
-
- POSTSANDBOX_DLSYM(libmali_handle,
- egl_destroy_image_khr,
- EglDestroyImageKhrFunc,
- "eglDestroyImageKHR");
-
- POSTSANDBOX_DLSYM(libmali_handle,
- egl_create_sync_khr,
- EglCreateSyncKhrFunc,
- "eglCreateSyncKHR");
-
- POSTSANDBOX_DLSYM(libmali_handle,
- egl_destroy_sync_khr,
- EglDestroySyncKhrFunc,
- "eglDestroySyncKHR");
-
- POSTSANDBOX_DLSYM(libmali_handle,
- egl_client_wait_sync_khr,
- EglClientWaitSyncKhrFunc,
- "eglClientWaitSyncKHR");
-
- POSTSANDBOX_DLSYM(libmali_handle,
- gl_egl_image_target_texture_2d_oes,
- GlEglImageTargetTexture2dOesFunc,
- "glEGLImageTargetTexture2DOES");
+ mali_egl_image_get_buffer_ext_phandle =
+ reinterpret_cast<MaliEglImageGetBufferExtPhandleFunc>(
+ dlsym(libmali_handle, "mali_egl_image_get_buffer_ext_phandle"));
+ if (mali_egl_image_get_buffer_ext_phandle == NULL) {
+ DPLOG(ERROR) << "PostSandboxInitialization(): failed to dlsym() "
+ << "mali_egl_image_get_buffer_ext_phandle: " << dlerror();
+ return false;
+ }
return true;
}
@@ -1513,9 +1466,9 @@ bool ExynosVideoDecodeAccelerator::EnqueueGscOutputRecord() {
// If we have to wait for completion, wait. Note that
// gsc_free_output_buffers_ is a FIFO queue, so we always wait on the
// buffer that has been in the queue the longest.
- egl_client_wait_sync_khr(egl_display_, output_record.egl_sync, 0,
+ eglClientWaitSyncKHR(egl_display_, output_record.egl_sync, 0,
EGL_FOREVER_KHR);
- egl_destroy_sync_khr(egl_display_, output_record.egl_sync);
+ eglDestroySyncKHR(egl_display_, output_record.egl_sync);
output_record.egl_sync = EGL_NO_SYNC_KHR;
}
struct v4l2_buffer qbuf;
@@ -2229,9 +2182,9 @@ void ExynosVideoDecodeAccelerator::DestroyGscOutputBuffers() {
if (output_record.fd != -1)
HANDLE_EINTR(close(output_record.fd));
if (output_record.egl_image != EGL_NO_IMAGE_KHR)
- egl_destroy_image_khr(egl_display_, output_record.egl_image);
+ eglDestroyImageKHR(egl_display_, output_record.egl_image);
if (output_record.egl_sync != EGL_NO_SYNC_KHR)
- egl_destroy_sync_khr(egl_display_, output_record.egl_sync);
+ eglDestroySyncKHR(egl_display_, output_record.egl_sync);
if (client_)
client_->DismissPictureBuffer(output_record.picture_id);
++i;
diff --git a/content/common/gpu/media/exynos_video_decode_accelerator.h b/content/common/gpu/media/exynos_video_decode_accelerator.h
index 3459293..2c0c249 100644
--- a/content/common/gpu/media/exynos_video_decode_accelerator.h
+++ b/content/common/gpu/media/exynos_video_decode_accelerator.h
@@ -18,9 +18,8 @@
#include "content/common/content_export.h"
#include "media/base/video_decoder_config.h"
#include "media/video/video_decode_accelerator.h"
-#include "third_party/angle/include/EGL/egl.h"
-#include "third_party/angle/include/EGL/eglext.h"
#include "ui/gfx/size.h"
+#include "ui/gl/gl_bindings.h"
namespace base {
class MessageLoopProxy;
diff --git a/content/common/gpu/media/gles2_texture_to_egl_image_translator.cc b/content/common/gpu/media/gles2_texture_to_egl_image_translator.cc
index 4cd06b2..24a8554 100644
--- a/content/common/gpu/media/gles2_texture_to_egl_image_translator.cc
+++ b/content/common/gpu/media/gles2_texture_to_egl_image_translator.cc
@@ -13,30 +13,9 @@
namespace content {
-// Get EGL extension functions.
-static PFNEGLCREATEIMAGEKHRPROC egl_create_image_khr =
- reinterpret_cast<PFNEGLCREATEIMAGEKHRPROC>(
- eglGetProcAddress("eglCreateImageKHR"));
-static PFNEGLDESTROYIMAGEKHRPROC egl_destroy_image_khr =
- reinterpret_cast<PFNEGLDESTROYIMAGEKHRPROC>(
- eglGetProcAddress("eglDestroyImageKHR"));
-static PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glegl_image_targettexture_2does =
- reinterpret_cast<PFNGLEGLIMAGETARGETTEXTURE2DOESPROC>(
- eglGetProcAddress("glEGLImageTargetTexture2DOES"));
-
-static bool AreEGLExtensionsInitialized() {
- return (egl_create_image_khr && egl_destroy_image_khr &&
- glegl_image_targettexture_2does);
-}
-
Gles2TextureToEglImageTranslator::Gles2TextureToEglImageTranslator(
bool use_backing_pixmaps)
: use_backing_pixmaps_(use_backing_pixmaps) {
- if (!AreEGLExtensionsInitialized()) {
- LOG(DFATAL) << "Failed to get EGL extensions";
- return;
- }
- CHECK_EQ(eglGetError(), EGL_SUCCESS);
}
@@ -47,13 +26,8 @@ EGLImageKHR Gles2TextureToEglImageTranslator::TranslateToEglImage(
EGLDisplay egl_display, EGLContext egl_context,
uint32 texture,
const gfx::Size& dimensions) {
- if (!egl_create_image_khr)
- return EGL_NO_IMAGE_KHR;
EGLImageKHR hEglImage;
if (use_backing_pixmaps_) {
- if (!glegl_image_targettexture_2does)
- return EGL_NO_IMAGE_KHR;
-
EGLint image_attrs[] = { EGL_IMAGE_PRESERVED_KHR, 1 , EGL_NONE };
glActiveTexture(GL_TEXTURE0);
@@ -64,24 +38,24 @@ EGLImageKHR Gles2TextureToEglImageTranslator::TranslateToEglImage(
dimensions.width(),
dimensions.height(), 32);
- hEglImage = egl_create_image_khr(egl_display,
- EGL_NO_CONTEXT,
- EGL_NATIVE_PIXMAP_KHR,
- (EGLClientBuffer)pixmap,
- image_attrs);
+ hEglImage = eglCreateImageKHR(egl_display,
+ EGL_NO_CONTEXT,
+ EGL_NATIVE_PIXMAP_KHR,
+ (EGLClientBuffer)pixmap,
+ image_attrs);
- glegl_image_targettexture_2does(GL_TEXTURE_2D, hEglImage);
+ glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, hEglImage);
bool inserted = eglimage_pixmap_.insert(std::make_pair(
hEglImage, pixmap)).second;
DCHECK(inserted);
} else {
EGLint attrib = EGL_NONE;
// Create an EGLImage
- hEglImage = egl_create_image_khr(egl_display,
- egl_context,
- EGL_GL_TEXTURE_2D_KHR,
- reinterpret_cast<EGLClientBuffer>(texture),
- &attrib);
+ hEglImage = eglCreateImageKHR(egl_display,
+ egl_context,
+ EGL_GL_TEXTURE_2D_KHR,
+ reinterpret_cast<EGLClientBuffer>(texture),
+ &attrib);
}
CHECK(hEglImage) << "Failed to eglCreateImageKHR for " << texture
<< ", error: 0x" << std::hex << eglGetError();
@@ -101,11 +75,7 @@ void Gles2TextureToEglImageTranslator::DestroyEglImage(
EGLDisplay egl_display, EGLImageKHR egl_image) {
// Clients of this class will call this method for each EGLImage handle.
// Actual destroying of the handles is done here.
- if (!egl_destroy_image_khr) {
- DLOG(ERROR) << "egl_destroy_image_khr failed";
- return;
- }
- egl_destroy_image_khr(egl_display, egl_image);
+ eglDestroyImageKHR(egl_display, egl_image);
if (use_backing_pixmaps_) {
ImagePixmap::iterator it = eglimage_pixmap_.find(egl_image);
diff --git a/content/common/gpu/media/gles2_texture_to_egl_image_translator.h b/content/common/gpu/media/gles2_texture_to_egl_image_translator.h
index d01407b..bb1eacc 100644
--- a/content/common/gpu/media/gles2_texture_to_egl_image_translator.h
+++ b/content/common/gpu/media/gles2_texture_to_egl_image_translator.h
@@ -9,10 +9,7 @@
#include "base/basictypes.h"
#include "media/video/picture.h"
-#include "third_party/angle/include/EGL/egl.h"
-#include "third_party/angle/include/EGL/eglext.h"
-#include "third_party/angle/include/GLES2/gl2.h"
-#include "third_party/angle/include/GLES2/gl2ext.h"
+#include "ui/gl/gl_bindings.h"
namespace content {
diff --git a/content/common/gpu/media/omx_video_decode_accelerator.cc b/content/common/gpu/media/omx_video_decode_accelerator.cc
index c44ce80..06897a8 100644
--- a/content/common/gpu/media/omx_video_decode_accelerator.cc
+++ b/content/common/gpu/media/omx_video_decode_accelerator.cc
@@ -43,10 +43,6 @@ OMXGetComponentsOfRole omx_get_components_of_role = NULL;
OMXFreeHandle omx_free_handle = NULL;
OMXDeinit omx_deinit = NULL;
-static PFNEGLCREATESYNCKHRPROC egl_create_sync_khr = NULL;
-static PFNEGLGETSYNCATTRIBKHRPROC egl_get_sync_attrib_khr = NULL;
-static PFNEGLDESTROYSYNCKHRPROC egl_destroy_sync_khr = NULL;
-
// Maps h264-related Profile enum values to OMX_VIDEO_AVCPROFILETYPE values.
static OMX_U32 MapH264ProfileToOMXAVCProfile(uint32 profile) {
switch (profile) {
@@ -118,17 +114,17 @@ OmxVideoDecodeAccelerator::PictureSyncObject::PictureSyncObject(
: egl_display_(egl_display) {
DCHECK(egl_display_ != EGL_NO_DISPLAY);
- egl_sync_obj_ = egl_create_sync_khr(egl_display_, EGL_SYNC_FENCE_KHR, NULL);
+ egl_sync_obj_ = eglCreateSyncKHR(egl_display_, EGL_SYNC_FENCE_KHR, NULL);
DCHECK_NE(egl_sync_obj_, EGL_NO_SYNC_KHR);
}
OmxVideoDecodeAccelerator::PictureSyncObject::~PictureSyncObject() {
- egl_destroy_sync_khr(egl_display_, egl_sync_obj_);
+ eglDestroySyncKHR(egl_display_, egl_sync_obj_);
}
bool OmxVideoDecodeAccelerator::PictureSyncObject::IsSynced() {
EGLint value = EGL_UNSIGNALED_KHR;
- EGLBoolean ret = egl_get_sync_attrib_khr(
+ EGLBoolean ret = eglGetSyncAttribKHR(
egl_display_, egl_sync_obj_, EGL_SYNC_STATUS_KHR, &value);
DCHECK(ret) << "Failed getting sync object state.";
@@ -196,6 +192,16 @@ bool OmxVideoDecodeAccelerator::Initialize(media::VideoCodecProfile profile) {
INVALID_ARGUMENT, false);
}
+ // We need the context to be initialized to query extensions.
+ RETURN_ON_FAILURE(make_context_current_.Run(),
+ "Failed make context current",
+ PLATFORM_FAILURE,
+ false);
+ RETURN_ON_FAILURE(gfx::g_driver_egl.ext.b_EGL_KHR_fence_sync,
+ "Platform does not support EGL_KHR_fence_sync",
+ PLATFORM_FAILURE,
+ false);
+
if (!CreateComponent()) // Does its own RETURN_ON_FAILURE dances.
return false;
@@ -1171,16 +1177,8 @@ bool OmxVideoDecodeAccelerator::PostSandboxInitialization() {
omx_deinit =
reinterpret_cast<OMXDeinit>(dlsym(omx_handle, "OMX_Deinit"));
- egl_create_sync_khr = reinterpret_cast<PFNEGLCREATESYNCKHRPROC>(
- eglGetProcAddress("eglCreateSyncKHR"));
- egl_get_sync_attrib_khr = reinterpret_cast<PFNEGLGETSYNCATTRIBKHRPROC>(
- eglGetProcAddress("eglGetSyncAttribKHR"));
- egl_destroy_sync_khr = reinterpret_cast<PFNEGLDESTROYSYNCKHRPROC>(
- eglGetProcAddress("eglDestroySyncKHR"));
-
return (omx_init && omx_gethandle && omx_get_components_of_role &&
- omx_free_handle && omx_deinit && egl_create_sync_khr &&
- egl_get_sync_attrib_khr && egl_destroy_sync_khr);
+ omx_free_handle && omx_deinit);
}
// static
diff --git a/content/common/gpu/media/omx_video_decode_accelerator.h b/content/common/gpu/media/omx_video_decode_accelerator.h
index 2cb15b6..8855809 100644
--- a/content/common/gpu/media/omx_video_decode_accelerator.h
+++ b/content/common/gpu/media/omx_video_decode_accelerator.h
@@ -19,11 +19,10 @@
#include "base/shared_memory.h"
#include "content/common/content_export.h"
#include "media/video/video_decode_accelerator.h"
-#include "third_party/angle/include/EGL/egl.h"
-#include "third_party/angle/include/EGL/eglext.h"
#include "third_party/openmax/il/OMX_Component.h"
#include "third_party/openmax/il/OMX_Core.h"
#include "third_party/openmax/il/OMX_Video.h"
+#include "ui/gl/gl_bindings.h"
namespace content {
class Gles2TextureToEglImageTranslator;
diff --git a/content/common/gpu/media/rendering_helper_gl.cc b/content/common/gpu/media/rendering_helper_gl.cc
index f87745a..b4cf57d 100644
--- a/content/common/gpu/media/rendering_helper_gl.cc
+++ b/content/common/gpu/media/rendering_helper_gl.cc
@@ -6,23 +6,16 @@
#include <map>
-#if defined(OS_WIN) || defined(ARCH_CPU_ARMEL)
-#include "third_party/angle/include/EGL/egl.h" // Must precede ui/gl headers!
-#endif
-
#include "base/bind.h"
#include "base/mac/scoped_nsautorelease_pool.h"
#include "base/message_loop.h"
#include "base/stringize_macros.h"
#include "base/synchronization/waitable_event.h"
-#if !defined(ARCH_CPU_ARMEL)
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_context_stub.h"
#include "ui/gl/gl_implementation.h"
#include "ui/gl/gl_surface.h"
-#else
-#include "third_party/angle/include/GLES2/gl2.h"
-#endif
#if !defined(OS_WIN) && defined(ARCH_CPU_X86_FAMILY)
#define GL_VARIANT_GLX 1
@@ -58,6 +51,42 @@ static void CreateShader(GLuint program,
CHECK_EQ(static_cast<int>(glGetError()), GL_NO_ERROR);
}
+namespace {
+
+// Lightweight GLContext stub implementation that returns a constructed
+// extensions string. We use this to create a context that we can use to
+// initialize GL extensions with, without actually creating a platform context.
+class GLContextStubWithExtensions : public gfx::GLContextStub {
+ public:
+ GLContextStubWithExtensions() {}
+ virtual std::string GetExtensions() OVERRIDE;
+
+ void AddExtensionsString(const char* extensions);
+
+ protected:
+ virtual ~GLContextStubWithExtensions() {}
+
+ private:
+ std::string extensions_;
+
+ DISALLOW_COPY_AND_ASSIGN(GLContextStubWithExtensions);
+};
+
+void GLContextStubWithExtensions::AddExtensionsString(const char* extensions) {
+ if (extensions == NULL)
+ return;
+
+ if (extensions_.size() != 0)
+ extensions_ += ' ';
+ extensions_ += extensions;
+}
+
+std::string GLContextStubWithExtensions::GetExtensions() {
+ return extensions_;
+}
+
+} // anonymous
+
namespace content {
class RenderingHelperGL : public RenderingHelper {
@@ -81,6 +110,8 @@ class RenderingHelperGL : public RenderingHelper {
virtual void* GetGLContext() OVERRIDE;
virtual void* GetGLDisplay() OVERRIDE;
+ static const gfx::GLImplementation kGLImplementation;
+
private:
void Clear();
@@ -88,6 +119,7 @@ class RenderingHelperGL : public RenderingHelper {
// if |window_id < 0|.
void MakeCurrent(int window_id);
+
MessageLoop* message_loop_;
int width_;
int height_;
@@ -112,25 +144,24 @@ class RenderingHelperGL : public RenderingHelper {
};
// static
+const gfx::GLImplementation RenderingHelperGL::kGLImplementation =
+#if defined(GL_VARIANT_GLX)
+ gfx::kGLImplementationDesktopGL;
+#elif defined(GL_VARIANT_EGL)
+ gfx::kGLImplementationEGLGLES2;
+#else
+ -1;
+#error "Unknown GL implementation."
+#endif
+
+// static
RenderingHelper* RenderingHelper::Create() {
return new RenderingHelperGL;
}
// static
void RenderingHelper::InitializePlatform() {
-#if defined(OS_WIN)
- gfx::InitializeGLBindings(gfx::kGLImplementationEGLGLES2);
- gfx::GLSurface::InitializeOneOff();
- {
- // Hack to ensure that EGL extension function pointers are initialized.
- scoped_refptr<gfx::GLSurface> surface(
- gfx::GLSurface::CreateOffscreenGLSurface(false, gfx::Size(1, 1)));
- scoped_refptr<gfx::GLContext> context(
- gfx::GLContext::CreateGLContext(NULL, surface.get(),
- gfx::PreferIntegratedGpu));
- context->MakeCurrent(surface.get());
- }
-#endif // OS_WIN
+ gfx::InitializeGLBindings(RenderingHelperGL::kGLImplementation);
}
RenderingHelperGL::RenderingHelperGL() {
@@ -175,6 +206,8 @@ void RenderingHelperGL::Initialize(bool suppress_swap_to_display,
done.Wait();
}
+ scoped_refptr<GLContextStubWithExtensions> stub_context(
+ new GLContextStubWithExtensions());
suppress_swap_to_display_ = suppress_swap_to_display;
CHECK_GT(width, 0);
CHECK_GT(height, 0);
@@ -186,7 +219,6 @@ void RenderingHelperGL::Initialize(bool suppress_swap_to_display,
#if GL_VARIANT_GLX
x_display_ = base::MessagePumpForUI::GetDefaultXDisplay();
CHECK(x_display_);
- gfx::InitializeGLBindings(gfx::kGLImplementationDesktopGL);
CHECK(glXQueryVersion(x_display_, NULL, NULL));
const int fbconfig_attr[] = {
GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
@@ -206,19 +238,24 @@ void RenderingHelperGL::Initialize(bool suppress_swap_to_display,
CHECK(x_visual_);
gl_context_ = glXCreateContext(x_display_, x_visual_, 0, true);
CHECK(gl_context_);
+ stub_context->AddExtensionsString(
+ reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)));
#else // EGL
+ EGLNativeDisplayType native_display;
+
#if defined(OS_WIN)
- gl_display_ = eglGetDisplay(EGL_DEFAULT_DISPLAY);
- CHECK(gl_display_);
- CHECK(eglInitialize(gl_display_, NULL, NULL)) << glGetError();
+ native_display = EGL_DEFAULT_DISPLAY;
#else
x_display_ = base::MessagePumpForUI::GetDefaultXDisplay();
CHECK(x_display_);
- gl_display_ = eglGetDisplay(x_display_);
+ native_display = x_display_;
+#endif
+
+ gl_display_ = eglGetDisplay(native_display);
CHECK(gl_display_);
CHECK(eglInitialize(gl_display_, NULL, NULL)) << glGetError();
-#endif
+
static EGLint rgba8888[] = {
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
@@ -236,6 +273,10 @@ void RenderingHelperGL::Initialize(bool suppress_swap_to_display,
gl_context_ = eglCreateContext(
gl_display_, egl_config, EGL_NO_CONTEXT, context_attribs);
CHECK_NE(gl_context_, EGL_NO_CONTEXT) << eglGetError();
+ stub_context->AddExtensionsString(
+ reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)));
+ stub_context->AddExtensionsString(
+ eglQueryString(gl_display_, EGL_EXTENSIONS));
#endif
// Per-window/surface X11 & EGL initialization.
@@ -285,6 +326,9 @@ void RenderingHelperGL::Initialize(bool suppress_swap_to_display,
MakeCurrent(i);
}
+ // Must be done after a context is made current.
+ gfx::InitializeGLExtensionBindings(kGLImplementation, stub_context.get());
+
static const float kVertices[] =
{ -1.f, 1.f, -1.f, -1.f, 1.f, 1.f, 1.f, -1.f, };
static const float kTextureCoords[] = { 0, 1, 0, 0, 1, 1, 1, 0, };
diff --git a/content/common/gpu/media/rendering_helper_mac.mm b/content/common/gpu/media/rendering_helper_mac.mm
index bcecd0b..1a58646 100644
--- a/content/common/gpu/media/rendering_helper_mac.mm
+++ b/content/common/gpu/media/rendering_helper_mac.mm
@@ -5,7 +5,6 @@
#include "content/common/gpu/media/rendering_helper.h"
#import <Cocoa/Cocoa.h>
-#import <OpenGL/gl.h>
#import <OpenGL/CGLMacro.h>
#include "base/mac/scoped_nsautorelease_pool.h"
diff --git a/content/common/gpu/media/vaapi_video_decode_accelerator.h b/content/common/gpu/media/vaapi_video_decode_accelerator.h
index 140eb12..f1cd07a 100644
--- a/content/common/gpu/media/vaapi_video_decode_accelerator.h
+++ b/content/common/gpu/media/vaapi_video_decode_accelerator.h
@@ -8,8 +8,6 @@
#ifndef CONTENT_COMMON_GPU_MEDIA_VAAPI_VIDEO_DECODE_ACCELERATOR_H_
#define CONTENT_COMMON_GPU_MEDIA_VAAPI_VIDEO_DECODE_ACCELERATOR_H_
-#include <GL/glx.h>
-
#include <queue>
#include <utility>
#include <vector>
@@ -28,6 +26,7 @@
#include "media/base/bitstream_buffer.h"
#include "media/video/picture.h"
#include "media/video/video_decode_accelerator.h"
+#include "ui/gl/gl_bindings.h"
namespace content {