Index: ui/gl/gl_surface_glx.cc |
diff --git a/ui/gl/gl_surface_glx.cc b/ui/gl/gl_surface_glx.cc |
index 803906093508bd509714136523192d8c6cc20143..0602dfabe0c675752f3c9b373a80948b8cb3462e 100644 |
--- a/ui/gl/gl_surface_glx.cc |
+++ b/ui/gl/gl_surface_glx.cc |
@@ -33,8 +33,8 @@ namespace gfx { |
namespace { |
-Display* g_display = NULL; |
-const char* g_glx_extensions = NULL; |
+Display* g_display = nullptr; |
+const char* g_glx_extensions = nullptr; |
bool g_glx_context_create = false; |
bool g_glx_create_context_robustness_supported = false; |
bool g_glx_texture_from_pixmap_supported = false; |
@@ -120,7 +120,7 @@ class SGIVideoSyncThread |
~SGIVideoSyncThread() override { |
DCHECK(CalledOnValidThread()); |
- g_video_sync_thread = NULL; |
+ g_video_sync_thread = nullptr; |
Stop(); |
} |
@@ -133,7 +133,7 @@ class SGIVideoSyncProviderThreadShim { |
public: |
explicit SGIVideoSyncProviderThreadShim(XID window) |
: window_(window), |
- context_(NULL), |
+ context_(nullptr), |
task_runner_(base::ThreadTaskRunnerHandle::Get()), |
cancel_vsync_flag_(), |
vsync_lock_() { |
@@ -145,7 +145,7 @@ class SGIVideoSyncProviderThreadShim { |
virtual ~SGIVideoSyncProviderThreadShim() { |
if (context_) { |
glXDestroyContext(display_, context_); |
- context_ = NULL; |
+ context_ = nullptr; |
} |
} |
@@ -180,9 +180,10 @@ class SGIVideoSyncProviderThreadShim { |
return; |
} |
- context_ = glXCreateContext(display_, visual_info_list.get(), NULL, True); |
+ context_ = |
+ glXCreateContext(display_, visual_info_list.get(), nullptr, True); |
- DCHECK(NULL != context_); |
+ DCHECK(nullptr != context_); |
} |
void GetVSyncParameters(const VSyncProvider::UpdateVSyncCallback& callback) { |
@@ -308,12 +309,12 @@ class SGIVideoSyncVSyncProvider |
DISALLOW_COPY_AND_ASSIGN(SGIVideoSyncVSyncProvider); |
}; |
-SGIVideoSyncThread* SGIVideoSyncThread::g_video_sync_thread = NULL; |
+SGIVideoSyncThread* SGIVideoSyncThread::g_video_sync_thread = nullptr; |
// In order to take advantage of GLX_SGI_video_sync, we need a display |
// for use on a separate thread. We must allocate this before the sandbox |
// goes up (rather than on-demand when we start the thread). |
-Display* SGIVideoSyncProviderThreadShim::display_ = NULL; |
+Display* SGIVideoSyncProviderThreadShim::display_ = nullptr; |
} // namespace |
@@ -404,10 +405,62 @@ void* GLSurfaceGLX::GetDisplay() { |
GLSurfaceGLX::~GLSurfaceGLX() {} |
+void* GLSurfaceGLX::GetConfig(gfx::AcceleratedWidget window) { |
+ DCHECK(window != 0); |
+ |
+ // This code path is expensive, but we only take it when |
+ // attempting to use GLX_ARB_create_context_robustness, in which |
+ // case we need a GLXFBConfig for the window in order to create a |
+ // context for it. |
+ // |
+ // TODO(kbr): this is not a reliable code path. On platforms which |
+ // support it, we should use glXChooseFBConfig in the browser |
+ // process to choose the FBConfig and from there the X Visual to |
+ // use when creating the window in the first place. Then we can |
+ // pass that FBConfig down rather than attempting to reconstitute |
+ // it. |
+ |
+ XWindowAttributes attributes; |
+ if (!XGetWindowAttributes(g_display, window, &attributes)) { |
+ LOG(ERROR) << "XGetWindowAttributes failed for window " << window << "."; |
+ return nullptr; |
+ } |
+ |
+ int visual_id = XVisualIDFromVisual(attributes.visual); |
+ |
+ int num_elements = 0; |
+ gfx::XScopedPtr<GLXFBConfig> configs( |
+ glXGetFBConfigs(g_display, DefaultScreen(g_display), &num_elements)); |
+ if (!configs.get()) { |
+ LOG(ERROR) << "glXGetFBConfigs failed."; |
+ return nullptr; |
+ } |
+ if (!num_elements) { |
+ LOG(ERROR) << "glXGetFBConfigs returned 0 elements."; |
+ return nullptr; |
+ } |
+ bool found = false; |
+ int i; |
+ for (i = 0; i < num_elements; ++i) { |
+ int value; |
+ if (glXGetFBConfigAttrib(g_display, configs.get()[i], GLX_VISUAL_ID, |
+ &value)) { |
+ LOG(ERROR) << "glXGetFBConfigAttrib failed."; |
+ return nullptr; |
+ } |
+ if (value == visual_id) { |
+ found = true; |
+ break; |
+ } |
+ } |
+ if (found) { |
+ return configs.get()[i]; |
+ } |
+ return nullptr; |
+} |
+ |
NativeViewGLSurfaceGLX::NativeViewGLSurfaceGLX(gfx::AcceleratedWidget window) |
- : parent_window_(window), |
- window_(0), |
- config_(NULL) { |
+ : parent_window_(window), window_(0), config_(nullptr) { |
} |
gfx::AcceleratedWidget NativeViewGLSurfaceGLX::GetDrawableHandle() const { |
@@ -426,23 +479,14 @@ bool NativeViewGLSurfaceGLX::Initialize() { |
// extra blits in the driver), that we can resize exactly in Resize(), |
// correctly ordered with GL, so that we don't have invalid transient states. |
// See https://crbug.com/326995. |
- window_ = XCreateWindow(g_display, |
- parent_window_, |
- 0, |
- 0, |
- size_.width(), |
- size_.height(), |
- 0, |
- CopyFromParent, |
- InputOutput, |
- CopyFromParent, |
- 0, |
- NULL); |
+ window_ = XCreateWindow(g_display, parent_window_, 0, 0, size_.width(), |
+ size_.height(), 0, CopyFromParent, InputOutput, |
+ CopyFromParent, 0, nullptr); |
XMapWindow(g_display, window_); |
ui::PlatformEventSource* event_source = |
ui::PlatformEventSource::GetInstance(); |
- // Can be NULL in tests, when we don't care about Exposes. |
+ // Can be nullptr in tests, when we don't care about Exposes. |
if (event_source) { |
XSelectInput(g_display, window_, ExposureMask); |
ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); |
@@ -518,61 +562,8 @@ bool NativeViewGLSurfaceGLX::SupportsPostSubBuffer() { |
} |
void* NativeViewGLSurfaceGLX::GetConfig() { |
- if (!config_) { |
- // This code path is expensive, but we only take it when |
- // attempting to use GLX_ARB_create_context_robustness, in which |
- // case we need a GLXFBConfig for the window in order to create a |
- // context for it. |
- // |
- // TODO(kbr): this is not a reliable code path. On platforms which |
- // support it, we should use glXChooseFBConfig in the browser |
- // process to choose the FBConfig and from there the X Visual to |
- // use when creating the window in the first place. Then we can |
- // pass that FBConfig down rather than attempting to reconstitute |
- // it. |
- |
- XWindowAttributes attributes; |
- if (!XGetWindowAttributes( |
- g_display, |
- window_, |
- &attributes)) { |
- LOG(ERROR) << "XGetWindowAttributes failed for window " << |
- window_ << "."; |
- return NULL; |
- } |
- |
- int visual_id = XVisualIDFromVisual(attributes.visual); |
- |
- int num_elements = 0; |
- gfx::XScopedPtr<GLXFBConfig> configs( |
- glXGetFBConfigs(g_display, DefaultScreen(g_display), &num_elements)); |
- if (!configs.get()) { |
- LOG(ERROR) << "glXGetFBConfigs failed."; |
- return NULL; |
- } |
- if (!num_elements) { |
- LOG(ERROR) << "glXGetFBConfigs returned 0 elements."; |
- return NULL; |
- } |
- bool found = false; |
- int i; |
- for (i = 0; i < num_elements; ++i) { |
- int value; |
- if (glXGetFBConfigAttrib( |
- g_display, configs.get()[i], GLX_VISUAL_ID, &value)) { |
- LOG(ERROR) << "glXGetFBConfigAttrib failed."; |
- return NULL; |
- } |
- if (value == visual_id) { |
- found = true; |
- break; |
- } |
- } |
- if (found) { |
- config_ = configs.get()[i]; |
- } |
- } |
- |
+ if (!config_) |
+ config_ = GLSurfaceGLX::GetConfig(window_); |
return config_; |
} |
@@ -591,93 +582,61 @@ NativeViewGLSurfaceGLX::~NativeViewGLSurfaceGLX() { |
Destroy(); |
} |
-PbufferGLSurfaceGLX::PbufferGLSurfaceGLX(const gfx::Size& size) |
- : size_(size), |
- config_(NULL), |
- pbuffer_(0) { |
- // Some implementations of Pbuffer do not support having a 0 size. For such |
- // cases use a (1, 1) surface. |
+UnmappedNativeViewGLSurfaceGLX::UnmappedNativeViewGLSurfaceGLX( |
+ const gfx::Size& size) |
+ : size_(size), config_(nullptr), window_(0) { |
+ // Ensure that we don't create a window with zero size. |
if (size_.GetArea() == 0) |
hendrikw
2015/04/17 18:59:46
I think it's safer to leave this in, but it would
piman
2015/04/17 19:37:29
AIUI yes it's needed. XCreatWindow(3) isn't clear
|
size_.SetSize(1, 1); |
} |
-bool PbufferGLSurfaceGLX::Initialize() { |
- DCHECK(!pbuffer_); |
- |
- static const int config_attributes[] = { |
- GLX_BUFFER_SIZE, 32, |
- GLX_ALPHA_SIZE, 8, |
- GLX_BLUE_SIZE, 8, |
- GLX_GREEN_SIZE, 8, |
- GLX_RED_SIZE, 8, |
- GLX_RENDER_TYPE, GLX_RGBA_BIT, |
- GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT, |
- GLX_DOUBLEBUFFER, False, |
- 0 |
- }; |
- |
- int num_elements = 0; |
- gfx::XScopedPtr<GLXFBConfig> configs(glXChooseFBConfig( |
- g_display, DefaultScreen(g_display), config_attributes, &num_elements)); |
- if (!configs.get()) { |
- LOG(ERROR) << "glXChooseFBConfig failed."; |
- return false; |
- } |
- if (!num_elements) { |
- LOG(ERROR) << "glXChooseFBConfig returned 0 elements."; |
- return false; |
- } |
+bool UnmappedNativeViewGLSurfaceGLX::Initialize() { |
+ DCHECK(!window_); |
- config_ = configs.get()[0]; |
- |
- const int pbuffer_attributes[] = { |
- GLX_PBUFFER_WIDTH, size_.width(), |
- GLX_PBUFFER_HEIGHT, size_.height(), |
- 0 |
- }; |
- pbuffer_ = glXCreatePbuffer(g_display, |
- static_cast<GLXFBConfig>(config_), |
- pbuffer_attributes); |
- if (!pbuffer_) { |
- Destroy(); |
- LOG(ERROR) << "glXCreatePbuffer failed."; |
- return false; |
- } |
+ gfx::AcceleratedWidget parent_window = |
+ RootWindow(g_display, DefaultScreen(g_display)); |
- return true; |
+ // We create a window with CopyFromParent visual so that we have the same |
+ // visual as NativeViewGLSurfaceGLX (i.e. same GLXFBConfig), to ensure |
+ // contexts are compatible and can be made current with either. |
+ window_ = XCreateWindow(g_display, parent_window, 0, 0, size_.width(), |
+ size_.height(), 0, CopyFromParent, InputOutput, |
+ CopyFromParent, 0, nullptr); |
+ return window_ != 0; |
} |
-void PbufferGLSurfaceGLX::Destroy() { |
- if (pbuffer_) { |
- glXDestroyPbuffer(g_display, pbuffer_); |
- pbuffer_ = 0; |
+void UnmappedNativeViewGLSurfaceGLX::Destroy() { |
+ config_ = nullptr; |
+ if (window_) { |
+ XDestroyWindow(g_display, window_); |
+ window_ = 0; |
} |
- |
- config_ = NULL; |
} |
-bool PbufferGLSurfaceGLX::IsOffscreen() { |
+bool UnmappedNativeViewGLSurfaceGLX::IsOffscreen() { |
return true; |
} |
-bool PbufferGLSurfaceGLX::SwapBuffers() { |
- NOTREACHED() << "Attempted to call SwapBuffers on a pbuffer."; |
+bool UnmappedNativeViewGLSurfaceGLX::SwapBuffers() { |
+ NOTREACHED() << "Attempted to call SwapBuffers on an unmapped window."; |
return false; |
} |
-gfx::Size PbufferGLSurfaceGLX::GetSize() { |
+gfx::Size UnmappedNativeViewGLSurfaceGLX::GetSize() { |
return size_; |
} |
-void* PbufferGLSurfaceGLX::GetHandle() { |
- return reinterpret_cast<void*>(pbuffer_); |
+void* UnmappedNativeViewGLSurfaceGLX::GetHandle() { |
+ return reinterpret_cast<void*>(window_); |
} |
-void* PbufferGLSurfaceGLX::GetConfig() { |
+void* UnmappedNativeViewGLSurfaceGLX::GetConfig() { |
+ if (!config_) |
+ config_ = GLSurfaceGLX::GetConfig(window_); |
return config_; |
} |
-PbufferGLSurfaceGLX::~PbufferGLSurfaceGLX() { |
+UnmappedNativeViewGLSurfaceGLX::~UnmappedNativeViewGLSurfaceGLX() { |
Destroy(); |
} |