| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ppapi/proxy/ppapi_command_buffer_proxy.h" | 5 #include "ppapi/proxy/ppapi_command_buffer_proxy.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/numerics/safe_conversions.h" | 9 #include "base/numerics/safe_conversions.h" |
| 10 #include "ppapi/proxy/ppapi_messages.h" | 10 #include "ppapi/proxy/ppapi_messages.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 const SerializedHandle& shared_state, | 22 const SerializedHandle& shared_state, |
| 23 gpu::CommandBufferId command_buffer_id) | 23 gpu::CommandBufferId command_buffer_id) |
| 24 : command_buffer_id_(command_buffer_id), | 24 : command_buffer_id_(command_buffer_id), |
| 25 capabilities_(capabilities), | 25 capabilities_(capabilities), |
| 26 resource_(resource), | 26 resource_(resource), |
| 27 dispatcher_(dispatcher), | 27 dispatcher_(dispatcher), |
| 28 next_fence_sync_release_(1), | 28 next_fence_sync_release_(1), |
| 29 pending_fence_sync_release_(0), | 29 pending_fence_sync_release_(0), |
| 30 flushed_fence_sync_release_(0), | 30 flushed_fence_sync_release_(0), |
| 31 validated_fence_sync_release_(0) { | 31 validated_fence_sync_release_(0) { |
| 32 shared_state_shm_.reset( | 32 shared_state_shm_.reset(new base::SharedMemory(shared_state.shmem(), false)); |
| 33 new base::SharedMemory(shared_state.shmem(), false)); | |
| 34 shared_state_shm_->Map(shared_state.size()); | 33 shared_state_shm_->Map(shared_state.size()); |
| 35 InstanceData* data = dispatcher->GetInstanceData(resource.instance()); | 34 InstanceData* data = dispatcher->GetInstanceData(resource.instance()); |
| 36 flush_info_ = &data->flush_info_; | 35 flush_info_ = &data->flush_info_; |
| 37 } | 36 } |
| 38 | 37 |
| 39 PpapiCommandBufferProxy::~PpapiCommandBufferProxy() { | 38 PpapiCommandBufferProxy::~PpapiCommandBufferProxy() { |
| 40 // gpu::Buffers are no longer referenced, allowing shared memory objects to be | 39 // gpu::Buffers are no longer referenced, allowing shared memory objects to be |
| 41 // deleted, closing the handle in this process. | 40 // deleted, closing the handle in this process. |
| 42 } | 41 } |
| 43 | 42 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 67 if (flush_info_->flush_pending && flush_info_->resource != resource_) { | 66 if (flush_info_->flush_pending && flush_info_->resource != resource_) { |
| 68 FlushInternal(); | 67 FlushInternal(); |
| 69 } | 68 } |
| 70 | 69 |
| 71 flush_info_->flush_pending = true; | 70 flush_info_->flush_pending = true; |
| 72 flush_info_->resource = resource_; | 71 flush_info_->resource = resource_; |
| 73 flush_info_->put_offset = put_offset; | 72 flush_info_->put_offset = put_offset; |
| 74 pending_fence_sync_release_ = next_fence_sync_release_ - 1; | 73 pending_fence_sync_release_ = next_fence_sync_release_ - 1; |
| 75 } | 74 } |
| 76 | 75 |
| 77 void PpapiCommandBufferProxy::WaitForTokenInRange(int32_t start, int32_t end) { | 76 gpu::CommandBuffer::State PpapiCommandBufferProxy::WaitForTokenInRange( |
| 77 int32_t start, |
| 78 int32_t end) { |
| 78 TryUpdateState(); | 79 TryUpdateState(); |
| 79 if (!InRange(start, end, last_state_.token) && | 80 if (!InRange(start, end, last_state_.token) && |
| 80 last_state_.error == gpu::error::kNoError) { | 81 last_state_.error == gpu::error::kNoError) { |
| 81 bool success = false; | 82 bool success = false; |
| 82 gpu::CommandBuffer::State state; | 83 gpu::CommandBuffer::State state; |
| 83 if (Send(new PpapiHostMsg_PPBGraphics3D_WaitForTokenInRange( | 84 if (Send(new PpapiHostMsg_PPBGraphics3D_WaitForTokenInRange( |
| 84 ppapi::API_ID_PPB_GRAPHICS_3D, | 85 ppapi::API_ID_PPB_GRAPHICS_3D, resource_, start, end, &state, |
| 85 resource_, | 86 &success))) |
| 86 start, | |
| 87 end, | |
| 88 &state, | |
| 89 &success))) | |
| 90 UpdateState(state, success); | 87 UpdateState(state, success); |
| 91 } | 88 } |
| 92 DCHECK(InRange(start, end, last_state_.token) || | 89 DCHECK(InRange(start, end, last_state_.token) || |
| 93 last_state_.error != gpu::error::kNoError); | 90 last_state_.error != gpu::error::kNoError); |
| 91 return last_state_; |
| 94 } | 92 } |
| 95 | 93 |
| 96 void PpapiCommandBufferProxy::WaitForGetOffsetInRange(int32_t start, | 94 gpu::CommandBuffer::State PpapiCommandBufferProxy::WaitForGetOffsetInRange( |
| 97 int32_t end) { | 95 int32_t start, |
| 96 int32_t end) { |
| 98 TryUpdateState(); | 97 TryUpdateState(); |
| 99 if (!InRange(start, end, last_state_.get_offset) && | 98 if (!InRange(start, end, last_state_.get_offset) && |
| 100 last_state_.error == gpu::error::kNoError) { | 99 last_state_.error == gpu::error::kNoError) { |
| 101 bool success = false; | 100 bool success = false; |
| 102 gpu::CommandBuffer::State state; | 101 gpu::CommandBuffer::State state; |
| 103 if (Send(new PpapiHostMsg_PPBGraphics3D_WaitForGetOffsetInRange( | 102 if (Send(new PpapiHostMsg_PPBGraphics3D_WaitForGetOffsetInRange( |
| 104 ppapi::API_ID_PPB_GRAPHICS_3D, | 103 ppapi::API_ID_PPB_GRAPHICS_3D, resource_, start, end, &state, |
| 105 resource_, | 104 &success))) |
| 106 start, | |
| 107 end, | |
| 108 &state, | |
| 109 &success))) | |
| 110 UpdateState(state, success); | 105 UpdateState(state, success); |
| 111 } | 106 } |
| 112 DCHECK(InRange(start, end, last_state_.get_offset) || | 107 DCHECK(InRange(start, end, last_state_.get_offset) || |
| 113 last_state_.error != gpu::error::kNoError); | 108 last_state_.error != gpu::error::kNoError); |
| 109 return last_state_; |
| 114 } | 110 } |
| 115 | 111 |
| 116 void PpapiCommandBufferProxy::SetGetBuffer(int32_t transfer_buffer_id) { | 112 void PpapiCommandBufferProxy::SetGetBuffer(int32_t transfer_buffer_id) { |
| 117 if (last_state_.error == gpu::error::kNoError) { | 113 if (last_state_.error == gpu::error::kNoError) { |
| 118 Send(new PpapiHostMsg_PPBGraphics3D_SetGetBuffer( | 114 Send(new PpapiHostMsg_PPBGraphics3D_SetGetBuffer( |
| 119 ppapi::API_ID_PPB_GRAPHICS_3D, resource_, transfer_buffer_id)); | 115 ppapi::API_ID_PPB_GRAPHICS_3D, resource_, transfer_buffer_id)); |
| 120 } | 116 } |
| 121 } | 117 } |
| 122 | 118 |
| 123 scoped_refptr<gpu::Buffer> PpapiCommandBufferProxy::CreateTransferBuffer( | 119 scoped_refptr<gpu::Buffer> PpapiCommandBufferProxy::CreateTransferBuffer( |
| 124 size_t size, | 120 size_t size, |
| 125 int32_t* id) { | 121 int32_t* id) { |
| 126 *id = -1; | 122 *id = -1; |
| 127 | 123 |
| 128 if (last_state_.error != gpu::error::kNoError) | 124 if (last_state_.error != gpu::error::kNoError) |
| 129 return NULL; | 125 return NULL; |
| 130 | 126 |
| 131 // Assuming we are in the renderer process, the service is responsible for | 127 // Assuming we are in the renderer process, the service is responsible for |
| 132 // duplicating the handle. This might not be true for NaCl. | 128 // duplicating the handle. This might not be true for NaCl. |
| 133 ppapi::proxy::SerializedHandle handle( | 129 ppapi::proxy::SerializedHandle handle( |
| 134 ppapi::proxy::SerializedHandle::SHARED_MEMORY); | 130 ppapi::proxy::SerializedHandle::SHARED_MEMORY); |
| 135 if (!Send(new PpapiHostMsg_PPBGraphics3D_CreateTransferBuffer( | 131 if (!Send(new PpapiHostMsg_PPBGraphics3D_CreateTransferBuffer( |
| 136 ppapi::API_ID_PPB_GRAPHICS_3D, resource_, | 132 ppapi::API_ID_PPB_GRAPHICS_3D, resource_, |
| 137 base::checked_cast<uint32_t>(size), id, &handle))) { | 133 base::checked_cast<uint32_t>(size), id, &handle))) { |
| 138 if (last_state_.error == gpu::error::kNoError) | 134 if (last_state_.error == gpu::error::kNoError) |
| 139 last_state_.error = gpu::error::kLostContext; | 135 last_state_.error = gpu::error::kLostContext; |
| 140 return NULL; | 136 return NULL; |
| 141 } | 137 } |
| 142 | 138 |
| 143 if (*id <= 0 || !handle.is_shmem()) { | 139 if (*id <= 0 || !handle.is_shmem()) { |
| 144 if (last_state_.error == gpu::error::kNoError) | 140 if (last_state_.error == gpu::error::kNoError) |
| 145 last_state_.error = gpu::error::kOutOfBounds; | 141 last_state_.error = gpu::error::kOutOfBounds; |
| 146 return NULL; | 142 return NULL; |
| 147 } | 143 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 if (!IsFenceSyncFlushed(release)) | 202 if (!IsFenceSyncFlushed(release)) |
| 207 return false; | 203 return false; |
| 208 | 204 |
| 209 if (release <= validated_fence_sync_release_) | 205 if (release <= validated_fence_sync_release_) |
| 210 return true; | 206 return true; |
| 211 | 207 |
| 212 EnsureWorkVisible(); | 208 EnsureWorkVisible(); |
| 213 return release <= validated_fence_sync_release_; | 209 return release <= validated_fence_sync_release_; |
| 214 } | 210 } |
| 215 | 211 |
| 212 bool PpapiCommandBufferProxy::IsFenceSyncReleased(uint64_t release) { |
| 213 NOTIMPLEMENTED(); |
| 214 return false; |
| 215 } |
| 216 |
| 216 void PpapiCommandBufferProxy::SignalSyncToken(const gpu::SyncToken& sync_token, | 217 void PpapiCommandBufferProxy::SignalSyncToken(const gpu::SyncToken& sync_token, |
| 217 const base::Closure& callback) { | 218 const base::Closure& callback) { |
| 218 NOTIMPLEMENTED(); | 219 NOTIMPLEMENTED(); |
| 219 } | 220 } |
| 220 | 221 |
| 221 bool PpapiCommandBufferProxy::CanWaitUnverifiedSyncToken( | 222 bool PpapiCommandBufferProxy::CanWaitUnverifiedSyncToken( |
| 222 const gpu::SyncToken* sync_token) { | 223 const gpu::SyncToken* sync_token) { |
| 223 return false; | 224 return false; |
| 224 } | 225 } |
| 225 | 226 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 message->set_unblock(true); | 318 message->set_unblock(true); |
| 318 Send(message); | 319 Send(message); |
| 319 | 320 |
| 320 flush_info_->flush_pending = false; | 321 flush_info_->flush_pending = false; |
| 321 flush_info_->resource.SetHostResource(0, 0); | 322 flush_info_->resource.SetHostResource(0, 0); |
| 322 flushed_fence_sync_release_ = pending_fence_sync_release_; | 323 flushed_fence_sync_release_ = pending_fence_sync_release_; |
| 323 } | 324 } |
| 324 | 325 |
| 325 } // namespace proxy | 326 } // namespace proxy |
| 326 } // namespace ppapi | 327 } // namespace ppapi |
| OLD | NEW |