blob: e7581385071e3aefffee6692b66c42d873ef1085 [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);
44
45 static void deleteImageTexture(void* ctx);
46
47 AHardwareBuffer* fGraphicBuffer;
Stan Iliev7e910df2017-06-02 10:29:21 -040048
49 typedef SkImageGenerator INHERITED;
50};
51#endif // GrAHardwareBufferImageGenerator_DEFINED