blob: 6f5170097a3e5d8641778407bcc67909ee7d46bb [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 Sollenberger1bd76c42017-10-16 11:57:59 -040012extern "C" {
13 typedef struct AHardwareBuffer AHardwareBuffer;
14}
Stan Iliev7e910df2017-06-02 10:29:21 -040015
16/**
17 * GrAHardwareBufferImageGenerator allows to create an SkImage attached to
18 * an existing android native hardware buffer. A hardware buffer has to be
19 * created with AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE usage, because it is
20 * bound to an external texture using an EGLImage. The image generator will
21 * keep a reference to the hardware buffer for its lifetime. A hardware buffer
22 * can be shared between processes and same buffer can be used in multiple GPU
23 * contexts.
24 * To implement certain features like tiling, Skia may copy the texture to
25 * avoid OpenGL API limitations.
26 */
27class GrAHardwareBufferImageGenerator : public SkImageGenerator {
28public:
29 static std::unique_ptr<SkImageGenerator> Make(AHardwareBuffer*, SkAlphaType,
30 sk_sp<SkColorSpace>);
31
32 ~GrAHardwareBufferImageGenerator() override;
33
34protected:
35
36 bool onIsValid(GrContext*) const override;
37
38#if SK_SUPPORT_GPU
Stan Ilievba81af22017-06-08 15:16:53 -040039 TexGenType onCanGenerateTexture() const override { return TexGenType::kCheap; }
Christopher Cameron77e96662017-07-08 01:47:47 -070040 sk_sp<GrTextureProxy> onGenerateTexture(GrContext*, const SkImageInfo&, const SkIPoint&,
Greg Danielf88c12e2017-10-09 09:57:35 -040041 SkTransferFunctionBehavior,
42 bool willNeedMipMaps) override;
Stan Iliev7e910df2017-06-02 10:29:21 -040043#endif
44
45private:
46 GrAHardwareBufferImageGenerator(const SkImageInfo&, AHardwareBuffer*, SkAlphaType);
Stan Ilievdbba55d2017-06-28 13:24:41 -040047 sk_sp<GrTextureProxy> makeProxy(GrContext* context);
48 void clear();
Stan Iliev7e910df2017-06-02 10:29:21 -040049
50 static void deleteImageTexture(void* ctx);
51
52 AHardwareBuffer* fGraphicBuffer;
Stan Ilievdbba55d2017-06-28 13:24:41 -040053 GrTexture* fOriginalTexture = nullptr;
54 uint32_t fOwningContextID;
Stan Iliev7e910df2017-06-02 10:29:21 -040055
56 typedef SkImageGenerator INHERITED;
57};
58#endif // GrAHardwareBufferImageGenerator_DEFINED