2 * Copyright 2019 Google LLC
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #include "src/gpu/ganesh/GrClientMappedBufferManager.h"
12 GrClientMappedBufferManager::GrClientMappedBufferManager(
13 GrDirectContext::DirectContextID owningDirectContext)
14 : fFinishedBufferInbox(owningDirectContext) {
17 GrClientMappedBufferManager::~GrClientMappedBufferManager() {
20 // If we're going down before we got the messages we go ahead and unmap all the buffers.
21 // It's up to the client to ensure that they aren't being accessed on another thread while
22 // this is happening (or afterwards on any thread).
23 for (auto& b : fClientHeldBuffers) {
29 void GrClientMappedBufferManager::insert(sk_sp<GrGpuBuffer> b) {
30 SkDEBUGCODE(auto end = fClientHeldBuffers.end());
31 SkASSERT(std::find(fClientHeldBuffers.begin(), end, b) == end);
32 fClientHeldBuffers.emplace_front(std::move(b));
35 void GrClientMappedBufferManager::process() {
36 SkSTArray<4, BufferFinishedMessage> messages;
37 fFinishedBufferInbox.poll(&messages);
39 for (auto& m : messages) {
40 this->remove(m.fBuffer);
46 void GrClientMappedBufferManager::abandon() {
48 fClientHeldBuffers.clear();
51 void GrClientMappedBufferManager::remove(const sk_sp<GrGpuBuffer>& b) {
52 // There is no convenient remove only the first element that equals a value functionality in
54 auto prev = fClientHeldBuffers.before_begin();
55 auto end = fClientHeldBuffers.end();
56 SkASSERT(std::find(fClientHeldBuffers.begin(), end, b) != end);
57 for (auto cur = fClientHeldBuffers.begin(); cur != end; prev = cur++) {
59 fClientHeldBuffers.erase_after(prev);
63 SkASSERT(std::find(fClientHeldBuffers.begin(), end, b) == end);
66 //////////////////////////////////////////////////////////////////////////////
68 DECLARE_SKMESSAGEBUS_MESSAGE(GrClientMappedBufferManager::BufferFinishedMessage,
69 GrDirectContext::DirectContextID,
72 bool SkShouldPostMessageToBus(const GrClientMappedBufferManager::BufferFinishedMessage& m,
73 GrDirectContext::DirectContextID potentialRecipient) {
74 return m.fIntendedRecipient == potentialRecipient;