xref: /aosp_15_r20/external/libdrm/tests/tegra/vic-clear.c (revision 7688df22e49036ff52a766b7101da3a49edadb8c)
1*7688df22SAndroid Build Coastguard Worker /*
2*7688df22SAndroid Build Coastguard Worker  * Copyright © 2018 NVIDIA Corporation
3*7688df22SAndroid Build Coastguard Worker  *
4*7688df22SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*7688df22SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*7688df22SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*7688df22SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*7688df22SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*7688df22SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*7688df22SAndroid Build Coastguard Worker  *
11*7688df22SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included in
12*7688df22SAndroid Build Coastguard Worker  * all copies or substantial portions of the Software.
13*7688df22SAndroid Build Coastguard Worker  *
14*7688df22SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*7688df22SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*7688df22SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17*7688df22SAndroid Build Coastguard Worker  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*7688df22SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*7688df22SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*7688df22SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
21*7688df22SAndroid Build Coastguard Worker  */
22*7688df22SAndroid Build Coastguard Worker 
23*7688df22SAndroid Build Coastguard Worker #include <errno.h>
24*7688df22SAndroid Build Coastguard Worker #include <fcntl.h>
25*7688df22SAndroid Build Coastguard Worker #include <stdio.h>
26*7688df22SAndroid Build Coastguard Worker #include <string.h>
27*7688df22SAndroid Build Coastguard Worker #include <unistd.h>
28*7688df22SAndroid Build Coastguard Worker 
29*7688df22SAndroid Build Coastguard Worker #include "util_math.h"
30*7688df22SAndroid Build Coastguard Worker 
31*7688df22SAndroid Build Coastguard Worker #include "tegra.h"
32*7688df22SAndroid Build Coastguard Worker 
33*7688df22SAndroid Build Coastguard Worker #include "host1x.h"
34*7688df22SAndroid Build Coastguard Worker #include "vic.h"
35*7688df22SAndroid Build Coastguard Worker 
36*7688df22SAndroid Build Coastguard Worker #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
37*7688df22SAndroid Build Coastguard Worker 
main(int argc,char * argv[])38*7688df22SAndroid Build Coastguard Worker int main(int argc, char *argv[])
39*7688df22SAndroid Build Coastguard Worker {
40*7688df22SAndroid Build Coastguard Worker     const unsigned int format = VIC_PIXEL_FORMAT_A8R8G8B8;
41*7688df22SAndroid Build Coastguard Worker     const unsigned int kind = VIC_BLK_KIND_PITCH;
42*7688df22SAndroid Build Coastguard Worker     const unsigned int width = 16, height = 16;
43*7688df22SAndroid Build Coastguard Worker     const char *device = "/dev/dri/renderD128";
44*7688df22SAndroid Build Coastguard Worker     struct drm_tegra_channel *channel;
45*7688df22SAndroid Build Coastguard Worker     struct drm_tegra_pushbuf *pushbuf;
46*7688df22SAndroid Build Coastguard Worker     struct drm_tegra_job *job;
47*7688df22SAndroid Build Coastguard Worker     struct vic_image *output;
48*7688df22SAndroid Build Coastguard Worker     struct drm_tegra *drm;
49*7688df22SAndroid Build Coastguard Worker     unsigned int version;
50*7688df22SAndroid Build Coastguard Worker     struct vic *vic;
51*7688df22SAndroid Build Coastguard Worker     uint32_t *pb;
52*7688df22SAndroid Build Coastguard Worker     int fd, err;
53*7688df22SAndroid Build Coastguard Worker     void *ptr;
54*7688df22SAndroid Build Coastguard Worker 
55*7688df22SAndroid Build Coastguard Worker     if (argc > 1)
56*7688df22SAndroid Build Coastguard Worker         device = argv[1];
57*7688df22SAndroid Build Coastguard Worker 
58*7688df22SAndroid Build Coastguard Worker     fd = open(device, O_RDWR);
59*7688df22SAndroid Build Coastguard Worker     if (fd < 0) {
60*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "open() failed: %s\n", strerror(errno));
61*7688df22SAndroid Build Coastguard Worker         return 1;
62*7688df22SAndroid Build Coastguard Worker     }
63*7688df22SAndroid Build Coastguard Worker 
64*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_new(fd, &drm);
65*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
66*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to open Tegra device: %s\n", strerror(-err));
67*7688df22SAndroid Build Coastguard Worker         close(fd);
68*7688df22SAndroid Build Coastguard Worker         return 1;
69*7688df22SAndroid Build Coastguard Worker     }
70*7688df22SAndroid Build Coastguard Worker 
71*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_channel_open(drm, DRM_TEGRA_VIC, &channel);
72*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
73*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to open channel to VIC: %s\n", strerror(-err));
74*7688df22SAndroid Build Coastguard Worker         return 1;
75*7688df22SAndroid Build Coastguard Worker     }
76*7688df22SAndroid Build Coastguard Worker 
77*7688df22SAndroid Build Coastguard Worker     version = drm_tegra_channel_get_version(channel);
78*7688df22SAndroid Build Coastguard Worker     printf("version: %08x\n", version);
79*7688df22SAndroid Build Coastguard Worker 
80*7688df22SAndroid Build Coastguard Worker     err = vic_new(drm, channel, &vic);
81*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
82*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to create VIC: %s\n", strerror(-err));
83*7688df22SAndroid Build Coastguard Worker         return 1;
84*7688df22SAndroid Build Coastguard Worker     }
85*7688df22SAndroid Build Coastguard Worker 
86*7688df22SAndroid Build Coastguard Worker     err = vic_image_new(vic, width, height, format, kind, DRM_TEGRA_CHANNEL_MAP_READ_WRITE,
87*7688df22SAndroid Build Coastguard Worker                         &output);
88*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
89*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to create output image: %d\n", err);
90*7688df22SAndroid Build Coastguard Worker         return 1;
91*7688df22SAndroid Build Coastguard Worker     }
92*7688df22SAndroid Build Coastguard Worker 
93*7688df22SAndroid Build Coastguard Worker     printf("image: %zu bytes\n", output->size);
94*7688df22SAndroid Build Coastguard Worker 
95*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_bo_map(output->bo, &ptr);
96*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
97*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to map output image: %d\n", err);
98*7688df22SAndroid Build Coastguard Worker         return 1;
99*7688df22SAndroid Build Coastguard Worker     }
100*7688df22SAndroid Build Coastguard Worker 
101*7688df22SAndroid Build Coastguard Worker     memset(ptr, 0xff, output->size);
102*7688df22SAndroid Build Coastguard Worker     drm_tegra_bo_unmap(output->bo);
103*7688df22SAndroid Build Coastguard Worker 
104*7688df22SAndroid Build Coastguard Worker     printf("output: %ux%u\n", output->width, output->height);
105*7688df22SAndroid Build Coastguard Worker     vic_image_dump(output, stdout);
106*7688df22SAndroid Build Coastguard Worker 
107*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_job_new(channel, &job);
108*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
109*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to create job: %s\n", strerror(-err));
110*7688df22SAndroid Build Coastguard Worker         return 1;
111*7688df22SAndroid Build Coastguard Worker     }
112*7688df22SAndroid Build Coastguard Worker 
113*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_job_get_pushbuf(job, &pushbuf);
114*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
115*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to create push buffer: %s\n", strerror(-err));
116*7688df22SAndroid Build Coastguard Worker         return 1;
117*7688df22SAndroid Build Coastguard Worker     }
118*7688df22SAndroid Build Coastguard Worker 
119*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_pushbuf_begin(pushbuf, 32, &pb);
120*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
121*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to prepare push buffer: %s\n", strerror(-err));
122*7688df22SAndroid Build Coastguard Worker         return 1;
123*7688df22SAndroid Build Coastguard Worker     }
124*7688df22SAndroid Build Coastguard Worker 
125*7688df22SAndroid Build Coastguard Worker     err = vic_clear(vic, output, 1023, 0, 0, 1023);
126*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
127*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to clear surface: %s\n", strerror(-err));
128*7688df22SAndroid Build Coastguard Worker         return err;
129*7688df22SAndroid Build Coastguard Worker     }
130*7688df22SAndroid Build Coastguard Worker 
131*7688df22SAndroid Build Coastguard Worker     err = vic->ops->execute(vic, pushbuf, &pb, output, NULL, 0);
132*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
133*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to execute operation: %s\n", strerror(-err));
134*7688df22SAndroid Build Coastguard Worker         return 1;
135*7688df22SAndroid Build Coastguard Worker     }
136*7688df22SAndroid Build Coastguard Worker 
137*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_pushbuf_sync_cond(pushbuf, &pb, vic->syncpt,
138*7688df22SAndroid Build Coastguard Worker                                       DRM_TEGRA_SYNC_COND_OP_DONE);
139*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
140*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to push syncpoint: %s\n", strerror(-err));
141*7688df22SAndroid Build Coastguard Worker         return 1;
142*7688df22SAndroid Build Coastguard Worker     }
143*7688df22SAndroid Build Coastguard Worker 
144*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_pushbuf_end(pushbuf, pb);
145*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
146*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to update push buffer: %s\n", strerror(-err));
147*7688df22SAndroid Build Coastguard Worker         return 1;
148*7688df22SAndroid Build Coastguard Worker     }
149*7688df22SAndroid Build Coastguard Worker 
150*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_job_submit(job, NULL);
151*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
152*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to submit job: %s\n", strerror(-err));
153*7688df22SAndroid Build Coastguard Worker         return 1;
154*7688df22SAndroid Build Coastguard Worker     }
155*7688df22SAndroid Build Coastguard Worker 
156*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_job_wait(job, 1000000000);
157*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
158*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to wait for job: %s\n", strerror(-err));
159*7688df22SAndroid Build Coastguard Worker         return 1;
160*7688df22SAndroid Build Coastguard Worker     }
161*7688df22SAndroid Build Coastguard Worker 
162*7688df22SAndroid Build Coastguard Worker     printf("output: %ux%u\n", output->width, output->height);
163*7688df22SAndroid Build Coastguard Worker     vic_image_dump(output, stdout);
164*7688df22SAndroid Build Coastguard Worker 
165*7688df22SAndroid Build Coastguard Worker     drm_tegra_job_free(job);
166*7688df22SAndroid Build Coastguard Worker     vic_image_free(output);
167*7688df22SAndroid Build Coastguard Worker     vic_free(vic);
168*7688df22SAndroid Build Coastguard Worker     drm_tegra_channel_close(channel);
169*7688df22SAndroid Build Coastguard Worker     drm_tegra_close(drm);
170*7688df22SAndroid Build Coastguard Worker     close(fd);
171*7688df22SAndroid Build Coastguard Worker 
172*7688df22SAndroid Build Coastguard Worker     return 0;
173*7688df22SAndroid Build Coastguard Worker }
174