| Index: gpu/command_buffer/client/gles2_implementation.cc
 | 
| diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
 | 
| index 31d94f18dfd8af2f4a494ed000d5b98b8192c4f9..5635f2678a20595343d402764cf997a6b3385f72 100644
 | 
| --- a/gpu/command_buffer/client/gles2_implementation.cc
 | 
| +++ b/gpu/command_buffer/client/gles2_implementation.cc
 | 
| @@ -103,10 +103,6 @@ GLES2Implementation::GLES2Implementation(
 | 
|        bound_uniform_buffer_(0),
 | 
|        bound_pixel_pack_transfer_buffer_id_(0),
 | 
|        bound_pixel_unpack_transfer_buffer_id_(0),
 | 
| -      async_upload_token_(0),
 | 
| -      async_upload_sync_(NULL),
 | 
| -      async_upload_sync_shm_id_(0),
 | 
| -      async_upload_sync_shm_offset_(0),
 | 
|        error_bits_(0),
 | 
|        debug_(false),
 | 
|        lose_context_when_out_of_memory_(lose_context_when_out_of_memory),
 | 
| @@ -158,15 +154,7 @@ bool GLES2Implementation::Initialize(
 | 
|      return false;
 | 
|    }
 | 
|  
 | 
| -  mapped_memory_.reset(
 | 
| -      new MappedMemoryManager(
 | 
| -          helper_,
 | 
| -          base::Bind(&GLES2Implementation::PollAsyncUploads,
 | 
| -                     // The mapped memory manager is owned by |this| here, and
 | 
| -                     // since its destroyed before before we destroy ourselves
 | 
| -                     // we don't need extra safety measures for this closure.
 | 
| -                     base::Unretained(this)),
 | 
| -          mapped_memory_limit));
 | 
| +  mapped_memory_.reset(new MappedMemoryManager(helper_, mapped_memory_limit));
 | 
|  
 | 
|    unsigned chunk_size = 2 * 1024 * 1024;
 | 
|    if (mapped_memory_limit != kNoLimit) {
 | 
| @@ -252,13 +240,6 @@ GLES2Implementation::~GLES2Implementation() {
 | 
|  
 | 
|    buffer_tracker_.reset();
 | 
|  
 | 
| -  FreeAllAsyncUploadBuffers();
 | 
| -
 | 
| -  if (async_upload_sync_) {
 | 
| -    mapped_memory_->Free(async_upload_sync_);
 | 
| -    async_upload_sync_ = NULL;
 | 
| -  }
 | 
| -
 | 
|    // Make sure the commands make it the service.
 | 
|    WaitForCmd();
 | 
|  }
 | 
| @@ -300,7 +281,6 @@ void GLES2Implementation::FreeUnusedSharedMemory() {
 | 
|  }
 | 
|  
 | 
|  void GLES2Implementation::FreeEverything() {
 | 
| -  FreeAllAsyncUploadBuffers();
 | 
|    WaitForCmd();
 | 
|    query_tracker_->Shrink();
 | 
|    FreeUnusedSharedMemory();
 | 
| @@ -1965,17 +1945,8 @@ void GLES2Implementation::BufferSubData(
 | 
|  
 | 
|  void GLES2Implementation::RemoveTransferBuffer(BufferTracker::Buffer* buffer) {
 | 
|    int32 token = buffer->last_usage_token();
 | 
| -  uint32 async_token = buffer->last_async_upload_token();
 | 
|  
 | 
| -  if (async_token) {
 | 
| -    if (HasAsyncUploadTokenPassed(async_token)) {
 | 
| -      buffer_tracker_->Free(buffer);
 | 
| -    } else {
 | 
| -      detached_async_upload_memory_.push_back(
 | 
| -          std::make_pair(buffer->address(), async_token));
 | 
| -      buffer_tracker_->Unmanage(buffer);
 | 
| -    }
 | 
| -  } else if (token) {
 | 
| +  if (token) {
 | 
|      if (helper_->HasTokenPassed(token))
 | 
|        buffer_tracker_->Free(buffer);
 | 
|      else
 | 
| @@ -4912,7 +4883,6 @@ void GLES2Implementation::BeginQueryEXT(GLenum target, GLuint id) {
 | 
|    switch (target) {
 | 
|      case GL_COMMANDS_ISSUED_CHROMIUM:
 | 
|      case GL_LATENCY_QUERY_CHROMIUM:
 | 
| -    case GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM:
 | 
|      case GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM:
 | 
|      case GL_GET_ERROR_QUERY_CHROMIUM:
 | 
|        break;
 | 
| @@ -5314,12 +5284,6 @@ void* GLES2Implementation::MapBufferCHROMIUM(GLuint target, GLenum access) {
 | 
|          return NULL;
 | 
|        }
 | 
|        break;
 | 
| -    case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM:
 | 
| -      if (access != GL_WRITE_ONLY) {
 | 
| -        SetGLError(GL_INVALID_ENUM, "glMapBufferCHROMIUM", "bad access mode");
 | 
| -        return NULL;
 | 
| -      }
 | 
| -      break;
 | 
|      default:
 | 
|        SetGLError(
 | 
|            GL_INVALID_ENUM, "glMapBufferCHROMIUM", "invalid target");
 | 
| @@ -5340,10 +5304,6 @@ void* GLES2Implementation::MapBufferCHROMIUM(GLuint target, GLenum access) {
 | 
|      return NULL;
 | 
|    }
 | 
|    // Here we wait for previous transfer operations to be finished.
 | 
| -  // TODO(hubbe): AsyncTex(Sub)Image2dCHROMIUM does not currently work
 | 
| -  // with this method of synchronization. Until this is fixed,
 | 
| -  // MapBufferCHROMIUM will not block even if the transfer is not ready
 | 
| -  // for these calls.
 | 
|    if (buffer->last_usage_token()) {
 | 
|      helper_->WaitForToken(buffer->last_usage_token());
 | 
|      buffer->set_last_usage_token(0);
 | 
| @@ -5380,207 +5340,6 @@ GLboolean GLES2Implementation::UnmapBufferCHROMIUM(GLuint target) {
 | 
|    return true;
 | 
|  }
 | 
|  
 | 
| -bool GLES2Implementation::EnsureAsyncUploadSync() {
 | 
| -  if (async_upload_sync_)
 | 
| -    return true;
 | 
| -
 | 
| -  int32 shm_id;
 | 
| -  unsigned int shm_offset;
 | 
| -  void* mem = mapped_memory_->Alloc(sizeof(AsyncUploadSync),
 | 
| -                                    &shm_id,
 | 
| -                                    &shm_offset);
 | 
| -  if (!mem)
 | 
| -    return false;
 | 
| -
 | 
| -  async_upload_sync_shm_id_ = shm_id;
 | 
| -  async_upload_sync_shm_offset_ = shm_offset;
 | 
| -  async_upload_sync_ = static_cast<AsyncUploadSync*>(mem);
 | 
| -  async_upload_sync_->Reset();
 | 
| -
 | 
| -  return true;
 | 
| -}
 | 
| -
 | 
| -uint32 GLES2Implementation::NextAsyncUploadToken() {
 | 
| -  async_upload_token_++;
 | 
| -  if (async_upload_token_ == 0)
 | 
| -    async_upload_token_++;
 | 
| -  return async_upload_token_;
 | 
| -}
 | 
| -
 | 
| -void GLES2Implementation::PollAsyncUploads() {
 | 
| -  if (!async_upload_sync_)
 | 
| -    return;
 | 
| -
 | 
| -  if (helper_->IsContextLost()) {
 | 
| -    DetachedAsyncUploadMemoryList::iterator it =
 | 
| -        detached_async_upload_memory_.begin();
 | 
| -    while (it != detached_async_upload_memory_.end()) {
 | 
| -      mapped_memory_->Free(it->first);
 | 
| -      it = detached_async_upload_memory_.erase(it);
 | 
| -    }
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  DetachedAsyncUploadMemoryList::iterator it =
 | 
| -      detached_async_upload_memory_.begin();
 | 
| -  while (it != detached_async_upload_memory_.end()) {
 | 
| -    if (HasAsyncUploadTokenPassed(it->second)) {
 | 
| -      mapped_memory_->Free(it->first);
 | 
| -      it = detached_async_upload_memory_.erase(it);
 | 
| -    } else {
 | 
| -      break;
 | 
| -    }
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void GLES2Implementation::FreeAllAsyncUploadBuffers() {
 | 
| -  // Free all completed unmanaged async uploads buffers.
 | 
| -  PollAsyncUploads();
 | 
| -
 | 
| -  // Synchronously free rest of the unmanaged async upload buffers.
 | 
| -  if (!detached_async_upload_memory_.empty()) {
 | 
| -    WaitAllAsyncTexImage2DCHROMIUMHelper();
 | 
| -    WaitForCmd();
 | 
| -    PollAsyncUploads();
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void GLES2Implementation::AsyncTexImage2DCHROMIUM(
 | 
| -    GLenum target, GLint level, GLenum internalformat, GLsizei width,
 | 
| -    GLsizei height, GLint border, GLenum format, GLenum type,
 | 
| -    const void* pixels) {
 | 
| -  GPU_CLIENT_SINGLE_THREAD_CHECK();
 | 
| -  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexImage2D("
 | 
| -      << GLES2Util::GetStringTextureTarget(target) << ", "
 | 
| -      << level << ", "
 | 
| -      << GLES2Util::GetStringTextureInternalFormat(internalformat) << ", "
 | 
| -      << width << ", " << height << ", " << border << ", "
 | 
| -      << GLES2Util::GetStringTextureFormat(format) << ", "
 | 
| -      << GLES2Util::GetStringPixelType(type) << ", "
 | 
| -      << static_cast<const void*>(pixels) << ")");
 | 
| -  if (level < 0 || height < 0 || width < 0) {
 | 
| -    SetGLError(GL_INVALID_VALUE, "glTexImage2D", "dimension < 0");
 | 
| -    return;
 | 
| -  }
 | 
| -  if (border != 0) {
 | 
| -    SetGLError(GL_INVALID_VALUE, "glTexImage2D", "border != 0");
 | 
| -    return;
 | 
| -  }
 | 
| -  uint32 size;
 | 
| -  uint32 unpadded_row_size;
 | 
| -  uint32 padded_row_size;
 | 
| -  if (!GLES2Util::ComputeImageDataSizes(
 | 
| -          width, height, 1, format, type, unpack_alignment_, &size,
 | 
| -          &unpadded_row_size, &padded_row_size)) {
 | 
| -    SetGLError(GL_INVALID_VALUE, "glTexImage2D", "image size too large");
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  // If there's no data/buffer just issue the AsyncTexImage2D
 | 
| -  if (!pixels && !bound_pixel_unpack_transfer_buffer_id_) {
 | 
| -    helper_->AsyncTexImage2DCHROMIUM(
 | 
| -       target, level, internalformat, width, height, format, type,
 | 
| -       0, 0, 0, 0, 0);
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  if (!EnsureAsyncUploadSync()) {
 | 
| -    SetGLError(GL_OUT_OF_MEMORY, "glTexImage2D", "out of memory");
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  // Otherwise, async uploads require a transfer buffer to be bound.
 | 
| -  // TODO(hubbe): Make MapBufferCHROMIUM block if someone tries to re-use
 | 
| -  // the buffer before the transfer is finished. (Currently such
 | 
| -  // synchronization has to be handled manually.)
 | 
| -  GLuint offset = ToGLuint(pixels);
 | 
| -  BufferTracker::Buffer* buffer = GetBoundPixelUnpackTransferBufferIfValid(
 | 
| -      bound_pixel_unpack_transfer_buffer_id_,
 | 
| -      "glAsyncTexImage2DCHROMIUM", offset, size);
 | 
| -  if (buffer && buffer->shm_id() != -1) {
 | 
| -    uint32 async_token = NextAsyncUploadToken();
 | 
| -    buffer->set_last_async_upload_token(async_token);
 | 
| -    helper_->AsyncTexImage2DCHROMIUM(
 | 
| -        target, level, internalformat, width, height, format, type,
 | 
| -        buffer->shm_id(), buffer->shm_offset() + offset,
 | 
| -        async_token,
 | 
| -        async_upload_sync_shm_id_, async_upload_sync_shm_offset_);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void GLES2Implementation::AsyncTexSubImage2DCHROMIUM(
 | 
| -    GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
 | 
| -    GLsizei height, GLenum format, GLenum type, const void* pixels) {
 | 
| -  GPU_CLIENT_SINGLE_THREAD_CHECK();
 | 
| -  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glAsyncTexSubImage2DCHROMIUM("
 | 
| -      << GLES2Util::GetStringTextureTarget(target) << ", "
 | 
| -      << level << ", "
 | 
| -      << xoffset << ", " << yoffset << ", "
 | 
| -      << width << ", " << height << ", "
 | 
| -      << GLES2Util::GetStringTextureFormat(format) << ", "
 | 
| -      << GLES2Util::GetStringPixelType(type) << ", "
 | 
| -      << static_cast<const void*>(pixels) << ")");
 | 
| -  if (level < 0 || height < 0 || width < 0) {
 | 
| -    SetGLError(
 | 
| -        GL_INVALID_VALUE, "glAsyncTexSubImage2DCHROMIUM", "dimension < 0");
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  uint32 size;
 | 
| -  uint32 unpadded_row_size;
 | 
| -  uint32 padded_row_size;
 | 
| -  if (!GLES2Util::ComputeImageDataSizes(
 | 
| -        width, height, 1, format, type, unpack_alignment_, &size,
 | 
| -        &unpadded_row_size, &padded_row_size)) {
 | 
| -    SetGLError(
 | 
| -        GL_INVALID_VALUE, "glAsyncTexSubImage2DCHROMIUM", "size to large");
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  if (!EnsureAsyncUploadSync()) {
 | 
| -    SetGLError(GL_OUT_OF_MEMORY, "glTexImage2D", "out of memory");
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  // Async uploads require a transfer buffer to be bound.
 | 
| -  // TODO(hubbe): Make MapBufferCHROMIUM block if someone tries to re-use
 | 
| -  // the buffer before the transfer is finished. (Currently such
 | 
| -  // synchronization has to be handled manually.)
 | 
| -  GLuint offset = ToGLuint(pixels);
 | 
| -  BufferTracker::Buffer* buffer = GetBoundPixelUnpackTransferBufferIfValid(
 | 
| -      bound_pixel_unpack_transfer_buffer_id_,
 | 
| -      "glAsyncTexSubImage2DCHROMIUM", offset, size);
 | 
| -  if (buffer && buffer->shm_id() != -1) {
 | 
| -    uint32 async_token = NextAsyncUploadToken();
 | 
| -    buffer->set_last_async_upload_token(async_token);
 | 
| -    helper_->AsyncTexSubImage2DCHROMIUM(
 | 
| -        target, level, xoffset, yoffset, width, height, format, type,
 | 
| -        buffer->shm_id(), buffer->shm_offset() + offset,
 | 
| -        async_token,
 | 
| -        async_upload_sync_shm_id_, async_upload_sync_shm_offset_);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void GLES2Implementation::WaitAsyncTexImage2DCHROMIUM(GLenum target) {
 | 
| -  GPU_CLIENT_SINGLE_THREAD_CHECK();
 | 
| -  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glWaitAsyncTexImage2DCHROMIUM("
 | 
| -      << GLES2Util::GetStringTextureTarget(target) << ")");
 | 
| -  helper_->WaitAsyncTexImage2DCHROMIUM(target);
 | 
| -  CheckGLError();
 | 
| -}
 | 
| -
 | 
| -void GLES2Implementation::WaitAllAsyncTexImage2DCHROMIUMHelper() {
 | 
| -  helper_->WaitAllAsyncTexImage2DCHROMIUM();
 | 
| -}
 | 
| -
 | 
| -void GLES2Implementation::WaitAllAsyncTexImage2DCHROMIUM() {
 | 
| -  GPU_CLIENT_SINGLE_THREAD_CHECK();
 | 
| -  GPU_CLIENT_LOG("[" << GetLogPrefix()
 | 
| -      << "] glWaitAllAsyncTexImage2DCHROMIUM()");
 | 
| -  WaitAllAsyncTexImage2DCHROMIUMHelper();
 | 
| -  CheckGLError();
 | 
| -}
 | 
| -
 | 
|  GLuint GLES2Implementation::InsertSyncPointCHROMIUM() {
 | 
|    GPU_CLIENT_SINGLE_THREAD_CHECK();
 | 
|    GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glInsertSyncPointCHROMIUM");
 | 
| 
 |