blob: f23738b9c512ce76e674fc26b460be19c9e7ac4d [file] [log] [blame]
Stan Iliev7e910df2017-06-02 10:29:21 -04001/*
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#ifndef GrAHardwareBufferImageGenerator_DEFINED
8#define GrAHardwareBufferImageGenerator_DEFINED
9
10#include "SkImageGenerator.h"
11
Derek Sollenberger7a869872017-06-27 15:37:25 -040012struct AHardwareBuffer;
Stan Iliev7e910df2017-06-02 10:29:21 -040013
14/**
15 * GrAHardwareBufferImageGenerator allows to create an SkImage attached to
16 * an existing android native hardware buffer. A hardware buffer has to be
17 * created with AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE usage, because it is
18 * bound to an external texture using an EGLImage. The image generator will
19 * keep a reference to the hardware buffer for its lifetime. A hardware buffer
20 * can be shared between processes and same buffer can be used in multiple GPU
21 * contexts.
22 * To implement certain features like tiling, Skia may copy the texture to
23 * avoid OpenGL API limitations.
24 */
25class GrAHardwareBufferImageGenerator : public SkImageGenerator {
26public:
27 static std::unique_ptr<SkImageGenerator> Make(AHardwareBuffer*, SkAlphaType,
28 sk_sp<SkColorSpace>);
29
30 ~GrAHardwareBufferImageGenerator() override;
31
32protected:
33
34 bool onIsValid(GrContext*) const override;
35
36#if SK_SUPPORT_GPU
Stan Ilievba81af22017-06-08 15:16:53 -040037 TexGenType onCanGenerateTexture() const override { return TexGenType::kCheap; }
Stan Iliev7e910df2017-06-02 10:29:21 -040038 sk_sp<GrTextureProxy> onGenerateTexture(GrContext*, const SkImageInfo&,
39 const SkIPoint&) override;
40#endif
41
42private:
43 GrAHardwareBufferImageGenerator(const SkImageInfo&, AHardwareBuffer*, SkAlphaType);
Stan Ilievdbba55d2017-06-28 13:24:41 -040044 sk_sp<GrTextureProxy> makeProxy(GrContext* context);
45 void clear();
Stan Iliev7e910df2017-06-02 10:29:21 -040046
47 static void deleteImageTexture(void* ctx);
48
49 AHardwareBuffer* fGraphicBuffer;
Stan Ilievdbba55d2017-06-28 13:24:41 -040050 GrTexture* fOriginalTexture = nullptr;
51 uint32_t fOwningContextID;
Stan Iliev7e910df2017-06-02 10:29:21 -040052
53 typedef SkImageGenerator INHERITED;
54};
55#endif // GrAHardwareBufferImageGenerator_DEFINED