| Index: chrome/gpu/gpu_backing_store_glx.cc | 
| =================================================================== | 
| --- chrome/gpu/gpu_backing_store_glx.cc	(revision 65168) | 
| +++ chrome/gpu/gpu_backing_store_glx.cc	(working copy) | 
| @@ -1,230 +0,0 @@ | 
| -// Copyright (c) 2010 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 "chrome/gpu/gpu_backing_store_glx.h" | 
| - | 
| -#include "app/gfx/gl/gl_bindings.h" | 
| -#include "app/surface/transport_dib.h" | 
| -#include "base/scoped_ptr.h" | 
| -#include "chrome/common/gpu_messages.h" | 
| -#include "chrome/gpu/gpu_backing_store_glx_context.h" | 
| -#include "chrome/gpu/gpu_thread.h" | 
| -#include "chrome/gpu/gpu_view_x.h" | 
| -#include "gfx/rect.h" | 
| -#include "skia/ext/platform_canvas.h" | 
| -#include "third_party/skia/include/core/SkBitmap.h" | 
| - | 
| -GpuBackingStoreGLX::GpuBackingStoreGLX(GpuViewX* view, | 
| -                                       GpuThread* gpu_thread, | 
| -                                       int32 routing_id, | 
| -                                       const gfx::Size& size) | 
| -    : view_(view), | 
| -      gpu_thread_(gpu_thread), | 
| -      routing_id_(routing_id), | 
| -      size_(size), | 
| -      texture_id_(0) { | 
| -  gpu_thread_->AddRoute(routing_id_, this); | 
| - | 
| -  view_->BindContext();  // Must do this before issuing OpenGl. | 
| - | 
| -  glGenTextures(1, &texture_id_); | 
| -  glBindTexture(GL_TEXTURE_2D, texture_id_); | 
| - | 
| -  // TODO(apatrick): This function are not available in GLES2. | 
| -  // glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); | 
| -  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 
| -  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 
| -} | 
| - | 
| -GpuBackingStoreGLX::~GpuBackingStoreGLX() { | 
| -  if (texture_id_) | 
| -    glDeleteTextures(1, &texture_id_); | 
| -  gpu_thread_->RemoveRoute(routing_id_); | 
| -} | 
| - | 
| -void GpuBackingStoreGLX::OnMessageReceived(const IPC::Message& msg) { | 
| -  IPC_BEGIN_MESSAGE_MAP(GpuBackingStoreGLX, msg) | 
| -    IPC_MESSAGE_HANDLER(GpuMsg_PaintToBackingStore, OnPaintToBackingStore) | 
| -    IPC_MESSAGE_HANDLER(GpuMsg_ScrollBackingStore, OnScrollBackingStore) | 
| -  IPC_END_MESSAGE_MAP_EX() | 
| -} | 
| - | 
| -void GpuBackingStoreGLX::OnChannelConnected(int32 peer_pid) { | 
| -} | 
| - | 
| -void GpuBackingStoreGLX::OnChannelError() { | 
| -  // FIXME(brettw) does this mean we aren't getting any more messages and we | 
| -  // should delete outselves? | 
| -  NOTIMPLEMENTED(); | 
| -} | 
| - | 
| -void GpuBackingStoreGLX::OnPaintToBackingStore( | 
| -    base::ProcessId source_process_id, | 
| -    TransportDIB::Id id, | 
| -    const gfx::Rect& bitmap_rect, | 
| -    const std::vector<gfx::Rect>& copy_rects) { | 
| -  scoped_ptr<TransportDIB> dib(TransportDIB::Map(id)); | 
| -  view_->BindContext(); | 
| - | 
| -  scoped_ptr<skia::PlatformCanvas> canvas( | 
| -      dib->GetPlatformCanvas(bitmap_rect.width(), bitmap_rect.height())); | 
| -  const SkBitmap& transport_bitmap = | 
| -      canvas->getTopPlatformDevice().accessBitmap(false); | 
| - | 
| -  for (size_t i = 0; i < copy_rects.size(); i++) | 
| -    PaintOneRectToBackingStore(transport_bitmap, bitmap_rect, copy_rects[i]); | 
| - | 
| -  gpu_thread_->Send(new GpuHostMsg_PaintToBackingStore_ACK(routing_id_)); | 
| - | 
| -  view_->Repaint(); | 
| -} | 
| - | 
| -void GpuBackingStoreGLX::OnScrollBackingStore(int dx, int dy, | 
| -                                              const gfx::Rect& clip_rect, | 
| -                                              const gfx::Size& view_size) { | 
| -  // Create a framebuffer to render our scrolled texture into. | 
| -  GpuBackingStoreGLXContext* context = view_->gpu_thread()->GetGLXContext(); | 
| -  if (!context->BindTextureForScrolling(view_->window(), size_)) | 
| -    return; | 
| - | 
| -  glEnable(GL_TEXTURE_2D); | 
| -  glBindTexture(GL_TEXTURE_2D, texture_id_); | 
| - | 
| -  // Set up the the tranform so we can paint exact pixels to the screen, with | 
| -  // (0, 0) at the bottom left. | 
| -  // TODO(apatrick): Commenting out because these variables were only used by | 
| -  // code that is now commented out. | 
| -  // float w = static_cast<float>(size_.width()); | 
| -  // float h = static_cast<float>(size_.height()); | 
| -  glViewport(0, 0, size_.width(), size_.height()); | 
| - | 
| -  // TODO(apatrick): These functions are not available in GLES2. | 
| -  // glLoadIdentity(); | 
| -  // glOrtho(0.0, w, 0.0, h, -1.0, 1.0); | 
| - | 
| -  // Paint the non-scrolled background of the page. Note that we try to avoid | 
| -  // this if the entire thing is scrolling, which is a common case. | 
| -  if (view_size != clip_rect.size()) { | 
| -    // TODO(apatrick): These functions are not available in GLES2. | 
| -    // glBegin(GL_QUADS); | 
| -    //  glTexCoord2f(0.0f, 0.0f); | 
| -    //  glVertex2f(0.0, 0.0); | 
| - | 
| -    //  glTexCoord2f(0.0f, 1.0f); | 
| -    //  glVertex2f(0.0, h); | 
| - | 
| -    //  glTexCoord2f(1.0f, 1.0f); | 
| -    //  glVertex2f(w, h); | 
| - | 
| -    //  glTexCoord2f(1.0f, 0.0f); | 
| -    //  glVertex2f(w, 0.0); | 
| -    // glEnd(); | 
| -  } | 
| - | 
| -  // Constrain the painting to only the area we're scrolling.  Compute the clip | 
| -  // rect in OpenGL pixel coords, which uses the lower-left as the origin. | 
| -  gfx::Rect gl_clip_rect(clip_rect.x(), clip_rect.y(), | 
| -                         clip_rect.width(), clip_rect.height()); | 
| - | 
| -  glEnable(GL_SCISSOR_TEST); | 
| -  glScissor(gl_clip_rect.x(), gl_clip_rect.y(), | 
| -            gl_clip_rect.width(), gl_clip_rect.height()); | 
| - | 
| -  // Paint the offset texture. | 
| -  // TODO(apatrick): These functions are not available in GLES2. | 
| -  // glTranslatef(static_cast<float>(dx), static_cast<float>(dy), 0.0f); | 
| -  // glBegin(GL_QUADS); | 
| -  //  glTexCoord2f(0.0f, 0.0f); | 
| -  //  glVertex2f(0.0, 0.0); | 
| - | 
| -  //  glTexCoord2f(0.0f, 1.0f); | 
| -  //  glVertex2f(0.0, h); | 
| - | 
| -  //  glTexCoord2f(1.0f, 1.0f); | 
| -  //  glVertex2f(w, h); | 
| - | 
| -  //  glTexCoord2f(1.0f, 0.0f); | 
| -  //  glVertex2f(w, 0.0); | 
| -  // glEnd(); | 
| -  glDisable(GL_SCISSOR_TEST); | 
| - | 
| -  glBindTexture(GL_TEXTURE_2D, 0); | 
| -  texture_id_ = context->SwapTextureForScrolling(texture_id_, size_); | 
| -  glFlush(); | 
| -  DCHECK(texture_id_); | 
| -} | 
| - | 
| -void GpuBackingStoreGLX::PaintOneRectToBackingStore( | 
| -    const SkBitmap& transport_bitmap, | 
| -    const gfx::Rect& bitmap_rect, | 
| -    const gfx::Rect& copy_rect) { | 
| -  // Make a bitmap referring to the correct subset of the input bitmap. | 
| -  SkBitmap copy_bitmap; | 
| -  if (copy_rect.x() == 0 && | 
| -      copy_rect.y() == 0 && | 
| -      copy_rect.width() == bitmap_rect.width() && | 
| -      copy_rect.height() == bitmap_rect.height()) { | 
| -    // The subregion we're being asked to copy is the full bitmap. We don't | 
| -    // have to do any extra work to make the bitmap, we can just refer to the | 
| -    // original data (bitmap assignments are just refs to the original). | 
| -    copy_bitmap = transport_bitmap; | 
| -  } else { | 
| -    // Make a rect referring to the subset into the original (copy_rect and | 
| -    // bitmap_rect are both in global coords) and make a copy of that data to | 
| -    // give to OpenGL later. | 
| -    // | 
| -    // TODO(brettw) on desktop GL (not ES) we can do a trick here using | 
| -    // GL_UNPACK_ROW_WIDTH, GL_UNPACK_SKIP_PIXELS and GL_UNPACK_SKIP_ROWS to | 
| -    // avoid this copy. | 
| -    // | 
| -    // On ES, it may be better to actually call subimage for each row of | 
| -    // the updated bitmap to avoid the copy. We will have to benchmark that | 
| -    // approach against making the copy here to see if it performs better on | 
| -    // the systems we're targeting. | 
| -    SkIRect sk_copy_rect = { copy_rect.x() - bitmap_rect.x(), | 
| -                             copy_rect.y() - bitmap_rect.y(), | 
| -                             copy_rect.right() - bitmap_rect.x(), | 
| -                             copy_rect.bottom() - bitmap_rect.y()}; | 
| - | 
| -    // extractSubset will not acutually make a copy, and Skia will refer to the | 
| -    // original data which is not what we want, since rows won't be contiguous. | 
| -    // However, since this is very cheap, we can do it and *then* make a copy. | 
| -    SkBitmap non_copied_subset; | 
| -    transport_bitmap.extractSubset(&non_copied_subset, sk_copy_rect); | 
| -    non_copied_subset.copyTo(©_bitmap, SkBitmap::kARGB_8888_Config); | 
| -    CHECK(!copy_bitmap.isNull()); | 
| -  } | 
| - | 
| -  glBindTexture(GL_TEXTURE_2D, texture_id_); | 
| - | 
| -  SkAutoLockPixels lock(copy_bitmap); | 
| -  if (copy_rect.size() == size_ && copy_rect.size() != texture_size_) { | 
| -    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, copy_rect.width(), | 
| -                 copy_rect.height(), 0, GL_BGRA, GL_UNSIGNED_BYTE, | 
| -                 copy_bitmap.getAddr32(0, 0)); | 
| -    texture_size_ = copy_rect.size(); | 
| -  } else { | 
| -    /* Debugging code for why the below call may fail. | 
| -    int existing_width = 0, existing_height = 0; | 
| -    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, | 
| -                             &existing_width); | 
| -    glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, | 
| -                             &existing_height); | 
| -    */ | 
| -    glTexSubImage2D(GL_TEXTURE_2D, 0, copy_rect.x(), copy_rect.y(), | 
| -                    copy_rect.width(), copy_rect.height(), | 
| -                    GL_BGRA, GL_UNSIGNED_BYTE, | 
| -                    copy_bitmap.getAddr32(0, 0)); | 
| -    /* Enable if you're having problems with TexSubImage failing. | 
| -    int err = glGetError(); | 
| -    DCHECK(err == GL_NO_ERROR) << "Error " << err << | 
| -           " copying (" << copy_rect.x() << "," << copy_rect.y() << | 
| -           ")," << copy_rect.width() << "x" << copy_rect.height() << | 
| -           " for bitmap " << texture_size_.width() << "x" << | 
| -           texture_size_.height() << | 
| -           " real size " << existing_width << "x" << existing_height << | 
| -           " for " << this; | 
| -    */ | 
| -  } | 
| -} | 
|  |