xref: /aosp_15_r20/external/skia/include/private/chromium/SkDiscardableMemory.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2013 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkDiscardableMemory_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SkDiscardableMemory_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
13*c8dee2aaSAndroid Build Coastguard Worker 
14*c8dee2aaSAndroid Build Coastguard Worker /**
15*c8dee2aaSAndroid Build Coastguard Worker  *  Interface for discardable memory. Implementation is provided by the
16*c8dee2aaSAndroid Build Coastguard Worker  *  embedder.
17*c8dee2aaSAndroid Build Coastguard Worker  */
18*c8dee2aaSAndroid Build Coastguard Worker class SK_SPI SkDiscardableMemory {
19*c8dee2aaSAndroid Build Coastguard Worker public:
20*c8dee2aaSAndroid Build Coastguard Worker     /**
21*c8dee2aaSAndroid Build Coastguard Worker      *  Factory method that creates, initializes and locks an SkDiscardableMemory
22*c8dee2aaSAndroid Build Coastguard Worker      *  object. If either of these steps fails, a nullptr pointer will be returned.
23*c8dee2aaSAndroid Build Coastguard Worker      */
24*c8dee2aaSAndroid Build Coastguard Worker     static SkDiscardableMemory* Create(size_t bytes);
25*c8dee2aaSAndroid Build Coastguard Worker 
26*c8dee2aaSAndroid Build Coastguard Worker     /**
27*c8dee2aaSAndroid Build Coastguard Worker      *  Factory class that creates, initializes and locks an SkDiscardableMemory
28*c8dee2aaSAndroid Build Coastguard Worker      *  object. If either of these steps fails, a nullptr pointer will be returned.
29*c8dee2aaSAndroid Build Coastguard Worker      */
30*c8dee2aaSAndroid Build Coastguard Worker     class Factory : public SkRefCnt {
31*c8dee2aaSAndroid Build Coastguard Worker     public:
32*c8dee2aaSAndroid Build Coastguard Worker         virtual SkDiscardableMemory* create(size_t bytes) = 0;
33*c8dee2aaSAndroid Build Coastguard Worker     private:
34*c8dee2aaSAndroid Build Coastguard Worker         using INHERITED = SkRefCnt;
35*c8dee2aaSAndroid Build Coastguard Worker     };
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker     /** Must not be called while locked.
38*c8dee2aaSAndroid Build Coastguard Worker      */
~SkDiscardableMemory()39*c8dee2aaSAndroid Build Coastguard Worker     virtual ~SkDiscardableMemory() {}
40*c8dee2aaSAndroid Build Coastguard Worker 
41*c8dee2aaSAndroid Build Coastguard Worker     /**
42*c8dee2aaSAndroid Build Coastguard Worker      * Locks the memory, prevent it from being discarded. Once locked. you may
43*c8dee2aaSAndroid Build Coastguard Worker      * obtain a pointer to that memory using the data() method.
44*c8dee2aaSAndroid Build Coastguard Worker      *
45*c8dee2aaSAndroid Build Coastguard Worker      * lock() may return false, indicating that the underlying memory was
46*c8dee2aaSAndroid Build Coastguard Worker      * discarded and that the lock failed.
47*c8dee2aaSAndroid Build Coastguard Worker      *
48*c8dee2aaSAndroid Build Coastguard Worker      * Nested calls to lock are not allowed.
49*c8dee2aaSAndroid Build Coastguard Worker      */
50*c8dee2aaSAndroid Build Coastguard Worker     [[nodiscard]] virtual bool lock() = 0;
51*c8dee2aaSAndroid Build Coastguard Worker 
52*c8dee2aaSAndroid Build Coastguard Worker     /**
53*c8dee2aaSAndroid Build Coastguard Worker      * Returns the current pointer for the discardable memory. This call is ONLY
54*c8dee2aaSAndroid Build Coastguard Worker      * valid when the discardable memory object is locked.
55*c8dee2aaSAndroid Build Coastguard Worker      */
56*c8dee2aaSAndroid Build Coastguard Worker     virtual void* data() = 0;
57*c8dee2aaSAndroid Build Coastguard Worker 
58*c8dee2aaSAndroid Build Coastguard Worker     /**
59*c8dee2aaSAndroid Build Coastguard Worker      * Unlock the memory so that it can be purged by the system. Must be called
60*c8dee2aaSAndroid Build Coastguard Worker      * after every successful lock call.
61*c8dee2aaSAndroid Build Coastguard Worker      */
62*c8dee2aaSAndroid Build Coastguard Worker     virtual void unlock() = 0;
63*c8dee2aaSAndroid Build Coastguard Worker 
64*c8dee2aaSAndroid Build Coastguard Worker protected:
65*c8dee2aaSAndroid Build Coastguard Worker     SkDiscardableMemory() = default;
66*c8dee2aaSAndroid Build Coastguard Worker     SkDiscardableMemory(const SkDiscardableMemory&) = delete;
67*c8dee2aaSAndroid Build Coastguard Worker     SkDiscardableMemory& operator=(const SkDiscardableMemory&) = delete;
68*c8dee2aaSAndroid Build Coastguard Worker };
69*c8dee2aaSAndroid Build Coastguard Worker 
70*c8dee2aaSAndroid Build Coastguard Worker #endif
71