blob: 60c2ae6140e210c4cb90db8da8c3be8fb436fb1a [file] [log] [blame]
// Copyright (c) 2017 The Chromium Authors. All rights reserved.
// 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 "base/synchronization/lock.h"
#include "cc/paint/transfer_cache_entry.h"
#include "gpu/command_buffer/client/client_discardable_manager.h"
#include "gpu/command_buffer/client/gles2_interface.h"
#include "gpu/command_buffer/common/transfer_cache_entry_id.h"
namespace gpu {
// 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) Insert a new entry via CreateCacheEntry. It starts locked.
// 2) Use the new entry's ID in one or more commands.
// 3) Unlock the entry via UnlockTransferCacheEntry after dependent commands
// have been issued.
//
// If an entry is needed again:
// 4) Attempt to lock the entry via LockTransferCacheEntry.
// 4a) If this fails, DeleteTransferCacheEntry then go to (1)
// 4b) If this succeeds, go to (2).
//
// If an entry is no longer needed:
// 5) DeleteTransferCacheEntry
//
// 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 GPU_EXPORT ClientTransferCache {
public:
ClientTransferCache();
~ClientTransferCache();
TransferCacheEntryId CreateCacheEntry(
gles2::GLES2Interface* gl,
CommandBuffer* command_buffer,
const cc::ClientTransferCacheEntry& entry);
bool LockTransferCacheEntry(TransferCacheEntryId id);
void UnlockTransferCacheEntry(gles2::GLES2Interface* gl,
TransferCacheEntryId id);
void DeleteTransferCacheEntry(gles2::GLES2Interface* gl,
TransferCacheEntryId id);
// Test only functions
ClientDiscardableManager* DiscardableManagerForTesting() {
return &discardable_manager_;
}
private:
// Access to other members must always be done with |lock_| held.
base::Lock lock_;
ClientDiscardableManager discardable_manager_;
};
} // namespace gpu
#endif // GPU_COMMAND_BUFFER_CLIENT_CLIENT_TRANSFER_CACHE_H_