blob: 5d0d626f2b9d763908dc5af0bf786f5834eb39c7 [file] [log] [blame]
// 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 "mojo/services/gles2/command_buffer_impl.h"
#include "base/message_loop/message_loop.h"
#include "mojo/services/gles2/command_buffer_driver.h"
namespace mojo {
namespace {
void DestroyDriver(scoped_ptr<CommandBufferDriver> driver) {
// Just let ~scoped_ptr run.
}
void RunCallback(const Callback<void()>& callback) {
callback.Run();
}
}
CommandBufferImpl::CommandBufferImpl(
InterfaceRequest<CommandBuffer> request,
scoped_refptr<base::SingleThreadTaskRunner> control_task_runner,
scoped_ptr<CommandBufferDriver> driver)
: driver_task_runner_(base::MessageLoop::current()->task_runner()),
driver_(driver.Pass()),
binding_(this),
weak_factory_(this) {
driver_->SetContextLostCallback(control_task_runner,
base::Bind(&CommandBufferImpl::OnContextLost,
weak_factory_.GetWeakPtr()));
control_task_runner->PostTask(
FROM_HERE, base::Bind(&CommandBufferImpl::BindToRequest,
base::Unretained(this), base::Passed(&request)));
}
CommandBufferImpl::~CommandBufferImpl() {
binding_.client()->DidDestroy();
driver_task_runner_->PostTask(
FROM_HERE, base::Bind(&DestroyDriver, base::Passed(&driver_)));
}
void CommandBufferImpl::Initialize(CommandBufferSyncClientPtr sync_client,
ScopedSharedBufferHandle shared_state) {
driver_task_runner_->PostTask(
FROM_HERE,
base::Bind(&CommandBufferDriver::Initialize,
base::Unretained(driver_.get()), base::Passed(&sync_client),
base::Passed(&shared_state)));
}
void CommandBufferImpl::SetGetBuffer(int32_t buffer) {
driver_task_runner_->PostTask(
FROM_HERE, base::Bind(&CommandBufferDriver::SetGetBuffer,
base::Unretained(driver_.get()), buffer));
}
void CommandBufferImpl::Flush(int32_t put_offset) {
driver_task_runner_->PostTask(
FROM_HERE, base::Bind(&CommandBufferDriver::Flush,
base::Unretained(driver_.get()), put_offset));
}
void CommandBufferImpl::MakeProgress(int32_t last_get_offset) {
driver_task_runner_->PostTask(
FROM_HERE, base::Bind(&CommandBufferDriver::MakeProgress,
base::Unretained(driver_.get()), last_get_offset));
}
void CommandBufferImpl::RegisterTransferBuffer(
int32_t id,
ScopedSharedBufferHandle transfer_buffer,
uint32_t size) {
driver_task_runner_->PostTask(
FROM_HERE, base::Bind(&CommandBufferDriver::RegisterTransferBuffer,
base::Unretained(driver_.get()), id,
base::Passed(&transfer_buffer), size));
}
void CommandBufferImpl::DestroyTransferBuffer(int32_t id) {
driver_task_runner_->PostTask(
FROM_HERE, base::Bind(&CommandBufferDriver::DestroyTransferBuffer,
base::Unretained(driver_.get()), id));
}
void CommandBufferImpl::Echo(const Callback<void()>& callback) {
driver_task_runner_->PostTaskAndReply(FROM_HERE, base::Bind(&base::DoNothing),
base::Bind(&RunCallback, callback));
}
void CommandBufferImpl::BindToRequest(InterfaceRequest<CommandBuffer> request) {
binding_.Bind(request.Pass());
}
void CommandBufferImpl::OnContextLost(int32_t reason) {
binding_.client()->LostContext(reason);
}
} // namespace mojo