1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
// Copyright 2018 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_SERVICE_SERVICE_FONT_MANAGER_H_
#define GPU_COMMAND_BUFFER_SERVICE_SERVICE_FONT_MANAGER_H_
#include "base/containers/flat_map.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/synchronization/lock.h"
#include "base/threading/thread.h"
#include "gpu/command_buffer/common/discardable_handle.h"
#include "gpu/gpu_gles2_export.h"
#include "third_party/skia/include/private/chromium/SkChromeRemoteGlyphCache.h"
namespace gpu {
class Buffer;
class GPU_GLES2_EXPORT ServiceFontManager
: public base::RefCountedThreadSafe<ServiceFontManager> {
public:
class GPU_GLES2_EXPORT Client {
public:
virtual ~Client() {}
virtual scoped_refptr<Buffer> GetShmBuffer(uint32_t shm_id) = 0;
virtual void ReportProgress() = 0;
};
ServiceFontManager(Client* client, bool disable_oopr_debug_crash_dump);
void Destroy();
bool Deserialize(const volatile uint8_t* memory,
uint32_t memory_size,
std::vector<SkDiscardableHandleId>* locked_handles);
bool Unlock(const std::vector<SkDiscardableHandleId>& handles);
SkStrikeClient* strike_client() { return strike_client_.get(); }
bool disable_oopr_debug_crash_dump() const {
return disable_oopr_debug_crash_dump_;
}
private:
friend class base::RefCountedThreadSafe<ServiceFontManager>;
class SkiaDiscardableManager;
~ServiceFontManager();
bool AddHandle(SkDiscardableHandleId handle_id,
ServiceDiscardableHandle handle)
EXCLUSIVE_LOCKS_REQUIRED(lock_);
bool DeleteHandle(SkDiscardableHandleId handle_id);
base::Lock lock_;
raw_ptr<Client> client_ GUARDED_BY(lock_);
const base::PlatformThreadId client_thread_id_;
std::unique_ptr<SkStrikeClient> strike_client_;
class Handle {
public:
explicit Handle(ServiceDiscardableHandle handle)
: handle_(std::move(handle)) {}
void Unlock() {
--ref_count_;
handle_.Unlock();
}
void Lock() { ++ref_count_; }
bool Delete() { return handle_.Delete(); }
int ref_count() const { return ref_count_; }
bool IsLocked() const { return handle_.IsLockedForTesting(); }
private:
ServiceDiscardableHandle handle_;
// ref count hold by GPU service.
int ref_count_ = 0;
};
base::flat_map<SkDiscardableHandleId, Handle> discardable_handle_map_
GUARDED_BY(lock_);
bool destroyed_ GUARDED_BY(lock_) = false;
const bool disable_oopr_debug_crash_dump_;
};
} // namespace gpu
#endif // GPU_COMMAND_BUFFER_SERVICE_SERVICE_FONT_MANAGER_H_
|