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

Unified Diff: chrome/browser/renderer_host/accelerated_surface_container_touch.cc

Issue 7980006: Implement OSMesa image transport for TOUCH_UI builds (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Rebase onto newer trunk Created 9 years, 3 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: chrome/browser/renderer_host/accelerated_surface_container_touch.cc
diff --git a/chrome/browser/renderer_host/accelerated_surface_container_touch.cc b/chrome/browser/renderer_host/accelerated_surface_container_touch.cc
index ab0db73c1e1308ab1bb2de674dd91788db9090b3..ca8217c4ce049125cef17b4a1e2dcbe571388126 100644
--- a/chrome/browser/renderer_host/accelerated_surface_container_touch.cc
+++ b/chrome/browser/renderer_host/accelerated_surface_container_touch.cc
@@ -23,7 +23,7 @@ class AcceleratedSurfaceContainerTouchEGL
: public AcceleratedSurfaceContainerTouch {
public:
AcceleratedSurfaceContainerTouchEGL(const gfx::Size& size,
- uint64 surface_handle);
+ uint64 surface_id);
// TextureGL implementation
virtual void Draw(const ui::TextureDrawParams& params,
const gfx::Rect& clip_bounds_in_texture) OVERRIDE;
@@ -40,7 +40,7 @@ class AcceleratedSurfaceContainerTouchGLX
: public AcceleratedSurfaceContainerTouch {
public:
AcceleratedSurfaceContainerTouchGLX(const gfx::Size& size,
- uint64 surface_handle);
+ uint64 surface_id);
// TextureGL implementation
virtual void Draw(const ui::TextureDrawParams& params,
const gfx::Rect& clip_bounds_in_texture) OVERRIDE;
@@ -54,6 +54,30 @@ class AcceleratedSurfaceContainerTouchGLX
DISALLOW_COPY_AND_ASSIGN(AcceleratedSurfaceContainerTouchGLX);
};
+class AcceleratedSurfaceContainerTouchGLXShm
+ : public AcceleratedSurfaceContainerTouch {
+ public:
+ AcceleratedSurfaceContainerTouchGLXShm(const gfx::Size& size,
+ uint64 surface_handle);
+ // TextureGL implementation
+ virtual void Draw(const ui::TextureDrawParams& params,
+ const gfx::Rect& clip_bounds_in_texture) OVERRIDE;
+
+ virtual uint64 id() const OVERRIDE;
+
+ // Some implementations of this class use shared memory, this the handle
+ // to the shared buffer, which is part of the surface container.
+ virtual TransportDIB::Handle handle() const OVERRIDE;
+
+ private:
+ ~AcceleratedSurfaceContainerTouchGLXShm();
+
+ uint64 id_;
+ scoped_ptr<TransportDIB> shared_mem_;
+
+ DISALLOW_COPY_AND_ASSIGN(AcceleratedSurfaceContainerTouchGLXShm);
+};
+
class ScopedPtrXFree {
public:
void operator()(void* x) const {
@@ -63,8 +87,8 @@ class ScopedPtrXFree {
AcceleratedSurfaceContainerTouchEGL::AcceleratedSurfaceContainerTouchEGL(
const gfx::Size& size,
- uint64 surface_handle)
- : AcceleratedSurfaceContainerTouch(size),
+ uint64 surface_id)
+ : AcceleratedSurfaceContainerTouch(size, surface_id),
image_(NULL) {
ui::SharedResources* instance = ui::SharedResources::GetInstance();
DCHECK(instance);
@@ -72,7 +96,7 @@ AcceleratedSurfaceContainerTouchEGL::AcceleratedSurfaceContainerTouchEGL(
image_ = eglCreateImageKHR(
gfx::GLSurfaceEGL::GetHardwareDisplay(), EGL_NO_CONTEXT,
- EGL_NATIVE_PIXMAP_KHR, reinterpret_cast<void*>(surface_handle), NULL);
+ EGL_NATIVE_PIXMAP_KHR, reinterpret_cast<void*>(surface_id), NULL);
glGenTextures(1, &texture_id_);
glBindTexture(GL_TEXTURE_2D, texture_id_);
@@ -116,8 +140,8 @@ void AcceleratedSurfaceContainerTouchEGL::Draw(
AcceleratedSurfaceContainerTouchGLX::AcceleratedSurfaceContainerTouchGLX(
const gfx::Size& size,
- uint64 surface_handle)
- : AcceleratedSurfaceContainerTouch(size),
+ uint64 surface_id)
+ : AcceleratedSurfaceContainerTouch(size, surface_id),
pixmap_(0),
glx_pixmap_(0) {
ui::SharedResources* instance = ui::SharedResources::GetInstance();
@@ -125,6 +149,9 @@ AcceleratedSurfaceContainerTouchGLX::AcceleratedSurfaceContainerTouchGLX(
instance->MakeSharedContextCurrent();
// Create pixmap from window.
+ // We receive a window here rather than a pixmap directly because drivers
+ // require (or required) that the pixmap used to create the GL texture be
+ // created in the same process as the texture.
Display* dpy = gfx::GLSurfaceGLX::GetDisplay();
int event_base, error_base;
if (XCompositeQueryExtension(dpy, &event_base, &error_base)) {
@@ -135,7 +162,7 @@ AcceleratedSurfaceContainerTouchGLX::AcceleratedSurfaceContainerTouchGLX(
return;
}
}
- pixmap_ = XCompositeNameWindowPixmap(dpy, surface_handle);
+ pixmap_ = XCompositeNameWindowPixmap(dpy, surface_id);
// Wrap the pixmap in a GLXPixmap
int screen = DefaultScreen(dpy);
@@ -231,24 +258,112 @@ void AcceleratedSurfaceContainerTouchGLX::Draw(
glXReleaseTexImageEXT(dpy, glx_pixmap_, GLX_FRONT_LEFT_EXT);
}
+AcceleratedSurfaceContainerTouchGLXShm::AcceleratedSurfaceContainerTouchGLXShm(
+ const gfx::Size& size,
+ uint64 surface_id)
+ : AcceleratedSurfaceContainerTouch(size, surface_id),
+ id_(0),
+ shared_mem_(0) {
+ static uint32 next_id = 1;
+
+ ui::SharedResources* instance = ui::SharedResources::GetInstance();
+ DCHECK(instance);
+ instance->MakeSharedContextCurrent();
+
+ // We expect to make the id here, so don't want the other end giving us one
+ DCHECK_EQ(surface_id, static_cast<uint64>(0));
+
+ // It's possible that this ID gneration could clash with IDs from other
+ // AcceleratedSurfaceContainerTouch* objects, however we should never have
+ // ids active from more than one type at the same time, so we have free
+ // reign of the id namespace.
+ shared_mem_.reset(
+ TransportDIB::Create(size.width() * size.height() * 4, // GL_RGBA=4 B/px
+ next_id));
+ id_ = next_id++;
+
+ // Create texture.
+ glGenTextures(1, &texture_id_);
+ glBindTexture(GL_TEXTURE_2D, texture_id_);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+}
+
+AcceleratedSurfaceContainerTouchGLXShm::
+ ~AcceleratedSurfaceContainerTouchGLXShm() {
+}
+
+uint64 AcceleratedSurfaceContainerTouchGLXShm::id() const {
+ return id_;
+}
+
+
+TransportDIB::Handle AcceleratedSurfaceContainerTouchGLXShm::handle() const {
+ if (shared_mem_.get())
+ return shared_mem_->handle();
+ else
+ return TransportDIB::DefaultHandleValue();
+}
+
+
+void AcceleratedSurfaceContainerTouchGLXShm::Draw(
+ const ui::TextureDrawParams& params,
+ const gfx::Rect& clip_bounds_in_texture) {
+ ui::SharedResources* instance = ui::SharedResources::GetInstance();
+ DCHECK(instance);
+
+ if (shared_mem_.get()) {
+ glBindTexture(GL_TEXTURE_2D, texture_id_);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ size_.width(), size_.height(), 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, shared_mem_->memory());
+
+ ui::TextureDrawParams modified_params = params;
+
+ // Texture from GPU is flipped vertically.
+ ui::Transform flipped;
+ flipped.SetScaleY(-1.0);
+ flipped.SetTranslateY(size_.height());
+ flipped.ConcatTransform(params.transform);
+
+ modified_params.transform = flipped;
+
+ DrawInternal(*instance->program_no_swizzle(),
+ modified_params,
+ clip_bounds_in_texture);
+ }
+}
+
} // namespace
AcceleratedSurfaceContainerTouch::AcceleratedSurfaceContainerTouch(
- const gfx::Size& size) : TextureGL(size) {
+ const gfx::Size& size,
+ uint64 surface_id) : TextureGL(size) {
+ id_ = surface_id;
+}
+
+uint64 AcceleratedSurfaceContainerTouch::id() const {
+ return id_;
+}
+
+TransportDIB::Handle AcceleratedSurfaceContainerTouch::handle() const {
+ return TransportDIB::DefaultHandleValue();
}
// static
AcceleratedSurfaceContainerTouch*
AcceleratedSurfaceContainerTouch::CreateAcceleratedSurfaceContainer(
const gfx::Size& size,
- uint64 surface_handle) {
+ uint64 surface_id) {
switch (gfx::GetGLImplementation()) {
case gfx::kGLImplementationDesktopGL:
- return new AcceleratedSurfaceContainerTouchGLX(size,
- surface_handle);
+ return new AcceleratedSurfaceContainerTouchGLXShm(size,
+ surface_id);
case gfx::kGLImplementationEGLGLES2:
return new AcceleratedSurfaceContainerTouchEGL(size,
- surface_handle);
+ surface_id);
default:
NOTREACHED();
return NULL;

Powered by Google App Engine
This is Rietveld 408576698