| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "mojo/services/gles2/command_buffer_impl.h" | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/message_loop/message_loop.h" | |
| 9 #include "gpu/command_buffer/service/sync_point_manager.h" | |
| 10 #include "mojo/services/gles2/command_buffer_driver.h" | |
| 11 | |
| 12 namespace mojo { | |
| 13 namespace { | |
| 14 void DestroyDriver(scoped_ptr<CommandBufferDriver> driver) { | |
| 15 // Just let ~scoped_ptr run. | |
| 16 } | |
| 17 | |
| 18 void RunCallback(const Callback<void()>& callback) { | |
| 19 callback.Run(); | |
| 20 } | |
| 21 | |
| 22 class CommandBufferDriverClientImpl : public CommandBufferDriver::Client { | |
| 23 public: | |
| 24 CommandBufferDriverClientImpl( | |
| 25 base::WeakPtr<CommandBufferImpl> command_buffer, | |
| 26 scoped_refptr<base::SingleThreadTaskRunner> control_task_runner) | |
| 27 : command_buffer_(command_buffer), | |
| 28 control_task_runner_(control_task_runner) {} | |
| 29 | |
| 30 private: | |
| 31 void DidDestroy() override { delete this; } | |
| 32 | |
| 33 void UpdateVSyncParameters(base::TimeTicks timebase, | |
| 34 base::TimeDelta interval) override { | |
| 35 control_task_runner_->PostTask( | |
| 36 FROM_HERE, base::Bind(&CommandBufferImpl::UpdateVSyncParameters, | |
| 37 command_buffer_, timebase, interval)); | |
| 38 } | |
| 39 | |
| 40 void LostContext(int32_t lost_reason) override { | |
| 41 control_task_runner_->PostTask( | |
| 42 FROM_HERE, base::Bind(&CommandBufferImpl::LostContext, command_buffer_, | |
| 43 lost_reason)); | |
| 44 } | |
| 45 | |
| 46 base::WeakPtr<CommandBufferImpl> command_buffer_; | |
| 47 scoped_refptr<base::SingleThreadTaskRunner> control_task_runner_; | |
| 48 }; | |
| 49 } | |
| 50 | |
| 51 CommandBufferImpl::CommandBufferImpl( | |
| 52 InterfaceRequest<CommandBuffer> request, | |
| 53 ViewportParameterListenerPtr listener, | |
| 54 scoped_refptr<base::SingleThreadTaskRunner> control_task_runner, | |
| 55 gpu::SyncPointManager* sync_point_manager, | |
| 56 scoped_ptr<CommandBufferDriver> driver) | |
| 57 : sync_point_manager_(sync_point_manager), | |
| 58 driver_task_runner_(base::MessageLoop::current()->task_runner()), | |
| 59 driver_(driver.Pass()), | |
| 60 viewport_parameter_listener_(listener.Pass()), | |
| 61 binding_(this), | |
| 62 weak_factory_(this) { | |
| 63 driver_->set_client(new CommandBufferDriverClientImpl( | |
| 64 weak_factory_.GetWeakPtr(), control_task_runner)); | |
| 65 | |
| 66 control_task_runner->PostTask( | |
| 67 FROM_HERE, base::Bind(&CommandBufferImpl::BindToRequest, | |
| 68 base::Unretained(this), base::Passed(&request))); | |
| 69 } | |
| 70 | |
| 71 CommandBufferImpl::~CommandBufferImpl() { | |
| 72 binding_.client()->DidDestroy(); | |
| 73 driver_task_runner_->PostTask( | |
| 74 FROM_HERE, base::Bind(&DestroyDriver, base::Passed(&driver_))); | |
| 75 } | |
| 76 | |
| 77 void CommandBufferImpl::Initialize( | |
| 78 CommandBufferSyncClientPtr sync_client, | |
| 79 CommandBufferSyncPointClientPtr sync_point_client, | |
| 80 ScopedSharedBufferHandle shared_state) { | |
| 81 sync_point_client_ = sync_point_client.Pass(); | |
| 82 driver_task_runner_->PostTask( | |
| 83 FROM_HERE, | |
| 84 base::Bind(&CommandBufferDriver::Initialize, | |
| 85 base::Unretained(driver_.get()), base::Passed(&sync_client), | |
| 86 base::Passed(&shared_state))); | |
| 87 } | |
| 88 | |
| 89 void CommandBufferImpl::SetGetBuffer(int32_t buffer) { | |
| 90 driver_task_runner_->PostTask( | |
| 91 FROM_HERE, base::Bind(&CommandBufferDriver::SetGetBuffer, | |
| 92 base::Unretained(driver_.get()), buffer)); | |
| 93 } | |
| 94 | |
| 95 void CommandBufferImpl::Flush(int32_t put_offset) { | |
| 96 driver_task_runner_->PostTask( | |
| 97 FROM_HERE, base::Bind(&CommandBufferDriver::Flush, | |
| 98 base::Unretained(driver_.get()), put_offset)); | |
| 99 } | |
| 100 | |
| 101 void CommandBufferImpl::MakeProgress(int32_t last_get_offset) { | |
| 102 driver_task_runner_->PostTask( | |
| 103 FROM_HERE, base::Bind(&CommandBufferDriver::MakeProgress, | |
| 104 base::Unretained(driver_.get()), last_get_offset)); | |
| 105 } | |
| 106 | |
| 107 void CommandBufferImpl::RegisterTransferBuffer( | |
| 108 int32_t id, | |
| 109 ScopedSharedBufferHandle transfer_buffer, | |
| 110 uint32_t size) { | |
| 111 driver_task_runner_->PostTask( | |
| 112 FROM_HERE, base::Bind(&CommandBufferDriver::RegisterTransferBuffer, | |
| 113 base::Unretained(driver_.get()), id, | |
| 114 base::Passed(&transfer_buffer), size)); | |
| 115 } | |
| 116 | |
| 117 void CommandBufferImpl::DestroyTransferBuffer(int32_t id) { | |
| 118 driver_task_runner_->PostTask( | |
| 119 FROM_HERE, base::Bind(&CommandBufferDriver::DestroyTransferBuffer, | |
| 120 base::Unretained(driver_.get()), id)); | |
| 121 } | |
| 122 | |
| 123 void CommandBufferImpl::InsertSyncPoint(bool retire) { | |
| 124 uint32_t sync_point = sync_point_manager_->GenerateSyncPoint(); | |
| 125 sync_point_client_->DidInsertSyncPoint(sync_point); | |
| 126 if (retire) { | |
| 127 driver_task_runner_->PostTask( | |
| 128 FROM_HERE, base::Bind(&gpu::SyncPointManager::RetireSyncPoint, | |
| 129 sync_point_manager_, sync_point)); | |
| 130 } | |
| 131 } | |
| 132 | |
| 133 void CommandBufferImpl::RetireSyncPoint(uint32_t sync_point) { | |
| 134 driver_task_runner_->PostTask( | |
| 135 FROM_HERE, base::Bind(&gpu::SyncPointManager::RetireSyncPoint, | |
| 136 sync_point_manager_, sync_point)); | |
| 137 } | |
| 138 | |
| 139 void CommandBufferImpl::Echo(const Callback<void()>& callback) { | |
| 140 driver_task_runner_->PostTaskAndReply(FROM_HERE, base::Bind(&base::DoNothing), | |
| 141 base::Bind(&RunCallback, callback)); | |
| 142 } | |
| 143 | |
| 144 void CommandBufferImpl::BindToRequest(InterfaceRequest<CommandBuffer> request) { | |
| 145 binding_.Bind(request.Pass()); | |
| 146 } | |
| 147 | |
| 148 void CommandBufferImpl::LostContext(int32_t reason) { | |
| 149 binding_.client()->LostContext(reason); | |
| 150 } | |
| 151 | |
| 152 void CommandBufferImpl::UpdateVSyncParameters(base::TimeTicks timebase, | |
| 153 base::TimeDelta interval) { | |
| 154 if (!viewport_parameter_listener_) | |
| 155 return; | |
| 156 viewport_parameter_listener_->OnVSyncParametersUpdated( | |
| 157 timebase.ToInternalValue(), interval.ToInternalValue()); | |
| 158 } | |
| 159 | |
| 160 } // namespace mojo | |
| OLD | NEW |