xref: /aosp_15_r20/external/skia/src/gpu/ganesh/GrAHardwareBufferImageGenerator.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2017 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrAHardwareBufferImageGenerator_DEFINED
8*c8dee2aaSAndroid Build Coastguard Worker #define GrAHardwareBufferImageGenerator_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTextureGenerator.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
12*c8dee2aaSAndroid Build Coastguard Worker 
13*c8dee2aaSAndroid Build Coastguard Worker class GrGpuResource;
14*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxyView;
15*c8dee2aaSAndroid Build Coastguard Worker 
16*c8dee2aaSAndroid Build Coastguard Worker extern "C" {
17*c8dee2aaSAndroid Build Coastguard Worker     typedef struct AHardwareBuffer AHardwareBuffer;
18*c8dee2aaSAndroid Build Coastguard Worker }
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker /**
21*c8dee2aaSAndroid Build Coastguard Worker  *  GrAHardwareBufferImageGenerator allows to create an SkImage attached to
22*c8dee2aaSAndroid Build Coastguard Worker  *  an existing android native hardware buffer. A hardware buffer has to be
23*c8dee2aaSAndroid Build Coastguard Worker  *  created with AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE usage, because it is
24*c8dee2aaSAndroid Build Coastguard Worker  *  bound to an external texture using an EGLImage. The image generator will
25*c8dee2aaSAndroid Build Coastguard Worker  *  keep a reference to the hardware buffer for its lifetime. A hardware buffer
26*c8dee2aaSAndroid Build Coastguard Worker  *  can be shared between processes and same buffer can be used in multiple GPU
27*c8dee2aaSAndroid Build Coastguard Worker  *  contexts.
28*c8dee2aaSAndroid Build Coastguard Worker  *  To implement certain features like tiling, Skia may copy the texture to
29*c8dee2aaSAndroid Build Coastguard Worker  *  avoid OpenGL API limitations.
30*c8dee2aaSAndroid Build Coastguard Worker  */
31*c8dee2aaSAndroid Build Coastguard Worker class GrAHardwareBufferImageGenerator : public GrTextureGenerator {
32*c8dee2aaSAndroid Build Coastguard Worker public:
33*c8dee2aaSAndroid Build Coastguard Worker     static std::unique_ptr<SkImageGenerator> Make(AHardwareBuffer*, SkAlphaType,
34*c8dee2aaSAndroid Build Coastguard Worker                                                   sk_sp<SkColorSpace>, GrSurfaceOrigin);
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker     ~GrAHardwareBufferImageGenerator() override;
37*c8dee2aaSAndroid Build Coastguard Worker 
38*c8dee2aaSAndroid Build Coastguard Worker     static void DeleteGLTexture(void* ctx);
39*c8dee2aaSAndroid Build Coastguard Worker 
40*c8dee2aaSAndroid Build Coastguard Worker private:
41*c8dee2aaSAndroid Build Coastguard Worker     GrAHardwareBufferImageGenerator(const SkImageInfo&, AHardwareBuffer*, SkAlphaType,
42*c8dee2aaSAndroid Build Coastguard Worker                                     bool isProtectedContent, uint32_t bufferFormat,
43*c8dee2aaSAndroid Build Coastguard Worker                                     GrSurfaceOrigin surfaceOrigin);
44*c8dee2aaSAndroid Build Coastguard Worker 
45*c8dee2aaSAndroid Build Coastguard Worker     bool onIsValid(GrRecordingContext*) const override;
46*c8dee2aaSAndroid Build Coastguard Worker 
47*c8dee2aaSAndroid Build Coastguard Worker     GrSurfaceProxyView onGenerateTexture(GrRecordingContext*,
48*c8dee2aaSAndroid Build Coastguard Worker                                          const SkImageInfo&,
49*c8dee2aaSAndroid Build Coastguard Worker                                          skgpu::Mipmapped,
50*c8dee2aaSAndroid Build Coastguard Worker                                          GrImageTexGenPolicy) override;
51*c8dee2aaSAndroid Build Coastguard Worker 
origin()52*c8dee2aaSAndroid Build Coastguard Worker     GrSurfaceOrigin origin() const override { return fSurfaceOrigin; }
53*c8dee2aaSAndroid Build Coastguard Worker 
54*c8dee2aaSAndroid Build Coastguard Worker     GrSurfaceProxyView makeView(GrRecordingContext* context);
55*c8dee2aaSAndroid Build Coastguard Worker 
56*c8dee2aaSAndroid Build Coastguard Worker     void releaseTextureRef();
57*c8dee2aaSAndroid Build Coastguard Worker 
58*c8dee2aaSAndroid Build Coastguard Worker     static void ReleaseRefHelper_TextureReleaseProc(void* ctx);
59*c8dee2aaSAndroid Build Coastguard Worker 
60*c8dee2aaSAndroid Build Coastguard Worker     AHardwareBuffer* fHardwareBuffer;
61*c8dee2aaSAndroid Build Coastguard Worker     uint32_t         fBufferFormat;
62*c8dee2aaSAndroid Build Coastguard Worker     const bool       fIsProtectedContent;
63*c8dee2aaSAndroid Build Coastguard Worker     GrSurfaceOrigin  fSurfaceOrigin;
64*c8dee2aaSAndroid Build Coastguard Worker };
65*c8dee2aaSAndroid Build Coastguard Worker #endif  // GrAHardwareBufferImageGenerator_DEFINED
66