blob: 2526e0accb3a2e6660a5c7256d25ff740b59b8c3 [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
Greg Danielf1251112018-08-27 09:55:03 -040012#include "GrTypesPriv.h"
13
Greg Daniel469dd652018-09-05 13:27:27 -040014class GrGpuResource;
15
Derek Sollenberger1bd76c42017-10-16 11:57:59 -040016extern "C" {
17 typedef struct AHardwareBuffer AHardwareBuffer;
18}
Stan Iliev7e910df2017-06-02 10:29:21 -040019
20/**
21 * GrAHardwareBufferImageGenerator allows to create an SkImage attached to
22 * an existing android native hardware buffer. A hardware buffer has to be
23 * created with AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE usage, because it is
24 * bound to an external texture using an EGLImage. The image generator will
25 * keep a reference to the hardware buffer for its lifetime. A hardware buffer
26 * can be shared between processes and same buffer can be used in multiple GPU
27 * contexts.
28 * To implement certain features like tiling, Skia may copy the texture to
29 * avoid OpenGL API limitations.
30 */
31class GrAHardwareBufferImageGenerator : public SkImageGenerator {
32public:
33 static std::unique_ptr<SkImageGenerator> Make(AHardwareBuffer*, SkAlphaType,
Stan Iliev505dd572018-09-13 14:20:03 -040034 sk_sp<SkColorSpace>, GrSurfaceOrigin);
Stan Iliev7e910df2017-06-02 10:29:21 -040035
36 ~GrAHardwareBufferImageGenerator() override;
37
Greg Daniel9af948d2018-08-27 09:53:51 -040038 typedef void* DeleteImageCtx;
39 typedef void (*DeleteImageProc)(DeleteImageCtx);
40
Greg Daniel3860cfd2018-09-07 09:13:54 -040041 static void DeleteGLTexture(void* ctx);
Greg Daniel9af948d2018-08-27 09:53:51 -040042
Greg Daniel637c06a2018-09-12 09:44:25 -040043#ifdef SK_VULKAN
44 static void DeleteVkImage(void* ctx);
45#endif
46
Stan Iliev7e910df2017-06-02 10:29:21 -040047protected:
48
49 bool onIsValid(GrContext*) const override;
50
Stan Ilievba81af22017-06-08 15:16:53 -040051 TexGenType onCanGenerateTexture() const override { return TexGenType::kCheap; }
Christopher Cameron77e96662017-07-08 01:47:47 -070052 sk_sp<GrTextureProxy> onGenerateTexture(GrContext*, const SkImageInfo&, const SkIPoint&,
Greg Danielf88c12e2017-10-09 09:57:35 -040053 bool willNeedMipMaps) override;
Stan Iliev7e910df2017-06-02 10:29:21 -040054
55private:
Stan Ilievc01b5c72018-08-28 10:18:19 -040056 GrAHardwareBufferImageGenerator(const SkImageInfo&, AHardwareBuffer*, SkAlphaType,
Stan Iliev505dd572018-09-13 14:20:03 -040057 bool isProtectedContent, uint32_t bufferFormat,
58 GrSurfaceOrigin surfaceOrigin);
Greg Daniel3860cfd2018-09-07 09:13:54 -040059 sk_sp<GrTextureProxy> makeProxy(GrContext* context);
Stan Iliev7e910df2017-06-02 10:29:21 -040060
Greg Danielf1251112018-08-27 09:55:03 -040061 void releaseTextureRef();
62
63 static void ReleaseRefHelper_TextureReleaseProc(void* ctx);
64
65 AHardwareBuffer* fHardwareBuffer;
Greg Daniel3860cfd2018-09-07 09:13:54 -040066 uint32_t fBufferFormat;
67 const bool fIsProtectedContent;
Stan Iliev505dd572018-09-13 14:20:03 -040068 GrSurfaceOrigin fSurfaceOrigin;
Stan Iliev7e910df2017-06-02 10:29:21 -040069
70 typedef SkImageGenerator INHERITED;
71};
72#endif // GrAHardwareBufferImageGenerator_DEFINED