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