xref: /aosp_15_r20/external/skia/src/gpu/ganesh/surface/SkSurface_AndroidFactories.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2023 Google LLC
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 
8 #include "include/core/SkTypes.h"
9 
10 #if defined(SK_BUILD_FOR_ANDROID) && __ANDROID_API__ >= 26
11 
12 #include "include/android/AHardwareBufferUtils.h"
13 #include "include/android/GrAHardwareBufferUtils.h"
14 #include "include/android/SkSurfaceAndroid.h"
15 #include "include/core/SkCanvas.h"
16 #include "include/core/SkColorSpace.h"
17 #include "include/core/SkColorType.h"
18 #include "include/core/SkImage.h"
19 #include "include/core/SkPoint.h"
20 #include "include/core/SkRect.h"
21 #include "include/core/SkSize.h"
22 #include "include/core/SkSurface.h"
23 #include "include/core/SkSurfaceProps.h"
24 #include "include/gpu/GpuTypes.h"
25 #include "include/gpu/ganesh/GrBackendSurface.h"
26 #include "include/gpu/ganesh/GrContextThreadSafeProxy.h"
27 #include "include/gpu/ganesh/GrDirectContext.h"
28 #include "include/gpu/ganesh/GrRecordingContext.h"
29 #include "include/gpu/ganesh/GrTypes.h"
30 #include "include/gpu/ganesh/SkSurfaceGanesh.h"
31 #include "include/private/base/SkTo.h"
32 #include "include/private/chromium/GrSurfaceCharacterization.h"
33 #include "include/private/gpu/ganesh/GrTypesPriv.h"
34 #include "src/core/SkDevice.h"
35 #include "src/core/SkSurfacePriv.h"
36 #include "src/gpu/RefCntedCallback.h"
37 #include "src/gpu/SkBackingFit.h"
38 #include "src/gpu/SkRenderEngineAbortf.h"
39 #include "src/gpu/ganesh/Device.h"
40 #include "src/gpu/ganesh/GrCaps.h"
41 #include "src/gpu/ganesh/GrContextThreadSafeProxyPriv.h"
42 #include "src/gpu/ganesh/GrDirectContextPriv.h"
43 #include "src/gpu/ganesh/GrGpuResourcePriv.h"
44 #include "src/gpu/ganesh/GrProxyProvider.h"
45 #include "src/gpu/ganesh/GrRecordingContextPriv.h"
46 #include "src/gpu/ganesh/GrRenderTarget.h"
47 #include "src/gpu/ganesh/GrRenderTargetProxy.h"
48 #include "src/gpu/ganesh/GrSurfaceProxy.h"
49 #include "src/gpu/ganesh/GrSurfaceProxyPriv.h"
50 #include "src/gpu/ganesh/GrSurfaceProxyView.h"
51 #include "src/gpu/ganesh/GrTexture.h"
52 #include "src/gpu/ganesh/GrTextureProxy.h"
53 #include "src/gpu/ganesh/image/SkImage_Ganesh.h"
54 #include "src/gpu/ganesh/surface/SkSurface_Ganesh.h"
55 #include "src/image/SkImage_Base.h"
56 
57 #include <algorithm>
58 #include <cstddef>
59 #include <utility>
60 
61 #include <android/hardware_buffer.h>
62 
63 namespace SkSurfaces {
64 
WrapAndroidHardwareBuffer(GrDirectContext * dContext,AHardwareBuffer * hardwareBuffer,GrSurfaceOrigin origin,sk_sp<SkColorSpace> colorSpace,const SkSurfaceProps * surfaceProps,bool fromWindow)65 sk_sp<SkSurface> WrapAndroidHardwareBuffer(GrDirectContext* dContext,
66                                            AHardwareBuffer* hardwareBuffer,
67                                            GrSurfaceOrigin origin,
68                                            sk_sp<SkColorSpace> colorSpace,
69                                            const SkSurfaceProps* surfaceProps,
70                                            bool fromWindow) {
71     AHardwareBuffer_Desc bufferDesc;
72     AHardwareBuffer_describe(hardwareBuffer, &bufferDesc);
73 
74     if (!SkToBool(bufferDesc.usage & AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT)) {
75         return nullptr;
76     }
77 
78     bool isTextureable = SkToBool(bufferDesc.usage & AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE);
79     if (!isTextureable) {
80         return nullptr;
81     }
82 
83     GrBackendFormat backendFormat = GrAHardwareBufferUtils::GetBackendFormat(
84             dContext, hardwareBuffer, bufferDesc.format, true);
85     if (!backendFormat.isValid()) {
86         return nullptr;
87     }
88 
89     GrAHardwareBufferUtils::DeleteImageProc deleteImageProc = nullptr;
90     GrAHardwareBufferUtils::UpdateImageProc updateImageProc = nullptr;
91     GrAHardwareBufferUtils::TexImageCtx deleteImageCtx = nullptr;
92 
93     bool isProtectedContent =
94             SkToBool(bufferDesc.usage & AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT);
95 
96     bool fromWindowLocal = false;
97 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
98     fromWindowLocal = fromWindow;
99 #endif
100 
101     GrBackendTexture backendTexture =
102             GrAHardwareBufferUtils::MakeBackendTexture(dContext,
103                                                        hardwareBuffer,
104                                                        bufferDesc.width,
105                                                        bufferDesc.height,
106                                                        &deleteImageProc,
107                                                        &updateImageProc,
108                                                        &deleteImageCtx,
109                                                        isProtectedContent,
110                                                        backendFormat,
111                                                        true,
112                                                        fromWindowLocal);
113     if (!backendTexture.isValid()) {
114         return nullptr;
115     }
116 
117     SkColorType colorType =
118             AHardwareBufferUtils::GetSkColorTypeFromBufferFormat(bufferDesc.format);
119 
120     // Will call deleteImageProc if SkSurface creation fails.
121     sk_sp<SkSurface> surface = SkSurfaces::WrapBackendTexture(dContext,
122                                                               backendTexture,
123                                                               origin,
124                                                               0,
125                                                               colorType,
126                                                               std::move(colorSpace),
127                                                               surfaceProps,
128                                                               deleteImageProc,
129                                                               deleteImageCtx);
130 
131     return surface;
132 }
133 
134 }  // namespace SkSurfaces
135 
136 #endif
137