xref: /aosp_15_r20/external/skia/tests/GrAHardwareBufferTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2018 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 
8*c8dee2aaSAndroid Build Coastguard Worker // This is a GPU-backend specific test. It relies on static initializers to work
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
11*c8dee2aaSAndroid Build Coastguard Worker 
12*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GANESH) && defined(SK_BUILD_FOR_ANDROID) && __ANDROID_API__ >= 26
13*c8dee2aaSAndroid Build Coastguard Worker 
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/android/SkImageAndroid.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/android/SkSurfaceAndroid.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/SkSurfaceGanesh.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrAHardwareBufferImageGenerator.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpu.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/GrContextFactory.h"
28*c8dee2aaSAndroid Build Coastguard Worker 
29*c8dee2aaSAndroid Build Coastguard Worker #include <android/hardware_buffer.h>
30*c8dee2aaSAndroid Build Coastguard Worker #include <cinttypes>
31*c8dee2aaSAndroid Build Coastguard Worker 
32*c8dee2aaSAndroid Build Coastguard Worker static const int DEV_W = 16, DEV_H = 16;
33*c8dee2aaSAndroid Build Coastguard Worker 
get_src_color(int x,int y)34*c8dee2aaSAndroid Build Coastguard Worker static SkPMColor get_src_color(int x, int y) {
35*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(x >= 0 && x < DEV_W);
36*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(y >= 0 && y < DEV_H);
37*c8dee2aaSAndroid Build Coastguard Worker 
38*c8dee2aaSAndroid Build Coastguard Worker     U8CPU r = x;
39*c8dee2aaSAndroid Build Coastguard Worker     U8CPU g = y;
40*c8dee2aaSAndroid Build Coastguard Worker     U8CPU b = 0xc;
41*c8dee2aaSAndroid Build Coastguard Worker 
42*c8dee2aaSAndroid Build Coastguard Worker     U8CPU a = 0xff;
43*c8dee2aaSAndroid Build Coastguard Worker     switch ((x+y) % 5) {
44*c8dee2aaSAndroid Build Coastguard Worker         case 0:
45*c8dee2aaSAndroid Build Coastguard Worker             a = 0xff;
46*c8dee2aaSAndroid Build Coastguard Worker             break;
47*c8dee2aaSAndroid Build Coastguard Worker         case 1:
48*c8dee2aaSAndroid Build Coastguard Worker             a = 0x80;
49*c8dee2aaSAndroid Build Coastguard Worker             break;
50*c8dee2aaSAndroid Build Coastguard Worker         case 2:
51*c8dee2aaSAndroid Build Coastguard Worker             a = 0xCC;
52*c8dee2aaSAndroid Build Coastguard Worker             break;
53*c8dee2aaSAndroid Build Coastguard Worker         case 4:
54*c8dee2aaSAndroid Build Coastguard Worker             a = 0x01;
55*c8dee2aaSAndroid Build Coastguard Worker             break;
56*c8dee2aaSAndroid Build Coastguard Worker         case 3:
57*c8dee2aaSAndroid Build Coastguard Worker             a = 0x00;
58*c8dee2aaSAndroid Build Coastguard Worker             break;
59*c8dee2aaSAndroid Build Coastguard Worker     }
60*c8dee2aaSAndroid Build Coastguard Worker     a = 0xff;
61*c8dee2aaSAndroid Build Coastguard Worker     return SkPremultiplyARGBInline(a, r, g, b);
62*c8dee2aaSAndroid Build Coastguard Worker }
63*c8dee2aaSAndroid Build Coastguard Worker 
make_src_bitmap()64*c8dee2aaSAndroid Build Coastguard Worker static SkBitmap make_src_bitmap() {
65*c8dee2aaSAndroid Build Coastguard Worker     static SkBitmap bmp;
66*c8dee2aaSAndroid Build Coastguard Worker     if (bmp.isNull()) {
67*c8dee2aaSAndroid Build Coastguard Worker         bmp.allocN32Pixels(DEV_W, DEV_H);
68*c8dee2aaSAndroid Build Coastguard Worker         intptr_t pixels = reinterpret_cast<intptr_t>(bmp.getPixels());
69*c8dee2aaSAndroid Build Coastguard Worker         for (int y = 0; y < DEV_H; ++y) {
70*c8dee2aaSAndroid Build Coastguard Worker             for (int x = 0; x < DEV_W; ++x) {
71*c8dee2aaSAndroid Build Coastguard Worker                 SkPMColor* pixel = reinterpret_cast<SkPMColor*>(
72*c8dee2aaSAndroid Build Coastguard Worker                         pixels + y * bmp.rowBytes() + x * bmp.bytesPerPixel());
73*c8dee2aaSAndroid Build Coastguard Worker                 *pixel = get_src_color(x, y);
74*c8dee2aaSAndroid Build Coastguard Worker             }
75*c8dee2aaSAndroid Build Coastguard Worker         }
76*c8dee2aaSAndroid Build Coastguard Worker     }
77*c8dee2aaSAndroid Build Coastguard Worker     return bmp;
78*c8dee2aaSAndroid Build Coastguard Worker }
79*c8dee2aaSAndroid Build Coastguard Worker 
check_read(skiatest::Reporter * reporter,const SkBitmap & expectedBitmap,const SkBitmap & actualBitmap)80*c8dee2aaSAndroid Build Coastguard Worker static bool check_read(skiatest::Reporter* reporter, const SkBitmap& expectedBitmap,
81*c8dee2aaSAndroid Build Coastguard Worker                        const SkBitmap& actualBitmap) {
82*c8dee2aaSAndroid Build Coastguard Worker     bool result = true;
83*c8dee2aaSAndroid Build Coastguard Worker     for (int y = 0; y < DEV_H && result; ++y) {
84*c8dee2aaSAndroid Build Coastguard Worker         for (int x = 0; x < DEV_W && result; ++x) {
85*c8dee2aaSAndroid Build Coastguard Worker             const uint32_t srcPixel = *expectedBitmap.getAddr32(x, y);
86*c8dee2aaSAndroid Build Coastguard Worker             const uint32_t dstPixel = *actualBitmap.getAddr32(x, y);
87*c8dee2aaSAndroid Build Coastguard Worker             if (srcPixel != dstPixel) {
88*c8dee2aaSAndroid Build Coastguard Worker                 ERRORF(reporter, "Expected readback pixel (%d, %d) value 0x%08x, got 0x%08x.",
89*c8dee2aaSAndroid Build Coastguard Worker                        x, y,  srcPixel, dstPixel);
90*c8dee2aaSAndroid Build Coastguard Worker                 result = false;
91*c8dee2aaSAndroid Build Coastguard Worker             }/* else {
92*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf("Got good pixel (%d, %d) value 0x%08x, got 0x%08x.\n",
93*c8dee2aaSAndroid Build Coastguard Worker                        x, y,  srcPixel, dstPixel);
94*c8dee2aaSAndroid Build Coastguard Worker             }*/
95*c8dee2aaSAndroid Build Coastguard Worker         }
96*c8dee2aaSAndroid Build Coastguard Worker     }
97*c8dee2aaSAndroid Build Coastguard Worker     return result;
98*c8dee2aaSAndroid Build Coastguard Worker }
99*c8dee2aaSAndroid Build Coastguard Worker 
cleanup_resources(AHardwareBuffer * buffer)100*c8dee2aaSAndroid Build Coastguard Worker static void cleanup_resources(AHardwareBuffer* buffer) {
101*c8dee2aaSAndroid Build Coastguard Worker     if (buffer) {
102*c8dee2aaSAndroid Build Coastguard Worker         AHardwareBuffer_release(buffer);
103*c8dee2aaSAndroid Build Coastguard Worker     }
104*c8dee2aaSAndroid Build Coastguard Worker }
105*c8dee2aaSAndroid Build Coastguard Worker 
basic_draw_test_helper(skiatest::Reporter * reporter,const sk_gpu_test::ContextInfo & info,GrSurfaceOrigin surfaceOrigin)106*c8dee2aaSAndroid Build Coastguard Worker static void basic_draw_test_helper(skiatest::Reporter* reporter,
107*c8dee2aaSAndroid Build Coastguard Worker                                    const sk_gpu_test::ContextInfo& info,
108*c8dee2aaSAndroid Build Coastguard Worker                                    GrSurfaceOrigin surfaceOrigin) {
109*c8dee2aaSAndroid Build Coastguard Worker 
110*c8dee2aaSAndroid Build Coastguard Worker     auto context = info.directContext();
111*c8dee2aaSAndroid Build Coastguard Worker     if (!context->priv().caps()->supportsAHardwareBufferImages()) {
112*c8dee2aaSAndroid Build Coastguard Worker         return;
113*c8dee2aaSAndroid Build Coastguard Worker     }
114*c8dee2aaSAndroid Build Coastguard Worker 
115*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
116*c8dee2aaSAndroid Build Coastguard Worker     // Setup SkBitmaps
117*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
118*c8dee2aaSAndroid Build Coastguard Worker 
119*c8dee2aaSAndroid Build Coastguard Worker     const SkBitmap srcBitmap = make_src_bitmap();
120*c8dee2aaSAndroid Build Coastguard Worker 
121*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
122*c8dee2aaSAndroid Build Coastguard Worker     // Setup AHardwareBuffer
123*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
124*c8dee2aaSAndroid Build Coastguard Worker 
125*c8dee2aaSAndroid Build Coastguard Worker     AHardwareBuffer* buffer = nullptr;
126*c8dee2aaSAndroid Build Coastguard Worker 
127*c8dee2aaSAndroid Build Coastguard Worker     AHardwareBuffer_Desc hwbDesc;
128*c8dee2aaSAndroid Build Coastguard Worker     hwbDesc.width = DEV_W;
129*c8dee2aaSAndroid Build Coastguard Worker     hwbDesc.height = DEV_H;
130*c8dee2aaSAndroid Build Coastguard Worker     hwbDesc.layers = 1;
131*c8dee2aaSAndroid Build Coastguard Worker     hwbDesc.usage = AHARDWAREBUFFER_USAGE_CPU_READ_NEVER |
132*c8dee2aaSAndroid Build Coastguard Worker                     AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN |
133*c8dee2aaSAndroid Build Coastguard Worker                     AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
134*c8dee2aaSAndroid Build Coastguard Worker     hwbDesc.format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
135*c8dee2aaSAndroid Build Coastguard Worker     // The following three are not used in the allocate
136*c8dee2aaSAndroid Build Coastguard Worker     hwbDesc.stride = 0;
137*c8dee2aaSAndroid Build Coastguard Worker     hwbDesc.rfu0= 0;
138*c8dee2aaSAndroid Build Coastguard Worker     hwbDesc.rfu1= 0;
139*c8dee2aaSAndroid Build Coastguard Worker 
140*c8dee2aaSAndroid Build Coastguard Worker     if (int error = AHardwareBuffer_allocate(&hwbDesc, &buffer)) {
141*c8dee2aaSAndroid Build Coastguard Worker         ERRORF(reporter, "Failed to allocated hardware buffer, error: %d", error);
142*c8dee2aaSAndroid Build Coastguard Worker         cleanup_resources(buffer);
143*c8dee2aaSAndroid Build Coastguard Worker         return;
144*c8dee2aaSAndroid Build Coastguard Worker     }
145*c8dee2aaSAndroid Build Coastguard Worker 
146*c8dee2aaSAndroid Build Coastguard Worker     // Get actual desc for allocated buffer so we know the stride for uploading cpu data.
147*c8dee2aaSAndroid Build Coastguard Worker     AHardwareBuffer_describe(buffer, &hwbDesc);
148*c8dee2aaSAndroid Build Coastguard Worker 
149*c8dee2aaSAndroid Build Coastguard Worker     uint32_t* bufferAddr;
150*c8dee2aaSAndroid Build Coastguard Worker     if (AHardwareBuffer_lock(buffer, AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN, -1, nullptr,
151*c8dee2aaSAndroid Build Coastguard Worker                              reinterpret_cast<void**>(&bufferAddr))) {
152*c8dee2aaSAndroid Build Coastguard Worker         ERRORF(reporter, "Failed to lock hardware buffer");
153*c8dee2aaSAndroid Build Coastguard Worker         cleanup_resources(buffer);
154*c8dee2aaSAndroid Build Coastguard Worker         return;
155*c8dee2aaSAndroid Build Coastguard Worker     }
156*c8dee2aaSAndroid Build Coastguard Worker 
157*c8dee2aaSAndroid Build Coastguard Worker     int bbp = srcBitmap.bytesPerPixel();
158*c8dee2aaSAndroid Build Coastguard Worker     uint32_t* src = (uint32_t*)srcBitmap.getPixels();
159*c8dee2aaSAndroid Build Coastguard Worker     int nextLineStep = DEV_W;
160*c8dee2aaSAndroid Build Coastguard Worker     if (surfaceOrigin == kBottomLeft_GrSurfaceOrigin) {
161*c8dee2aaSAndroid Build Coastguard Worker         nextLineStep = -nextLineStep;
162*c8dee2aaSAndroid Build Coastguard Worker         src += (DEV_H-1)*DEV_W;
163*c8dee2aaSAndroid Build Coastguard Worker     }
164*c8dee2aaSAndroid Build Coastguard Worker     uint32_t* dst = bufferAddr;
165*c8dee2aaSAndroid Build Coastguard Worker     for (int y = 0; y < DEV_H; ++y) {
166*c8dee2aaSAndroid Build Coastguard Worker         memcpy(dst, src, DEV_W * bbp);
167*c8dee2aaSAndroid Build Coastguard Worker         src += nextLineStep;
168*c8dee2aaSAndroid Build Coastguard Worker         dst += hwbDesc.stride;
169*c8dee2aaSAndroid Build Coastguard Worker     }
170*c8dee2aaSAndroid Build Coastguard Worker     AHardwareBuffer_unlock(buffer, nullptr);
171*c8dee2aaSAndroid Build Coastguard Worker 
172*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
173*c8dee2aaSAndroid Build Coastguard Worker     // Wrap AHardwareBuffer in SkImage
174*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
175*c8dee2aaSAndroid Build Coastguard Worker 
176*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImage> image = SkImages::DeferredFromAHardwareBuffer(
177*c8dee2aaSAndroid Build Coastguard Worker             buffer, kPremul_SkAlphaType, nullptr, surfaceOrigin);
178*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, image);
179*c8dee2aaSAndroid Build Coastguard Worker 
180*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
181*c8dee2aaSAndroid Build Coastguard Worker     // Make a surface to draw into
182*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
183*c8dee2aaSAndroid Build Coastguard Worker 
184*c8dee2aaSAndroid Build Coastguard Worker     SkImageInfo imageInfo = SkImageInfo::Make(DEV_W, DEV_H, kRGBA_8888_SkColorType,
185*c8dee2aaSAndroid Build Coastguard Worker                                               kPremul_SkAlphaType);
186*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> surface = SkSurfaces::RenderTarget(context, skgpu::Budgeted::kNo, imageInfo);
187*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, surface);
188*c8dee2aaSAndroid Build Coastguard Worker 
189*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
190*c8dee2aaSAndroid Build Coastguard Worker     // Draw the AHardwareBuffer SkImage into surface
191*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
192*c8dee2aaSAndroid Build Coastguard Worker 
193*c8dee2aaSAndroid Build Coastguard Worker     surface->getCanvas()->drawImage(image, 0, 0);
194*c8dee2aaSAndroid Build Coastguard Worker 
195*c8dee2aaSAndroid Build Coastguard Worker     SkBitmap readbackBitmap;
196*c8dee2aaSAndroid Build Coastguard Worker     readbackBitmap.allocN32Pixels(DEV_W, DEV_H);
197*c8dee2aaSAndroid Build Coastguard Worker 
198*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, surface->readPixels(readbackBitmap, 0, 0));
199*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, check_read(reporter, srcBitmap, readbackBitmap));
200*c8dee2aaSAndroid Build Coastguard Worker 
201*c8dee2aaSAndroid Build Coastguard Worker     // Draw the image a second time to make sure we get the correct origin when we get the cached
202*c8dee2aaSAndroid Build Coastguard Worker     // proxy from the generator.
203*c8dee2aaSAndroid Build Coastguard Worker     surface->getCanvas()->drawImage(image, 0, 0);
204*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, surface->readPixels(readbackBitmap, 0, 0));
205*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, check_read(reporter, srcBitmap, readbackBitmap));
206*c8dee2aaSAndroid Build Coastguard Worker 
207*c8dee2aaSAndroid Build Coastguard Worker     image.reset();
208*c8dee2aaSAndroid Build Coastguard Worker 
209*c8dee2aaSAndroid Build Coastguard Worker     cleanup_resources(buffer);
210*c8dee2aaSAndroid Build Coastguard Worker }
211*c8dee2aaSAndroid Build Coastguard Worker 
212*c8dee2aaSAndroid Build Coastguard Worker // Basic test to make sure we can import an AHardwareBuffer into an SkImage and draw it into a
213*c8dee2aaSAndroid Build Coastguard Worker // surface.
DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(GrAHardwareBuffer_BasicDrawTest,reporter,context_info,CtsEnforcement::kApiLevel_T)214*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(GrAHardwareBuffer_BasicDrawTest,
215*c8dee2aaSAndroid Build Coastguard Worker                                        reporter,
216*c8dee2aaSAndroid Build Coastguard Worker                                        context_info,
217*c8dee2aaSAndroid Build Coastguard Worker                                        CtsEnforcement::kApiLevel_T) {
218*c8dee2aaSAndroid Build Coastguard Worker     basic_draw_test_helper(reporter, context_info, kTopLeft_GrSurfaceOrigin);
219*c8dee2aaSAndroid Build Coastguard Worker     basic_draw_test_helper(reporter, context_info, kBottomLeft_GrSurfaceOrigin);
220*c8dee2aaSAndroid Build Coastguard Worker }
221*c8dee2aaSAndroid Build Coastguard Worker 
surface_draw_test_helper(skiatest::Reporter * reporter,const sk_gpu_test::ContextInfo & info,GrSurfaceOrigin surfaceOrigin)222*c8dee2aaSAndroid Build Coastguard Worker static void surface_draw_test_helper(skiatest::Reporter* reporter,
223*c8dee2aaSAndroid Build Coastguard Worker                                      const sk_gpu_test::ContextInfo& info,
224*c8dee2aaSAndroid Build Coastguard Worker                                      GrSurfaceOrigin surfaceOrigin) {
225*c8dee2aaSAndroid Build Coastguard Worker 
226*c8dee2aaSAndroid Build Coastguard Worker     auto context = info.directContext();
227*c8dee2aaSAndroid Build Coastguard Worker     if (!context->priv().caps()->supportsAHardwareBufferImages()) {
228*c8dee2aaSAndroid Build Coastguard Worker         return;
229*c8dee2aaSAndroid Build Coastguard Worker     }
230*c8dee2aaSAndroid Build Coastguard Worker 
231*c8dee2aaSAndroid Build Coastguard Worker     bool isProtected = context->priv().caps()->supportsProtectedContent();
232*c8dee2aaSAndroid Build Coastguard Worker 
233*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
234*c8dee2aaSAndroid Build Coastguard Worker     // Setup SkBitmaps
235*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
236*c8dee2aaSAndroid Build Coastguard Worker 
237*c8dee2aaSAndroid Build Coastguard Worker     const SkBitmap srcBitmap = make_src_bitmap();
238*c8dee2aaSAndroid Build Coastguard Worker 
239*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
240*c8dee2aaSAndroid Build Coastguard Worker     // Setup AHardwareBuffer
241*c8dee2aaSAndroid Build Coastguard Worker     ///////////////////////////////////////////////////////////////////////////
242*c8dee2aaSAndroid Build Coastguard Worker 
243*c8dee2aaSAndroid Build Coastguard Worker     AHardwareBuffer* buffer = nullptr;
244*c8dee2aaSAndroid Build Coastguard Worker 
245*c8dee2aaSAndroid Build Coastguard Worker     AHardwareBuffer_Desc hwbDesc;
246*c8dee2aaSAndroid Build Coastguard Worker     hwbDesc.width = DEV_W;
247*c8dee2aaSAndroid Build Coastguard Worker     hwbDesc.height = DEV_H;
248*c8dee2aaSAndroid Build Coastguard Worker     hwbDesc.layers = 1;
249*c8dee2aaSAndroid Build Coastguard Worker     hwbDesc.usage = AHARDWAREBUFFER_USAGE_CPU_READ_NEVER |
250*c8dee2aaSAndroid Build Coastguard Worker                     AHARDWAREBUFFER_USAGE_CPU_WRITE_NEVER |
251*c8dee2aaSAndroid Build Coastguard Worker                     AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE |
252*c8dee2aaSAndroid Build Coastguard Worker                     AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT |
253*c8dee2aaSAndroid Build Coastguard Worker                     (isProtected ? AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT : 0);
254*c8dee2aaSAndroid Build Coastguard Worker 
255*c8dee2aaSAndroid Build Coastguard Worker     hwbDesc.format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
256*c8dee2aaSAndroid Build Coastguard Worker     // The following three are not used in the allocate
257*c8dee2aaSAndroid Build Coastguard Worker     hwbDesc.stride = 0;
258*c8dee2aaSAndroid Build Coastguard Worker     hwbDesc.rfu0= 0;
259*c8dee2aaSAndroid Build Coastguard Worker     hwbDesc.rfu1= 0;
260*c8dee2aaSAndroid Build Coastguard Worker 
261*c8dee2aaSAndroid Build Coastguard Worker     if (int error = AHardwareBuffer_allocate(&hwbDesc, &buffer)) {
262*c8dee2aaSAndroid Build Coastguard Worker         ERRORF(reporter, "Failed to allocated hardware buffer, error: %d", error);
263*c8dee2aaSAndroid Build Coastguard Worker         cleanup_resources(buffer);
264*c8dee2aaSAndroid Build Coastguard Worker         return;
265*c8dee2aaSAndroid Build Coastguard Worker     }
266*c8dee2aaSAndroid Build Coastguard Worker 
267*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkSurface> surface =
268*c8dee2aaSAndroid Build Coastguard Worker             SkSurfaces::WrapAndroidHardwareBuffer(context, buffer, surfaceOrigin, nullptr, nullptr);
269*c8dee2aaSAndroid Build Coastguard Worker     if (!surface) {
270*c8dee2aaSAndroid Build Coastguard Worker         ERRORF(reporter, "Failed to make SkSurface.");
271*c8dee2aaSAndroid Build Coastguard Worker         cleanup_resources(buffer);
272*c8dee2aaSAndroid Build Coastguard Worker         return;
273*c8dee2aaSAndroid Build Coastguard Worker     }
274*c8dee2aaSAndroid Build Coastguard Worker 
275*c8dee2aaSAndroid Build Coastguard Worker     surface->getCanvas()->drawImage(srcBitmap.asImage(), 0, 0);
276*c8dee2aaSAndroid Build Coastguard Worker 
277*c8dee2aaSAndroid Build Coastguard Worker     if (!isProtected) {
278*c8dee2aaSAndroid Build Coastguard Worker         // In Protected mode we can't readback so we just test that we can wrap the AHB and
279*c8dee2aaSAndroid Build Coastguard Worker         // draw it w/o errors
280*c8dee2aaSAndroid Build Coastguard Worker         SkBitmap readbackBitmap;
281*c8dee2aaSAndroid Build Coastguard Worker         readbackBitmap.allocN32Pixels(DEV_W, DEV_H);
282*c8dee2aaSAndroid Build Coastguard Worker 
283*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, surface->readPixels(readbackBitmap, 0, 0));
284*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, check_read(reporter, srcBitmap, readbackBitmap));
285*c8dee2aaSAndroid Build Coastguard Worker     }
286*c8dee2aaSAndroid Build Coastguard Worker 
287*c8dee2aaSAndroid Build Coastguard Worker     cleanup_resources(buffer);
288*c8dee2aaSAndroid Build Coastguard Worker }
289*c8dee2aaSAndroid Build Coastguard Worker 
290*c8dee2aaSAndroid Build Coastguard Worker // Test to make sure we can import an AHardwareBuffer into an SkSurface and draw into it.
DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(GrAHardwareBuffer_ImportAsSurface,reporter,context_info,CtsEnforcement::kApiLevel_T)291*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST_FOR_RENDERING_CONTEXTS(GrAHardwareBuffer_ImportAsSurface,
292*c8dee2aaSAndroid Build Coastguard Worker                                        reporter,
293*c8dee2aaSAndroid Build Coastguard Worker                                        context_info,
294*c8dee2aaSAndroid Build Coastguard Worker                                        CtsEnforcement::kApiLevel_T) {
295*c8dee2aaSAndroid Build Coastguard Worker     surface_draw_test_helper(reporter, context_info, kTopLeft_GrSurfaceOrigin);
296*c8dee2aaSAndroid Build Coastguard Worker     surface_draw_test_helper(reporter, context_info, kBottomLeft_GrSurfaceOrigin);
297*c8dee2aaSAndroid Build Coastguard Worker }
298*c8dee2aaSAndroid Build Coastguard Worker 
299*c8dee2aaSAndroid Build Coastguard Worker #endif
300