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