| Index: content/common/gpu/media/rendering_helper.cc
|
| diff --git a/content/common/gpu/media/rendering_helper.cc b/content/common/gpu/media/rendering_helper.cc
|
| index 2bd6e02c6101d34c90c602b9b3d6806984022897..2f89fb350c7d13b2b162ed0966586a03717003bb 100644
|
| --- a/content/common/gpu/media/rendering_helper.cc
|
| +++ b/content/common/gpu/media/rendering_helper.cc
|
| @@ -9,14 +9,16 @@
|
| #include <vector>
|
|
|
| #include "base/bind.h"
|
| +#include "base/command_line.h"
|
| #include "base/mac/scoped_nsautorelease_pool.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/strings/stringize_macros.h"
|
| #include "base/synchronization/waitable_event.h"
|
| #include "ui/gl/gl_context.h"
|
| -#include "ui/gl/gl_context_stub_with_extensions.h"
|
| #include "ui/gl/gl_implementation.h"
|
| #include "ui/gl/gl_surface.h"
|
| +#include "ui/gl/gl_surface_egl.h"
|
| +#include "ui/gl/gl_surface_glx.h"
|
|
|
| #if defined(OS_WIN)
|
| #include <windows.h>
|
| @@ -26,10 +28,10 @@
|
| #include "ui/gfx/x/x11_types.h"
|
| #endif
|
|
|
| -#ifdef GL_VARIANT_GLX
|
| -struct XFreeDeleter {
|
| - void operator()(void* x) const { ::XFree(x); }
|
| -};
|
| +#if !defined(OS_WIN) && defined(ARCH_CPU_X86_FAMILY)
|
| +#define GL_VARIANT_GLX 1
|
| +#else
|
| +#define GL_VARIANT_EGL 1
|
| #endif
|
|
|
| // Helper for Shader creation.
|
| @@ -58,27 +60,20 @@ RenderingHelperParams::RenderingHelperParams() {}
|
|
|
| RenderingHelperParams::~RenderingHelperParams() {}
|
|
|
| -static const gfx::GLImplementation kGLImplementation =
|
| -#if defined(GL_VARIANT_GLX)
|
| - gfx::kGLImplementationDesktopGL;
|
| -#elif defined(GL_VARIANT_EGL)
|
| - gfx::kGLImplementationEGLGLES2;
|
| +// static
|
| +bool RenderingHelper::InitializeOneOff() {
|
| + CommandLine* cmd_line = CommandLine::ForCurrentProcess();
|
| +#if GL_VARIANT_GLX
|
| + cmd_line->AppendSwitchASCII(switches::kUseGL,
|
| + gfx::kGLImplementationDesktopName);
|
| #else
|
| - -1;
|
| -#error "Unknown GL implementation."
|
| + cmd_line->AppendSwitchASCII(switches::kUseGL, gfx::kGLImplementationEGLName);
|
| #endif
|
| + return gfx::GLSurface::InitializeOneOff();
|
| +}
|
|
|
| RenderingHelper::RenderingHelper() {
|
| -#if defined(GL_VARIANT_EGL)
|
| - gl_surface_ = EGL_NO_SURFACE;
|
| -#endif
|
| -
|
| -#if defined(OS_WIN)
|
| - window_ = NULL;
|
| -#else
|
| - x_window_ = (Window)0;
|
| -#endif
|
| -
|
| + window_ = gfx::kNullAcceleratedWidget;
|
| Clear();
|
| }
|
|
|
| @@ -101,90 +96,12 @@ void RenderingHelper::Initialize(const RenderingHelperParams& params,
|
| ? base::TimeDelta::FromSeconds(1) / params.rendering_fps
|
| : base::TimeDelta();
|
|
|
| - gfx::InitializeStaticGLBindings(kGLImplementation);
|
| - scoped_refptr<gfx::GLContextStubWithExtensions> stub_context(
|
| - new gfx::GLContextStubWithExtensions());
|
| -
|
| render_as_thumbnails_ = params.render_as_thumbnails;
|
| message_loop_ = base::MessageLoop::current();
|
|
|
| -#if GL_VARIANT_GLX
|
| - x_display_ = gfx::GetXDisplay();
|
| - CHECK(x_display_);
|
| - CHECK(glXQueryVersion(x_display_, NULL, NULL));
|
| - const int fbconfig_attr[] = {
|
| - GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
|
| - GLX_RENDER_TYPE, GLX_RGBA_BIT,
|
| - GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_2D_BIT_EXT,
|
| - GLX_BIND_TO_TEXTURE_RGB_EXT, GL_TRUE,
|
| - GLX_DOUBLEBUFFER, True,
|
| - GL_NONE,
|
| - };
|
| - int num_fbconfigs;
|
| - scoped_ptr<GLXFBConfig, XFreeDeleter> glx_fb_configs(
|
| - glXChooseFBConfig(x_display_, DefaultScreen(x_display_), fbconfig_attr,
|
| - &num_fbconfigs));
|
| - CHECK(glx_fb_configs.get());
|
| - CHECK_GT(num_fbconfigs, 0);
|
| - x_visual_ = glXGetVisualFromFBConfig(x_display_, glx_fb_configs.get()[0]);
|
| - 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)));
|
| - stub_context->SetGLVersionString(
|
| - reinterpret_cast<const char*>(glGetString(GL_VERSION)));
|
| -
|
| - Screen* screen = DefaultScreenOfDisplay(x_display_);
|
| - screen_size_ = gfx::Size(XWidthOfScreen(screen), XHeightOfScreen(screen));
|
| -#else // EGL
|
| - EGLNativeDisplayType native_display;
|
| -
|
| #if defined(OS_WIN)
|
| - native_display = EGL_DEFAULT_DISPLAY;
|
| screen_size_ =
|
| gfx::Size(GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
|
| -#else
|
| - x_display_ = gfx::GetXDisplay();
|
| - CHECK(x_display_);
|
| - native_display = x_display_;
|
| -
|
| - Screen* screen = DefaultScreenOfDisplay(x_display_);
|
| - screen_size_ = gfx::Size(XWidthOfScreen(screen), XHeightOfScreen(screen));
|
| -#endif
|
| - gl_display_ = eglGetDisplay(native_display);
|
| - CHECK(gl_display_);
|
| - CHECK(eglInitialize(gl_display_, NULL, NULL)) << eglGetError();
|
| -
|
| - static EGLint rgba8888[] = {
|
| - EGL_RED_SIZE, 8,
|
| - EGL_GREEN_SIZE, 8,
|
| - EGL_BLUE_SIZE, 8,
|
| - EGL_ALPHA_SIZE, 8,
|
| - EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
|
| - EGL_NONE,
|
| - };
|
| - EGLConfig egl_config;
|
| - int num_configs;
|
| - CHECK(eglChooseConfig(gl_display_, rgba8888, &egl_config, 1, &num_configs))
|
| - << eglGetError();
|
| - CHECK_GE(num_configs, 1);
|
| - static EGLint context_attribs[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
|
| - 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));
|
| - stub_context->SetGLVersionString(
|
| - reinterpret_cast<const char*>(glGetString(GL_VERSION)));
|
| -#endif
|
| - clients_ = params.clients;
|
| - CHECK_GT(clients_.size(), 0U);
|
| - LayoutRenderingAreas();
|
| -
|
| -#if defined(OS_WIN)
|
| window_ = CreateWindowEx(0,
|
| L"Static",
|
| L"VideoDecodeAcceleratorTest",
|
| @@ -197,56 +114,48 @@ void RenderingHelper::Initialize(const RenderingHelperParams& params,
|
| NULL,
|
| NULL,
|
| NULL);
|
| - CHECK(window_ != NULL);
|
| -#else
|
| - int depth = DefaultDepth(x_display_, DefaultScreen(x_display_));
|
| +#elif defined(USE_X11)
|
| + Display* display = gfx::GetXDisplay();
|
| + Screen* screen = DefaultScreenOfDisplay(display);
|
| + screen_size_ = gfx::Size(XWidthOfScreen(screen), XHeightOfScreen(screen));
|
|
|
| -#if defined(GL_VARIANT_GLX)
|
| - CHECK_EQ(depth, x_visual_->depth);
|
| -#endif
|
| + CHECK(display);
|
|
|
| XSetWindowAttributes window_attributes;
|
| + memset(&window_attributes, 0, sizeof(window_attributes));
|
| window_attributes.background_pixel =
|
| - BlackPixel(x_display_, DefaultScreen(x_display_));
|
| + BlackPixel(display, DefaultScreen(display));
|
| window_attributes.override_redirect = true;
|
| -
|
| - x_window_ = XCreateWindow(x_display_,
|
| - DefaultRootWindow(x_display_),
|
| - 0,
|
| - 0,
|
| - screen_size_.width(),
|
| - screen_size_.height(),
|
| - 0 /* border width */,
|
| - depth,
|
| - CopyFromParent /* class */,
|
| - CopyFromParent /* visual */,
|
| - (CWBackPixel | CWOverrideRedirect),
|
| - &window_attributes);
|
| - XStoreName(x_display_, x_window_, "VideoDecodeAcceleratorTest");
|
| - XSelectInput(x_display_, x_window_, ExposureMask);
|
| - XMapWindow(x_display_, x_window_);
|
| -#endif
|
| -
|
| -#if GL_VARIANT_EGL
|
| -#if defined(OS_WIN)
|
| - gl_surface_ =
|
| - eglCreateWindowSurface(gl_display_, egl_config, window_, NULL);
|
| + int depth = DefaultDepth(display, DefaultScreen(display));
|
| +
|
| + window_ = XCreateWindow(display,
|
| + DefaultRootWindow(display),
|
| + 0,
|
| + 0,
|
| + screen_size_.width(),
|
| + screen_size_.height(),
|
| + 0 /* border width */,
|
| + depth,
|
| + CopyFromParent /* class */,
|
| + CopyFromParent /* visual */,
|
| + (CWBackPixel | CWOverrideRedirect),
|
| + &window_attributes);
|
| + XStoreName(display, window_, "VideoDecodeAcceleratorTest");
|
| + XSelectInput(display, window_, ExposureMask);
|
| + XMapWindow(display, window_);
|
| #else
|
| - gl_surface_ =
|
| - eglCreateWindowSurface(gl_display_, egl_config, x_window_, NULL);
|
| -#endif
|
| - CHECK_NE(gl_surface_, EGL_NO_SURFACE);
|
| +#error unknown platform
|
| #endif
|
| + CHECK(window_ != gfx::kNullAcceleratedWidget);
|
|
|
| -#if GL_VARIANT_GLX
|
| - CHECK(glXMakeContextCurrent(x_display_, x_window_, x_window_, gl_context_));
|
| -#else // EGL
|
| - CHECK(eglMakeCurrent(gl_display_, gl_surface_, gl_surface_, gl_context_))
|
| - << eglGetError();
|
| -#endif
|
| + gl_surface_ = gfx::GLSurface::CreateViewGLSurface(window_);
|
| + gl_context_ = gfx::GLContext::CreateGLContext(
|
| + NULL, gl_surface_, gfx::PreferIntegratedGpu);
|
| + gl_context_->MakeCurrent(gl_surface_);
|
|
|
| - // Must be done after a context is made current.
|
| - gfx::InitializeDynamicGLBindings(kGLImplementation, stub_context.get());
|
| + clients_ = params.clients;
|
| + CHECK_GT(clients_.size(), 0U);
|
| + LayoutRenderingAreas();
|
|
|
| if (render_as_thumbnails_) {
|
| CHECK_EQ(clients_.size(), 1U);
|
| @@ -386,18 +295,11 @@ void RenderingHelper::UnInitialize(base::WaitableEvent* done) {
|
| glDeleteTextures(1, &thumbnails_texture_id_);
|
| glDeleteFramebuffersEXT(1, &thumbnails_fbo_id_);
|
| }
|
| -#if GL_VARIANT_GLX
|
|
|
| - glXDestroyContext(x_display_, gl_context_);
|
| -#else // EGL
|
| - CHECK(eglMakeCurrent(
|
| - gl_display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT))
|
| - << eglGetError();
|
| - CHECK(eglDestroyContext(gl_display_, gl_context_));
|
| - CHECK(eglDestroySurface(gl_display_, gl_surface_));
|
| - CHECK(eglTerminate(gl_display_));
|
| -#endif
|
| - gfx::ClearGLBindings();
|
| + gl_context_->ReleaseCurrent(gl_surface_);
|
| + gl_context_ = NULL;
|
| + gl_surface_ = NULL;
|
| +
|
| Clear();
|
| done->Signal();
|
| }
|
| @@ -483,44 +385,36 @@ void RenderingHelper::DeleteTexture(uint32 texture_id) {
|
| CHECK_EQ(static_cast<int>(glGetError()), GL_NO_ERROR);
|
| }
|
|
|
| -NativeContextType RenderingHelper::GetGLContext() { return gl_context_; }
|
| +void* RenderingHelper::GetGLContext() {
|
| + return gl_context_->GetHandle();
|
| +}
|
|
|
| void* RenderingHelper::GetGLDisplay() {
|
| -#if GL_VARIANT_GLX
|
| - return x_display_;
|
| -#else // EGL
|
| - return gl_display_;
|
| -#endif
|
| + return gl_surface_->GetDisplay();
|
| }
|
|
|
| void RenderingHelper::Clear() {
|
| clients_.clear();
|
| message_loop_ = NULL;
|
| gl_context_ = NULL;
|
| -#if GL_VARIANT_EGL
|
| - gl_display_ = EGL_NO_DISPLAY;
|
| - gl_surface_ = EGL_NO_SURFACE;
|
| -#endif
|
| + gl_surface_ = NULL;
|
| +
|
| render_as_thumbnails_ = false;
|
| frame_count_ = 0;
|
| thumbnails_fbo_id_ = 0;
|
| thumbnails_texture_id_ = 0;
|
|
|
| #if defined(OS_WIN)
|
| - if (window_) {
|
| + if (window_)
|
| DestroyWindow(window_);
|
| - window_ = NULL;
|
| - }
|
| #else
|
| // Destroy resources acquired in Initialize, in reverse-acquisition order.
|
| - if (x_window_) {
|
| - CHECK(XUnmapWindow(x_display_, x_window_));
|
| - CHECK(XDestroyWindow(x_display_, x_window_));
|
| - x_window_ = (Window)0;
|
| + if (window_) {
|
| + CHECK(XUnmapWindow(gfx::GetXDisplay(), window_));
|
| + CHECK(XDestroyWindow(gfx::GetXDisplay(), window_));
|
| }
|
| - // Mimic newly created object.
|
| - x_display_ = NULL;
|
| #endif
|
| + window_ = gfx::kNullAcceleratedWidget;
|
| }
|
|
|
| void RenderingHelper::GetThumbnailsAsRGB(std::vector<unsigned char>* rgb,
|
| @@ -577,12 +471,7 @@ void RenderingHelper::RenderContent() {
|
| }
|
| }
|
|
|
| -#if GL_VARIANT_GLX
|
| - glXSwapBuffers(x_display_, x_window_);
|
| -#else // EGL
|
| - eglSwapBuffers(gl_display_, gl_surface_);
|
| - CHECK_EQ(static_cast<int>(eglGetError()), EGL_SUCCESS);
|
| -#endif
|
| + gl_surface_->SwapBuffers();
|
| }
|
|
|
| // Helper function for the LayoutRenderingAreas(). The |lengths| are the
|
|
|