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

Unified Diff: ui/gl/gl_surface_egl.cc

Issue 1168993002: Update the native_viewport interface to allow specification of the surface configuration, currently… (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 6 months 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: ui/gl/gl_surface_egl.cc
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc
index 4aa43653a3114938830fd4f934a7283bf2c0b70c..3295c0645a9bd8dbd89e4ccb599141e1f0aa53fe 100644
--- a/ui/gl/gl_surface_egl.cc
+++ b/ui/gl/gl_surface_egl.cc
@@ -47,7 +47,6 @@ namespace gfx {
namespace {
-EGLConfig g_config;
EGLDisplay g_display;
EGLNativeDisplayType g_native_display_type;
@@ -111,7 +110,8 @@ void DeinitializeEgl() {
} // namespace
-GLSurfaceEGL::GLSurfaceEGL() {
+GLSurfaceEGL::GLSurfaceEGL(SurfaceConfiguration requested_configuration)
+ : GLSurface(requested_configuration) {
++g_num_surfaces;
if (!g_initialized) {
bool result = GLSurfaceEGL::InitializeOneOff();
@@ -120,42 +120,50 @@ GLSurfaceEGL::GLSurfaceEGL() {
}
}
-bool GLSurfaceEGL::InitializeOneOff() {
- if (g_initialized)
- return true;
-
- g_native_display_type = GetPlatformDefaultEGLNativeDisplay();
-
- g_display = eglGetDisplay(g_native_display_type);
-
- if (!g_display) {
- LOG(ERROR) << "eglGetDisplay failed with error " << GetLastEGLErrorString();
- return false;
- }
+void* GetEGLConfig(SurfaceConfiguration configuration, bool allow_window_bit) {
+ // Choose an EGL configuration.
+ // On X this is only used for PBuffer surfaces.
+ EGLConfig config = {0};
- if (!eglInitialize(g_display, NULL, NULL)) {
- LOG(ERROR) << "eglInitialize failed with error " << GetLastEGLErrorString();
- return false;
+#if defined(USE_X11)
+ XWindowAttributes win_attribs;
+ if (!XGetWindowAttributes(GetNativeDisplay(), window_, &win_attribs)) {
+ return NULL;
}
+#endif
- // Choose an EGL configuration.
- // On X this is only used for PBuffer surfaces.
EGLint renderable_type = EGL_OPENGL_ES2_BIT;
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableUnsafeES3APIs)) {
renderable_type = EGL_OPENGL_ES3_BIT;
}
const EGLint kConfigAttribs[] = {
- EGL_BUFFER_SIZE, 32,
- EGL_ALPHA_SIZE, 8,
- EGL_BLUE_SIZE, 8,
- EGL_GREEN_SIZE, 8,
- EGL_RED_SIZE, 8,
+ EGL_BUFFER_SIZE, configuration.alpha_bits +
+ configuration.red_bits +
+ configuration.green_bits +
+ configuration.blue_bits,
+ EGL_ALPHA_SIZE, configuration.alpha_bits,
+ EGL_BLUE_SIZE, configuration.blue_bits,
+ EGL_GREEN_SIZE, configuration.green_bits,
+ EGL_RED_SIZE, configuration.red_bits,
+ EGL_DEPTH_SIZE, configuration.depth_bits,
+ EGL_STENCIL_SIZE, configuration.stencil_bits,
EGL_RENDERABLE_TYPE, renderable_type,
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
+ EGL_SURFACE_TYPE, (allow_window_bit ?
+ (EGL_WINDOW_BIT | EGL_PBUFFER_BIT) :
+ EGL_PBUFFER_BIT),
EGL_NONE
};
+#if defined(USE_X11)
+ // Try matching the window depth with an alpha channel,
+ // because we're worried the destination alpha width could
+ // constrain blending precision.
+ const int kBufferSizeOffset = 1;
+ const int kAlphaSizeOffset = 3;
+ config_attribs[kBufferSizeOffset] = win_attribs.depth;
+#endif
+
#if defined(USE_OZONE)
const EGLint* config_attribs =
ui::SurfaceFactoryOzone::GetInstance()->GetEGLSurfaceProperties(
@@ -172,21 +180,72 @@ bool GLSurfaceEGL::InitializeOneOff() {
&num_configs)) {
LOG(ERROR) << "eglChooseConfig failed with error "
<< GetLastEGLErrorString();
- return false;
+ return NULL;
abarth-chromium 2015/06/09 00:30:22 nullptr
iansf 2015/06/09 01:52:05 Done.
}
- if (num_configs == 0) {
- LOG(ERROR) << "No suitable EGL configs found.";
- return false;
+ if (!eglChooseConfig(g_display,
+ config_attribs,
+ &config,
+ 1,
+ &num_configs)) {
+ LOG(ERROR) << "eglChooseConfig failed with error "
+ << GetLastEGLErrorString();
+ return NULL;
abarth-chromium 2015/06/09 00:30:22 ditto
iansf 2015/06/09 01:52:05 Done.
}
+#if defined(USE_X11)
+ if (num_configs) {
+ EGLint config_depth;
+ if (!eglGetConfigAttrib(g_display,
+ config,
+ EGL_BUFFER_SIZE,
+ &config_depth)) {
+ LOG(ERROR) << "eglGetConfigAttrib failed with error "
+ << GetLastEGLErrorString();
+ return NULL;
+ }
+
+ if (config_depth == win_attribs.depth) {
+ return config;
+ }
+ }
+
+ // Try without an alpha channel.
+ config_attribs[kAlphaSizeOffset] = 0;
if (!eglChooseConfig(g_display,
config_attribs,
- &g_config,
+ &config,
1,
&num_configs)) {
LOG(ERROR) << "eglChooseConfig failed with error "
<< GetLastEGLErrorString();
+ return NULL;
+ }
+#endif
+
+ if (num_configs == 0) {
+ LOG(ERROR) << "No suitable EGL configs found.";
+ return NULL;
+ }
+
+ return config;
+}
+
+bool GLSurfaceEGL::InitializeOneOff() {
+ if (g_initialized)
+ return true;
+
+ g_native_display_type = GetPlatformDefaultEGLNativeDisplay();
+
+ g_display = eglGetDisplay(g_native_display_type);
+
+ if (!g_display) {
+ LOG(ERROR) << "eglGetDisplay failed with error " << GetLastEGLErrorString();
+ return false;
+ }
+
+ if (!eglInitialize(g_display, NULL, NULL)) {
+ LOG(ERROR) << "eglInitialize failed with error " << GetLastEGLErrorString();
return false;
}
@@ -292,8 +351,11 @@ GLSurfaceEGL::~GLSurfaceEGL() {
}
}
-NativeViewGLSurfaceEGL::NativeViewGLSurfaceEGL(EGLNativeWindowType window)
- : window_(window),
+NativeViewGLSurfaceEGL::NativeViewGLSurfaceEGL(
+ EGLNativeWindowType window,
+ SurfaceConfiguration requested_configuration)
+ : GLSurfaceEGL(requested_configuration),
+ window_(window),
surface_(NULL),
supports_post_sub_buffer_(false),
config_(NULL),
@@ -371,80 +433,11 @@ void NativeViewGLSurfaceEGL::Destroy() {
}
EGLConfig NativeViewGLSurfaceEGL::GetConfig() {
-#if !defined(USE_X11)
- return g_config;
-#else
if (!config_) {
- // Get a config compatible with the window
DCHECK(window_);
- XWindowAttributes win_attribs;
- if (!XGetWindowAttributes(GetNativeDisplay(), window_, &win_attribs)) {
- return NULL;
- }
-
- // Try matching the window depth with an alpha channel,
- // because we're worried the destination alpha width could
- // constrain blending precision.
- const int kBufferSizeOffset = 1;
- const int kAlphaSizeOffset = 3;
- EGLint config_attribs[] = {
- EGL_BUFFER_SIZE, ~0,
- EGL_ALPHA_SIZE, 8,
- EGL_BLUE_SIZE, 8,
- EGL_GREEN_SIZE, 8,
- EGL_RED_SIZE, 8,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
- EGL_NONE
- };
- config_attribs[kBufferSizeOffset] = win_attribs.depth;
-
- EGLint num_configs;
- if (!eglChooseConfig(g_display,
- config_attribs,
- &config_,
- 1,
- &num_configs)) {
- LOG(ERROR) << "eglChooseConfig failed with error "
- << GetLastEGLErrorString();
- return NULL;
- }
-
- if (num_configs) {
- EGLint config_depth;
- if (!eglGetConfigAttrib(g_display,
- config_,
- EGL_BUFFER_SIZE,
- &config_depth)) {
- LOG(ERROR) << "eglGetConfigAttrib failed with error "
- << GetLastEGLErrorString();
- return NULL;
- }
-
- if (config_depth == win_attribs.depth) {
- return config_;
- }
- }
-
- // Try without an alpha channel.
- config_attribs[kAlphaSizeOffset] = 0;
- if (!eglChooseConfig(g_display,
- config_attribs,
- &config_,
- 1,
- &num_configs)) {
- LOG(ERROR) << "eglChooseConfig failed with error "
- << GetLastEGLErrorString();
- return NULL;
- }
-
- if (num_configs == 0) {
- LOG(ERROR) << "No suitable EGL configs found.";
- return NULL;
- }
+ config_ = GetEGLConfig(this->GetSurfaceConfiguration(), true);
}
return config_;
-#endif
}
bool NativeViewGLSurfaceEGL::IsOffscreen() {
@@ -548,9 +541,13 @@ NativeViewGLSurfaceEGL::~NativeViewGLSurfaceEGL() {
#endif
}
-PbufferGLSurfaceEGL::PbufferGLSurfaceEGL(const gfx::Size& size)
- : size_(size),
- surface_(NULL) {
+PbufferGLSurfaceEGL::PbufferGLSurfaceEGL(
+ const gfx::Size& size,
+ SurfaceConfiguration requested_configuration)
+ : GLSurfaceEGL(requested_configuration),
+ size_(size),
+ surface_(NULL),
+ config_(NULL) {
abarth-chromium 2015/06/09 00:30:22 nullptr
iansf 2015/06/09 01:52:05 Done.
// Some implementations of Pbuffer do not support having a 0 size. For such
// cases use a (1, 1) surface.
if (size_.GetArea() == 0)
@@ -603,7 +600,10 @@ void PbufferGLSurfaceEGL::Destroy() {
}
EGLConfig PbufferGLSurfaceEGL::GetConfig() {
- return g_config;
+ if (!config_) {
+ config_ = GetEGLConfig(this->GetSurfaceConfiguration(), false);
+ }
+ return config_;
}
bool PbufferGLSurfaceEGL::IsOffscreen() {
@@ -673,8 +673,9 @@ PbufferGLSurfaceEGL::~PbufferGLSurfaceEGL() {
Destroy();
}
-SurfacelessEGL::SurfacelessEGL(const gfx::Size& size)
- : size_(size) {
+SurfacelessEGL::SurfacelessEGL(const gfx::Size& size,
+ SurfaceConfiguration requested_configuration)
+ : GLSurfaceEGL(requested_configuration), size_(size) {
}
bool SurfacelessEGL::Initialize() {
@@ -685,7 +686,7 @@ void SurfacelessEGL::Destroy() {
}
EGLConfig SurfacelessEGL::GetConfig() {
- return g_config;
+ return NULL;
}
bool SurfacelessEGL::IsOffscreen() {

Powered by Google App Engine
This is Rietveld 408576698