Index: ui/ozone/platform/drm/gpu/gbm_surface_factory.cc |
diff --git a/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc b/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f4828611e091c488c31c746e28d23ec04b1509df |
--- /dev/null |
+++ b/ui/ozone/platform/drm/gpu/gbm_surface_factory.cc |
@@ -0,0 +1,158 @@ |
+// Copyright 2014 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/ozone/platform/drm/gpu/gbm_surface_factory.h" |
+ |
+#include <gbm.h> |
+ |
+#include "base/files/file_path.h" |
+#include "third_party/khronos/EGL/egl.h" |
+#include "ui/ozone/common/egl_util.h" |
+#include "ui/ozone/platform/drm/gpu/drm_device_manager.h" |
+#include "ui/ozone/platform/drm/gpu/drm_window.h" |
+#include "ui/ozone/platform/drm/gpu/gbm_buffer.h" |
+#include "ui/ozone/platform/drm/gpu/gbm_device.h" |
+#include "ui/ozone/platform/drm/gpu/gbm_surface.h" |
+#include "ui/ozone/platform/drm/gpu/gbm_surfaceless.h" |
+#include "ui/ozone/platform/drm/gpu/hardware_display_controller.h" |
+#include "ui/ozone/platform/drm/gpu/screen_manager.h" |
+#include "ui/ozone/public/native_pixmap.h" |
+#include "ui/ozone/public/surface_ozone_canvas.h" |
+#include "ui/ozone/public/surface_ozone_egl.h" |
+ |
+namespace ui { |
+ |
+GbmSurfaceFactory::GbmSurfaceFactory(bool allow_surfaceless) |
+ : DrmSurfaceFactory(NULL), allow_surfaceless_(allow_surfaceless) { |
+} |
+ |
+GbmSurfaceFactory::~GbmSurfaceFactory() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+} |
+ |
+void GbmSurfaceFactory::InitializeGpu(DrmDeviceManager* drm_device_manager, |
+ ScreenManager* screen_manager) { |
+ drm_device_manager_ = drm_device_manager; |
+ screen_manager_ = screen_manager; |
+} |
+ |
+intptr_t GbmSurfaceFactory::GetNativeDisplay() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ auto primary_device = drm_device_manager_->GetDrmDevice( |
+ gfx::kNullAcceleratedWidget); |
+ DCHECK(primary_device.get()); |
+ auto gbm_device = static_cast<GbmDevice*>(primary_device.get()); |
+ return reinterpret_cast<EGLNativeDisplayType>(gbm_device->device()); |
+} |
+ |
+const int32* GbmSurfaceFactory::GetEGLSurfaceProperties( |
+ const int32* desired_list) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ static const int32 kConfigAttribs[] = {EGL_BUFFER_SIZE, |
+ 32, |
+ 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_NONE}; |
+ |
+ return kConfigAttribs; |
+} |
+ |
+bool GbmSurfaceFactory::LoadEGLGLES2Bindings( |
+ AddGLLibraryCallback add_gl_library, |
+ SetGLGetProcAddressProcCallback set_gl_get_proc_address) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ return LoadDefaultEGLGLES2Bindings(add_gl_library, set_gl_get_proc_address); |
+} |
+ |
+scoped_ptr<SurfaceOzoneCanvas> GbmSurfaceFactory::CreateCanvasForWidget( |
+ gfx::AcceleratedWidget widget) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ LOG(FATAL) << "Software rendering mode is not supported with GBM platform"; |
+ return nullptr; |
+} |
+ |
+scoped_ptr<SurfaceOzoneEGL> GbmSurfaceFactory::CreateEGLSurfaceForWidget( |
+ gfx::AcceleratedWidget widget) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ scoped_refptr<GbmDevice> gbm = GetGbmDevice(widget); |
+ DCHECK(gbm); |
+ |
+ scoped_ptr<GbmSurface> surface( |
+ new GbmSurface(screen_manager_->GetWindow(widget), gbm)); |
+ if (!surface->Initialize()) |
+ return nullptr; |
+ |
+ return surface.Pass(); |
+} |
+ |
+scoped_ptr<SurfaceOzoneEGL> |
+GbmSurfaceFactory::CreateSurfacelessEGLSurfaceForWidget( |
+ gfx::AcceleratedWidget widget) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ if (!allow_surfaceless_) |
+ return nullptr; |
+ |
+ return make_scoped_ptr(new GbmSurfaceless(screen_manager_->GetWindow(widget), |
+ drm_device_manager_)); |
+} |
+ |
+scoped_refptr<ui::NativePixmap> GbmSurfaceFactory::CreateNativePixmap( |
+ gfx::AcceleratedWidget widget, |
+ gfx::Size size, |
+ BufferFormat format, |
+ BufferUsage usage) { |
+ if (usage == MAP) |
+ return nullptr; |
+ |
+ scoped_refptr<GbmDevice> gbm = GetGbmDevice(widget); |
+ DCHECK(gbm); |
+ |
+ scoped_refptr<GbmBuffer> buffer = |
+ GbmBuffer::CreateBuffer(gbm, format, size, true); |
+ if (!buffer.get()) |
+ return nullptr; |
+ |
+ scoped_refptr<GbmPixmap> pixmap(new GbmPixmap(buffer, screen_manager_)); |
+ if (!pixmap->Initialize()) |
+ return nullptr; |
+ |
+ return pixmap; |
+} |
+ |
+bool GbmSurfaceFactory::CanShowPrimaryPlaneAsOverlay() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ return allow_surfaceless_; |
+} |
+ |
+bool GbmSurfaceFactory::CanCreateNativePixmap(BufferUsage usage) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ switch (usage) { |
+ case MAP: |
+ return false; |
+ case PERSISTENT_MAP: |
+ return false; |
+ case SCANOUT: |
+ return true; |
+ } |
+ NOTREACHED(); |
+ return false; |
+} |
+ |
+scoped_refptr<GbmDevice> GbmSurfaceFactory::GetGbmDevice( |
+ gfx::AcceleratedWidget widget) { |
+ return static_cast<GbmDevice*>( |
+ drm_device_manager_->GetDrmDevice(widget).get()); |
+} |
+ |
+} // namespace ui |