xref: /aosp_15_r20/external/skia/example/external_client/src/ganesh_metal.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2024 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/SkCanvas.h"
9 #include "include/core/SkRRect.h"
10 #include "include/core/SkRect.h"
11 #include "include/core/SkStream.h"
12 #include "include/core/SkSurface.h"
13 #include "include/gpu/ganesh/GrDirectContext.h"
14 #include "include/gpu/ganesh/SkSurfaceGanesh.h"
15 #include "include/gpu/ganesh/mtl/GrMtlDirectContext.h"
16 #include "include/gpu/ganesh/mtl/GrMtlBackendContext.h"
17 #include "include/encode/SkJpegEncoder.h"
18 
19 #include "ganesh_metal_context_helper.h"
20 
main(int argc,char * argv[])21 int main(int argc, char *argv[]) {
22     if (argc != 2) {
23         printf("Usage: %s <name.jpeg>\n", argv[0]);
24         return 1;
25     }
26 
27     SkFILEWStream output(argv[1]);
28     if (!output.isValid()) {
29         printf("Cannot open output file %s\n", argv[1]);
30         return 1;
31     }
32 
33     GrMtlBackendContext backendContext = GetMetalContext();
34     sk_sp<GrDirectContext> ctx = GrDirectContexts::MakeMetal(backendContext);
35     if (!ctx) {
36         printf("Could not make metal context\n");
37         return 1;
38     }
39     printf("Context made, now to make the surface\n");
40 
41     SkImageInfo imageInfo =
42             SkImageInfo::Make(200, 400, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
43 
44     sk_sp<SkSurface> surface =
45             SkSurfaces::RenderTarget(ctx.get(), skgpu::Budgeted::kYes, imageInfo);
46     if (!surface) {
47         printf("Could not make surface from Metal DirectContext\n");
48         return 1;
49     }
50 
51     SkCanvas* canvas = surface->getCanvas();
52     canvas->clear(SK_ColorCYAN);
53     SkRRect rrect = SkRRect::MakeRectXY(SkRect::MakeLTRB(10, 20, 50, 70), 10, 10);
54 
55     SkPaint paint;
56     paint.setColor(SK_ColorMAGENTA);
57     paint.setAntiAlias(true);
58 
59     canvas->drawRRect(rrect, paint);
60 
61     ctx->flush();
62 
63     printf("Drew to surface, now doing readback\n");
64     sk_sp<SkImage> img = surface->makeImageSnapshot();
65     sk_sp<SkData> jpeg = SkJpegEncoder::Encode(ctx.get(), img.get(), {});
66     if (!jpeg) {
67         printf("Readback of pixels (or encoding) failed\n");
68         return 1;
69     }
70     output.write(jpeg->data(), jpeg->size());
71     output.fsync();
72     return 0;
73 }
74