1/*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkPromiseImageTexture_DEFINED
9#define SkPromiseImageTexture_DEFINED
10
11#include "include/core/SkRefCnt.h"
12#include "include/gpu/GrBackendSurface.h"
13#include "include/private/GrResourceKey.h"
14
15#if SK_SUPPORT_GPU
16/**
17 * This type is used to fulfill textures for PromiseImages. Once an instance is returned from a
18 * PromiseImageTextureFulfillProc it must remain valid until the corresponding
19 * PromiseImageTextureReleaseProc is called. For performance reasons it is recommended that the
20 * the client reuse a single PromiseImageTexture every time a given texture is returned by
21 * the PromiseImageTextureFulfillProc rather than recreating PromiseImageTextures representing
22 * the same underlying backend API texture.
23 */
24class SK_API SkPromiseImageTexture : public SkNVRefCnt<SkPromiseImageTexture> {
25public:
26 SkPromiseImageTexture() = delete;
27 SkPromiseImageTexture(const SkPromiseImageTexture&) = delete;
28 SkPromiseImageTexture(SkPromiseImageTexture&&) = delete;
29 ~SkPromiseImageTexture();
30 SkPromiseImageTexture& operator=(const SkPromiseImageTexture&) = delete;
31 SkPromiseImageTexture& operator=(SkPromiseImageTexture&&) = delete;
32
33 static sk_sp<SkPromiseImageTexture> Make(const GrBackendTexture& backendTexture) {
34 if (!backendTexture.isValid()) {
35 return nullptr;
36 }
37 return sk_sp<SkPromiseImageTexture>(new SkPromiseImageTexture(backendTexture));
38 }
39
40 const GrBackendTexture& backendTexture() const { return fBackendTexture; }
41
42 void addKeyToInvalidate(uint32_t contextID, const GrUniqueKey& key);
43 uint32_t uniqueID() const { return fUniqueID; }
44
45#if GR_TEST_UTILS
46 SkTArray<GrUniqueKey> testingOnly_uniqueKeysToInvalidate() const;
47#endif
48
49private:
50 explicit SkPromiseImageTexture(const GrBackendTexture& backendTexture);
51
52 SkSTArray<1, GrUniqueKeyInvalidatedMessage> fMessages;
53 GrBackendTexture fBackendTexture;
54 uint32_t fUniqueID = SK_InvalidUniqueID;
55 static std::atomic<uint32_t> gUniqueID;
56};
57#endif
58
59#endif
60