Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(167)

Side by Side Diff: ppapi/proxy/ppapi_command_buffer_proxy.cc

Issue 2550583002: gpu: Thread-safe command buffer state lookup. (Closed)
Patch Set: jbauman's review Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ppapi/proxy/ppapi_command_buffer_proxy.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
44 gpu::CommandBuffer::State PpapiCommandBufferProxy::GetLastState() { 43 gpu::CommandBuffer::State PpapiCommandBufferProxy::GetLastState() {
45 ppapi::ProxyLock::AssertAcquiredDebugOnly(); 44 ppapi::ProxyLock::AssertAcquiredDebugOnly();
45 TryUpdateState();
46 return last_state_; 46 return last_state_;
47 } 47 }
48 48
49 int32_t PpapiCommandBufferProxy::GetLastToken() {
50 ppapi::ProxyLock::AssertAcquiredDebugOnly();
51 TryUpdateState();
52 return last_state_.token;
53 }
54
55 void PpapiCommandBufferProxy::Flush(int32_t put_offset) { 49 void PpapiCommandBufferProxy::Flush(int32_t put_offset) {
56 if (last_state_.error != gpu::error::kNoError) 50 if (last_state_.error != gpu::error::kNoError)
57 return; 51 return;
58 52
59 OrderingBarrier(put_offset); 53 OrderingBarrier(put_offset);
60 FlushInternal(); 54 FlushInternal();
61 } 55 }
62 56
63 void PpapiCommandBufferProxy::OrderingBarrier(int32_t put_offset) { 57 void PpapiCommandBufferProxy::OrderingBarrier(int32_t put_offset) {
64 if (last_state_.error != gpu::error::kNoError) 58 if (last_state_.error != gpu::error::kNoError)
65 return; 59 return;
66 60
67 if (flush_info_->flush_pending && flush_info_->resource != resource_) { 61 if (flush_info_->flush_pending && flush_info_->resource != resource_) {
68 FlushInternal(); 62 FlushInternal();
69 } 63 }
70 64
71 flush_info_->flush_pending = true; 65 flush_info_->flush_pending = true;
72 flush_info_->resource = resource_; 66 flush_info_->resource = resource_;
73 flush_info_->put_offset = put_offset; 67 flush_info_->put_offset = put_offset;
74 pending_fence_sync_release_ = next_fence_sync_release_ - 1; 68 pending_fence_sync_release_ = next_fence_sync_release_ - 1;
75 } 69 }
76 70
77 void PpapiCommandBufferProxy::WaitForTokenInRange(int32_t start, int32_t end) { 71 gpu::CommandBuffer::State PpapiCommandBufferProxy::WaitForTokenInRange(
72 int32_t start,
73 int32_t end) {
78 TryUpdateState(); 74 TryUpdateState();
79 if (!InRange(start, end, last_state_.token) && 75 if (!InRange(start, end, last_state_.token) &&
80 last_state_.error == gpu::error::kNoError) { 76 last_state_.error == gpu::error::kNoError) {
81 bool success = false; 77 bool success = false;
82 gpu::CommandBuffer::State state; 78 gpu::CommandBuffer::State state;
83 if (Send(new PpapiHostMsg_PPBGraphics3D_WaitForTokenInRange( 79 if (Send(new PpapiHostMsg_PPBGraphics3D_WaitForTokenInRange(
84 ppapi::API_ID_PPB_GRAPHICS_3D, 80 ppapi::API_ID_PPB_GRAPHICS_3D, resource_, start, end, &state,
85 resource_, 81 &success)))
86 start,
87 end,
88 &state,
89 &success)))
90 UpdateState(state, success); 82 UpdateState(state, success);
91 } 83 }
92 DCHECK(InRange(start, end, last_state_.token) || 84 DCHECK(InRange(start, end, last_state_.token) ||
93 last_state_.error != gpu::error::kNoError); 85 last_state_.error != gpu::error::kNoError);
86 return last_state_;
94 } 87 }
95 88
96 void PpapiCommandBufferProxy::WaitForGetOffsetInRange(int32_t start, 89 gpu::CommandBuffer::State PpapiCommandBufferProxy::WaitForGetOffsetInRange(
97 int32_t end) { 90 int32_t start,
91 int32_t end) {
98 TryUpdateState(); 92 TryUpdateState();
99 if (!InRange(start, end, last_state_.get_offset) && 93 if (!InRange(start, end, last_state_.get_offset) &&
100 last_state_.error == gpu::error::kNoError) { 94 last_state_.error == gpu::error::kNoError) {
101 bool success = false; 95 bool success = false;
102 gpu::CommandBuffer::State state; 96 gpu::CommandBuffer::State state;
103 if (Send(new PpapiHostMsg_PPBGraphics3D_WaitForGetOffsetInRange( 97 if (Send(new PpapiHostMsg_PPBGraphics3D_WaitForGetOffsetInRange(
104 ppapi::API_ID_PPB_GRAPHICS_3D, 98 ppapi::API_ID_PPB_GRAPHICS_3D, resource_, start, end, &state,
105 resource_, 99 &success)))
106 start,
107 end,
108 &state,
109 &success)))
110 UpdateState(state, success); 100 UpdateState(state, success);
111 } 101 }
112 DCHECK(InRange(start, end, last_state_.get_offset) || 102 DCHECK(InRange(start, end, last_state_.get_offset) ||
113 last_state_.error != gpu::error::kNoError); 103 last_state_.error != gpu::error::kNoError);
104 return last_state_;
114 } 105 }
115 106
116 void PpapiCommandBufferProxy::SetGetBuffer(int32_t transfer_buffer_id) { 107 void PpapiCommandBufferProxy::SetGetBuffer(int32_t transfer_buffer_id) {
117 if (last_state_.error == gpu::error::kNoError) { 108 if (last_state_.error == gpu::error::kNoError) {
118 Send(new PpapiHostMsg_PPBGraphics3D_SetGetBuffer( 109 Send(new PpapiHostMsg_PPBGraphics3D_SetGetBuffer(
119 ppapi::API_ID_PPB_GRAPHICS_3D, resource_, transfer_buffer_id)); 110 ppapi::API_ID_PPB_GRAPHICS_3D, resource_, transfer_buffer_id));
120 } 111 }
121 } 112 }
122 113
123 scoped_refptr<gpu::Buffer> PpapiCommandBufferProxy::CreateTransferBuffer( 114 scoped_refptr<gpu::Buffer> PpapiCommandBufferProxy::CreateTransferBuffer(
124 size_t size, 115 size_t size,
125 int32_t* id) { 116 int32_t* id) {
126 *id = -1; 117 *id = -1;
127 118
128 if (last_state_.error != gpu::error::kNoError) 119 if (last_state_.error != gpu::error::kNoError)
129 return NULL; 120 return NULL;
130 121
131 // Assuming we are in the renderer process, the service is responsible for 122 // Assuming we are in the renderer process, the service is responsible for
132 // duplicating the handle. This might not be true for NaCl. 123 // duplicating the handle. This might not be true for NaCl.
133 ppapi::proxy::SerializedHandle handle( 124 ppapi::proxy::SerializedHandle handle(
134 ppapi::proxy::SerializedHandle::SHARED_MEMORY); 125 ppapi::proxy::SerializedHandle::SHARED_MEMORY);
135 if (!Send(new PpapiHostMsg_PPBGraphics3D_CreateTransferBuffer( 126 if (!Send(new PpapiHostMsg_PPBGraphics3D_CreateTransferBuffer(
136 ppapi::API_ID_PPB_GRAPHICS_3D, resource_, 127 ppapi::API_ID_PPB_GRAPHICS_3D, resource_,
137 base::checked_cast<uint32_t>(size), id, &handle))) { 128 base::checked_cast<uint32_t>(size), id, &handle))) {
138 if (last_state_.error == gpu::error::kNoError) 129 if (last_state_.error == gpu::error::kNoError)
139 last_state_.error = gpu::error::kLostContext; 130 last_state_.error = gpu::error::kLostContext;
140 return NULL; 131 return NULL;
141 } 132 }
142 133
143 if (*id <= 0 || !handle.is_shmem()) { 134 if (*id <= 0 || !handle.is_shmem()) {
144 if (last_state_.error == gpu::error::kNoError) 135 if (last_state_.error == gpu::error::kNoError)
145 last_state_.error = gpu::error::kOutOfBounds; 136 last_state_.error = gpu::error::kOutOfBounds;
146 return NULL; 137 return NULL;
147 } 138 }
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 if (!IsFenceSyncFlushed(release)) 197 if (!IsFenceSyncFlushed(release))
207 return false; 198 return false;
208 199
209 if (release <= validated_fence_sync_release_) 200 if (release <= validated_fence_sync_release_)
210 return true; 201 return true;
211 202
212 EnsureWorkVisible(); 203 EnsureWorkVisible();
213 return release <= validated_fence_sync_release_; 204 return release <= validated_fence_sync_release_;
214 } 205 }
215 206
207 bool PpapiCommandBufferProxy::IsFenceSyncReleased(uint64_t release) {
208 NOTIMPLEMENTED();
209 return false;
210 }
211
216 void PpapiCommandBufferProxy::SignalSyncToken(const gpu::SyncToken& sync_token, 212 void PpapiCommandBufferProxy::SignalSyncToken(const gpu::SyncToken& sync_token,
217 const base::Closure& callback) { 213 const base::Closure& callback) {
218 NOTIMPLEMENTED(); 214 NOTIMPLEMENTED();
219 } 215 }
220 216
221 bool PpapiCommandBufferProxy::CanWaitUnverifiedSyncToken( 217 bool PpapiCommandBufferProxy::CanWaitUnverifiedSyncToken(
222 const gpu::SyncToken* sync_token) { 218 const gpu::SyncToken* sync_token) {
223 return false; 219 return false;
224 } 220 }
225 221
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 message->set_unblock(true); 313 message->set_unblock(true);
318 Send(message); 314 Send(message);
319 315
320 flush_info_->flush_pending = false; 316 flush_info_->flush_pending = false;
321 flush_info_->resource.SetHostResource(0, 0); 317 flush_info_->resource.SetHostResource(0, 0);
322 flushed_fence_sync_release_ = pending_fence_sync_release_; 318 flushed_fence_sync_release_ = pending_fence_sync_release_;
323 } 319 }
324 320
325 } // namespace proxy 321 } // namespace proxy
326 } // namespace ppapi 322 } // namespace ppapi
OLDNEW
« no previous file with comments | « ppapi/proxy/ppapi_command_buffer_proxy.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698