Index: ui/ozone/platform/dri/ozone_platform_gbm.cc |
diff --git a/ui/ozone/platform/dri/ozone_platform_gbm.cc b/ui/ozone/platform/dri/ozone_platform_gbm.cc |
index 1ffd179820fd6340ec52574a7985e77189949255..a111a340a612d805890a092415fa4f0a2d6abef1 100644 |
--- a/ui/ozone/platform/dri/ozone_platform_gbm.cc |
+++ b/ui/ozone/platform/dri/ozone_platform_gbm.cc |
@@ -14,6 +14,7 @@ |
#include "ui/ozone/ozone_platform.h" |
#include "ui/ozone/platform/dri/cursor_factory_evdev_dri.h" |
#include "ui/ozone/platform/dri/dri_wrapper.h" |
+#include "ui/ozone/platform/dri/gbm_buffer.h" |
#include "ui/ozone/platform/dri/gbm_surface.h" |
#include "ui/ozone/platform/dri/gbm_surface_factory.h" |
#include "ui/ozone/platform/dri/gpu_platform_support_gbm.h" |
@@ -54,7 +55,7 @@ class GbmSurfaceGenerator : public ScanoutSurfaceGenerator { |
return new GbmSurface(device_, dri_, size); |
} |
- private: |
+ protected: |
DriWrapper* dri_; // Not owned. |
// HACK: gbm drivers have broken linkage |
@@ -65,9 +66,24 @@ class GbmSurfaceGenerator : public ScanoutSurfaceGenerator { |
DISALLOW_COPY_AND_ASSIGN(GbmSurfaceGenerator); |
}; |
+class GbmEglImageSurfaceGenerator : public GbmSurfaceGenerator { |
+ public: |
+ GbmEglImageSurfaceGenerator(DriWrapper* dri) : GbmSurfaceGenerator(dri) {} |
+ virtual ~GbmEglImageSurfaceGenerator() {} |
+ |
+ virtual ScanoutSurface* Create(const gfx::Size& size) OVERRIDE { |
+ scoped_ptr<GbmBuffer> buffer = |
+ scoped_ptr<GbmBuffer>(new GbmBuffer(device_, dri_, size)); |
+ if (!buffer->InitializeBuffer(SurfaceFactoryOzone::RGBA_8888, true)) { |
+ return NULL; |
+ } |
+ return buffer.release(); |
+ } |
+}; |
+ |
class OzonePlatformGbm : public OzonePlatform { |
public: |
- OzonePlatformGbm() { |
+ OzonePlatformGbm(bool use_surfaceless) : use_surfaceless_(use_surfaceless) { |
base::AtExitManager::RegisterTask( |
base::Bind(&base::DeletePointer<OzonePlatformGbm>, this)); |
} |
@@ -104,7 +120,7 @@ class OzonePlatformGbm : public OzonePlatform { |
vt_manager_.reset(new VirtualTerminalManager()); |
// Needed since the browser process creates the accelerated widgets and that |
// happens through SFO. |
- surface_factory_ozone_.reset(new GbmSurfaceFactory()); |
+ surface_factory_ozone_.reset(new GbmSurfaceFactory(use_surfaceless_)); |
device_manager_ = CreateDeviceManager(); |
gpu_platform_support_host_.reset(new GpuPlatformSupportHostGbm()); |
@@ -116,11 +132,14 @@ class OzonePlatformGbm : public OzonePlatform { |
virtual void InitializeGPU() OVERRIDE { |
dri_.reset(new DriWrapper(kDefaultGraphicsCardPath)); |
- surface_generator_.reset(new GbmSurfaceGenerator(dri_.get())); |
+ if (use_surfaceless_) |
+ surface_generator_.reset(new GbmEglImageSurfaceGenerator(dri_.get())); |
+ else |
+ surface_generator_.reset(new GbmSurfaceGenerator(dri_.get())); |
screen_manager_.reset(new ScreenManager(dri_.get(), |
surface_generator_.get())); |
if (!surface_factory_ozone_) |
- surface_factory_ozone_.reset(new GbmSurfaceFactory()); |
+ surface_factory_ozone_.reset(new GbmSurfaceFactory(use_surfaceless_)); |
surface_factory_ozone_->InitializeGpu(dri_.get(), |
surface_generator_->device(), |
@@ -131,6 +150,7 @@ class OzonePlatformGbm : public OzonePlatform { |
} |
private: |
+ bool use_surfaceless_; |
scoped_ptr<VirtualTerminalManager> vt_manager_; |
scoped_ptr<DriWrapper> dri_; |
scoped_ptr<GbmSurfaceGenerator> surface_generator_; |
@@ -149,6 +169,11 @@ class OzonePlatformGbm : public OzonePlatform { |
} // namespace |
-OzonePlatform* CreateOzonePlatformGbm() { return new OzonePlatformGbm; } |
+OzonePlatform* CreateOzonePlatformGbm() { |
+ return new OzonePlatformGbm(false); |
+} |
+OzonePlatform* CreateOzonePlatformGbmEglImage() { |
+ return new OzonePlatformGbm(true); |
+} |
} // namespace ui |