// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef GPU_COMMAND_BUFFER_CLIENT_CLIENT_TRANSFER_CACHE_H_ #define GPU_COMMAND_BUFFER_CLIENT_CLIENT_TRANSFER_CACHE_H_ #include <map> #include <optional> #include "base/functional/callback.h" #include "base/memory/raw_ptr.h" #include "base/synchronization/lock.h" #include "gpu/command_buffer/client/client_discardable_manager.h" #include "gpu/command_buffer/client/gles2_impl_export.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "gpu/command_buffer/client/mapped_memory.h" #include "gpu/command_buffer/client/transfer_buffer.h" namespace gpu { class MappedMemoryManager; // ClientTransferCache allows for ClientTransferCacheEntries to be inserted // into the cache, which will send them to the ServiceTransferCache, making // them available for consumption in the GPU process. Typical usage is: // 1) Create a new ClientTransferCacheEntry. // 2) Map a memory allocation for the entry using either MapEntry() or // MapTransferBufferEntry(). // 3) Write the entry data to the mapped allocation using // ClientTransferCacheEntry::Serialize(). // 4) Unmap the allocation using UnmapAndCreateEntry(). This will ensure that // the entry starts locked and will trigger the creation of the // service-side cache entry. // 5) Use the new entry's ID in one or more commands. // 6) Unlock the entry via UnlockEntries() after dependent commands have been // issued. // // If an entry is needed again: // 7) Attempt to lock the entry via LockEntry(). // 7a) If this fails, DeleteEntry() then go to (1). // 7b) If this succeeds, go to (5). // // If an entry is no longer needed: // 8) DeleteEntry(). // // If the client wants to send the cache entry without using the |client| passed // to the constructor, it should replace steps (2)-(4) with a call to // StartTransferCacheEntry() and send the information needed to create the cache // entry on the service side using some external mechanism, e.g., an IPC // message. // // NOTE: The presence of locking on this class does not make it threadsafe. // The underlying locking *only* allows calling LockTransferCacheEntry // without holding the GL context lock. All other calls still require that // the context lock be held. class GLES2_IMPL_EXPORT ClientTransferCache { … }; } // namespace gpu #endif // GPU_COMMAND_BUFFER_CLIENT_CLIENT_TRANSFER_CACHE_H_