xref: /aosp_15_r20/external/skia/src/gpu/graphite/surface/Surface_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 __ANDROID_API__ >= 26
11 
12 #include "include/android/graphite/SurfaceAndroid.h"
13 #include "include/core/SkColorSpace.h"
14 #include "include/gpu/graphite/BackendTexture.h"
15 #include "include/gpu/graphite/Recorder.h"
16 #include "include/gpu/graphite/Surface.h"
17 #include "include/android/AHardwareBufferUtils.h"
18 
19 #include <android/hardware_buffer.h>
20 
21 using namespace skgpu::graphite;
22 
23 namespace SkSurfaces {
24 
WrapAndroidHardwareBuffer(Recorder * recorder,AHardwareBuffer * hardwareBuffer,sk_sp<SkColorSpace> colorSpace,const SkSurfaceProps * surfaceProps,BufferReleaseProc releaseP,ReleaseContext releaseC,bool fromWindow)25 sk_sp<SkSurface> WrapAndroidHardwareBuffer(Recorder* recorder,
26                                            AHardwareBuffer* hardwareBuffer,
27                                            sk_sp<SkColorSpace> colorSpace,
28                                            const SkSurfaceProps* surfaceProps,
29                                            BufferReleaseProc releaseP,
30                                            ReleaseContext releaseC,
31                                            bool fromWindow) {
32     if (!recorder || !hardwareBuffer) {
33         return nullptr;
34     }
35 
36     AHardwareBuffer_Desc bufferDesc;
37     AHardwareBuffer_describe(hardwareBuffer, &bufferDesc);
38 
39     if (!SkToBool(bufferDesc.usage & AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT) ||
40         !SkToBool(bufferDesc.usage & AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE)) {
41         if (releaseP) {
42             releaseP(releaseC);
43         }
44         return nullptr;
45     }
46 
47     bool isProtectedContent = SkToBool(bufferDesc.usage & AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT);
48 
49     bool fromWindowLocal = false;
50 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
51     fromWindowLocal = fromWindow;
52 #endif
53 
54     SkISize dims = SkISize::Make(bufferDesc.width, bufferDesc.height);
55 
56     BackendTexture backendTexture = recorder->createBackendTexture(hardwareBuffer,
57                                                                    /* isRenderable= */ true,
58                                                                    isProtectedContent,
59                                                                    dims,
60                                                                    fromWindowLocal);
61     if (!backendTexture.isValid()) {
62         if (releaseP) {
63             releaseP(releaseC);
64         }
65         return nullptr;
66     }
67 
68     SkColorType colorType =
69             AHardwareBufferUtils::GetSkColorTypeFromBufferFormat(bufferDesc.format);
70 
71     // Will call 'releaseP' if SkSurface creation fails.
72     return SkSurfaces::WrapBackendTexture(recorder,
73                                           backendTexture,
74                                           colorType,
75                                           std::move(colorSpace),
76                                           surfaceProps,
77                                           releaseP,
78                                           releaseC);
79 }
80 
81 }  // namespace SkSurfaces
82 
83 #endif // __ANDROID_API__ >= 26
84