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 "tegra.h"
30*7688df22SAndroid Build Coastguard Worker
31*7688df22SAndroid Build Coastguard Worker #include "host1x.h"
32*7688df22SAndroid Build Coastguard Worker #include "vic.h"
33*7688df22SAndroid Build Coastguard Worker
34*7688df22SAndroid Build Coastguard Worker /* clear output image to red */
clear(struct vic * vic,struct drm_tegra_channel * channel,struct vic_image * output)35*7688df22SAndroid Build Coastguard Worker static int clear(struct vic *vic, struct drm_tegra_channel *channel,
36*7688df22SAndroid Build Coastguard Worker struct vic_image *output)
37*7688df22SAndroid Build Coastguard Worker {
38*7688df22SAndroid Build Coastguard Worker struct drm_tegra_pushbuf *pushbuf;
39*7688df22SAndroid Build Coastguard Worker struct drm_tegra_job *job;
40*7688df22SAndroid Build Coastguard Worker uint32_t *ptr;
41*7688df22SAndroid Build Coastguard Worker int err;
42*7688df22SAndroid Build Coastguard Worker
43*7688df22SAndroid Build Coastguard Worker err = drm_tegra_job_new(channel, &job);
44*7688df22SAndroid Build Coastguard Worker if (err < 0) {
45*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to create job: %s\n", strerror(-err));
46*7688df22SAndroid Build Coastguard Worker return 1;
47*7688df22SAndroid Build Coastguard Worker }
48*7688df22SAndroid Build Coastguard Worker
49*7688df22SAndroid Build Coastguard Worker err = drm_tegra_job_get_pushbuf(job, &pushbuf);
50*7688df22SAndroid Build Coastguard Worker if (err < 0) {
51*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to create push buffer: %s\n", strerror(-err));
52*7688df22SAndroid Build Coastguard Worker return 1;
53*7688df22SAndroid Build Coastguard Worker }
54*7688df22SAndroid Build Coastguard Worker
55*7688df22SAndroid Build Coastguard Worker err = vic_clear(vic, output, 1023, 1023, 0, 0);
56*7688df22SAndroid Build Coastguard Worker if (err < 0) {
57*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to clear surface: %s\n", strerror(-err));
58*7688df22SAndroid Build Coastguard Worker return err;
59*7688df22SAndroid Build Coastguard Worker }
60*7688df22SAndroid Build Coastguard Worker
61*7688df22SAndroid Build Coastguard Worker err = drm_tegra_pushbuf_begin(pushbuf, 32, &ptr);
62*7688df22SAndroid Build Coastguard Worker if (err < 0) {
63*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to prepare push buffer: %s\n", strerror(-err));
64*7688df22SAndroid Build Coastguard Worker return err;
65*7688df22SAndroid Build Coastguard Worker }
66*7688df22SAndroid Build Coastguard Worker
67*7688df22SAndroid Build Coastguard Worker err = vic->ops->execute(vic, pushbuf, &ptr, output, NULL, 0);
68*7688df22SAndroid Build Coastguard Worker if (err < 0) {
69*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to execute operation: %s\n", strerror(-err));
70*7688df22SAndroid Build Coastguard Worker return err;
71*7688df22SAndroid Build Coastguard Worker }
72*7688df22SAndroid Build Coastguard Worker
73*7688df22SAndroid Build Coastguard Worker err = drm_tegra_pushbuf_sync_cond(pushbuf, &ptr, vic->syncpt,
74*7688df22SAndroid Build Coastguard Worker DRM_TEGRA_SYNC_COND_OP_DONE);
75*7688df22SAndroid Build Coastguard Worker if (err < 0) {
76*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to push syncpoint: %s\n", strerror(-err));
77*7688df22SAndroid Build Coastguard Worker return err;
78*7688df22SAndroid Build Coastguard Worker }
79*7688df22SAndroid Build Coastguard Worker
80*7688df22SAndroid Build Coastguard Worker err = drm_tegra_pushbuf_end(pushbuf, ptr);
81*7688df22SAndroid Build Coastguard Worker if (err < 0) {
82*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to update push buffer: %s\n", strerror(-err));
83*7688df22SAndroid Build Coastguard Worker return err;
84*7688df22SAndroid Build Coastguard Worker }
85*7688df22SAndroid Build Coastguard Worker
86*7688df22SAndroid Build Coastguard Worker err = drm_tegra_job_submit(job, NULL);
87*7688df22SAndroid Build Coastguard Worker if (err < 0) {
88*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to submit job: %s\n", strerror(-err));
89*7688df22SAndroid Build Coastguard Worker return err;
90*7688df22SAndroid Build Coastguard Worker }
91*7688df22SAndroid Build Coastguard Worker
92*7688df22SAndroid Build Coastguard Worker err = drm_tegra_job_wait(job, 1000000000);
93*7688df22SAndroid Build Coastguard Worker if (err < 0) {
94*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to wait for job: %s\n", strerror(-err));
95*7688df22SAndroid Build Coastguard Worker return err;
96*7688df22SAndroid Build Coastguard Worker }
97*7688df22SAndroid Build Coastguard Worker
98*7688df22SAndroid Build Coastguard Worker drm_tegra_job_free(job);
99*7688df22SAndroid Build Coastguard Worker
100*7688df22SAndroid Build Coastguard Worker return 0;
101*7688df22SAndroid Build Coastguard Worker }
102*7688df22SAndroid Build Coastguard Worker
103*7688df22SAndroid Build Coastguard Worker /* fill bottom half of image to blue */
fill(struct vic * vic,struct drm_tegra_channel * channel,struct vic_image * output)104*7688df22SAndroid Build Coastguard Worker static int fill(struct vic *vic, struct drm_tegra_channel *channel,
105*7688df22SAndroid Build Coastguard Worker struct vic_image *output)
106*7688df22SAndroid Build Coastguard Worker {
107*7688df22SAndroid Build Coastguard Worker struct drm_tegra_pushbuf *pushbuf;
108*7688df22SAndroid Build Coastguard Worker struct drm_tegra_job *job;
109*7688df22SAndroid Build Coastguard Worker uint32_t *ptr;
110*7688df22SAndroid Build Coastguard Worker int err;
111*7688df22SAndroid Build Coastguard Worker
112*7688df22SAndroid Build Coastguard Worker err = drm_tegra_job_new(channel, &job);
113*7688df22SAndroid Build Coastguard Worker if (err < 0) {
114*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to create job: %s\n", strerror(-err));
115*7688df22SAndroid Build Coastguard Worker return 1;
116*7688df22SAndroid Build Coastguard Worker }
117*7688df22SAndroid Build Coastguard Worker
118*7688df22SAndroid Build Coastguard Worker err = drm_tegra_job_get_pushbuf(job, &pushbuf);
119*7688df22SAndroid Build Coastguard Worker if (err < 0) {
120*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to create push buffer: %s\n", strerror(-err));
121*7688df22SAndroid Build Coastguard Worker return 1;
122*7688df22SAndroid Build Coastguard Worker }
123*7688df22SAndroid Build Coastguard Worker
124*7688df22SAndroid Build Coastguard Worker err = drm_tegra_pushbuf_begin(pushbuf, 32, &ptr);
125*7688df22SAndroid Build Coastguard Worker if (err < 0) {
126*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to prepare push buffer: %s\n", strerror(-err));
127*7688df22SAndroid Build Coastguard Worker return err;
128*7688df22SAndroid Build Coastguard Worker }
129*7688df22SAndroid Build Coastguard Worker
130*7688df22SAndroid Build Coastguard Worker err = vic->ops->fill(vic, output, 0, output->height / 2, output->width - 1,
131*7688df22SAndroid Build Coastguard Worker output->height -1, 1023, 0, 0, 1023);
132*7688df22SAndroid Build Coastguard Worker if (err < 0) {
133*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to fill surface: %s\n", strerror(-err));
134*7688df22SAndroid Build Coastguard Worker return err;
135*7688df22SAndroid Build Coastguard Worker }
136*7688df22SAndroid Build Coastguard Worker
137*7688df22SAndroid Build Coastguard Worker err = vic->ops->execute(vic, pushbuf, &ptr, output, NULL, 0);
138*7688df22SAndroid Build Coastguard Worker if (err < 0) {
139*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to execute operation: %s\n", strerror(-err));
140*7688df22SAndroid Build Coastguard Worker return err;
141*7688df22SAndroid Build Coastguard Worker }
142*7688df22SAndroid Build Coastguard Worker
143*7688df22SAndroid Build Coastguard Worker err = drm_tegra_pushbuf_sync_cond(pushbuf, &ptr, vic->syncpt,
144*7688df22SAndroid Build Coastguard Worker DRM_TEGRA_SYNC_COND_OP_DONE);
145*7688df22SAndroid Build Coastguard Worker if (err < 0) {
146*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to push syncpoint: %s\n", strerror(-err));
147*7688df22SAndroid Build Coastguard Worker return err;
148*7688df22SAndroid Build Coastguard Worker }
149*7688df22SAndroid Build Coastguard Worker
150*7688df22SAndroid Build Coastguard Worker err = drm_tegra_pushbuf_end(pushbuf, ptr);
151*7688df22SAndroid Build Coastguard Worker if (err < 0) {
152*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to update push buffer: %s\n", strerror(-err));
153*7688df22SAndroid Build Coastguard Worker return err;
154*7688df22SAndroid Build Coastguard Worker }
155*7688df22SAndroid Build Coastguard Worker
156*7688df22SAndroid Build Coastguard Worker err = drm_tegra_job_submit(job, NULL);
157*7688df22SAndroid Build Coastguard Worker if (err < 0) {
158*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to submit job: %s\n", strerror(-err));
159*7688df22SAndroid Build Coastguard Worker return err;
160*7688df22SAndroid Build Coastguard Worker }
161*7688df22SAndroid Build Coastguard Worker
162*7688df22SAndroid Build Coastguard Worker err = drm_tegra_job_wait(job, 1000000000);
163*7688df22SAndroid Build Coastguard Worker if (err < 0) {
164*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to wait for job: %s\n", strerror(-err));
165*7688df22SAndroid Build Coastguard Worker return err;
166*7688df22SAndroid Build Coastguard Worker }
167*7688df22SAndroid Build Coastguard Worker
168*7688df22SAndroid Build Coastguard Worker drm_tegra_job_free(job);
169*7688df22SAndroid Build Coastguard Worker
170*7688df22SAndroid Build Coastguard Worker return 0;
171*7688df22SAndroid Build Coastguard Worker }
172*7688df22SAndroid Build Coastguard Worker
173*7688df22SAndroid Build Coastguard Worker /* blit image */
blit(struct vic * vic,struct drm_tegra_channel * channel,struct vic_image * output,struct vic_image * input)174*7688df22SAndroid Build Coastguard Worker static int blit(struct vic *vic, struct drm_tegra_channel *channel,
175*7688df22SAndroid Build Coastguard Worker struct vic_image *output, struct vic_image *input)
176*7688df22SAndroid Build Coastguard Worker {
177*7688df22SAndroid Build Coastguard Worker struct drm_tegra_pushbuf *pushbuf;
178*7688df22SAndroid Build Coastguard Worker struct drm_tegra_job *job;
179*7688df22SAndroid Build Coastguard Worker uint32_t *ptr;
180*7688df22SAndroid Build Coastguard Worker int err;
181*7688df22SAndroid Build Coastguard Worker
182*7688df22SAndroid Build Coastguard Worker err = drm_tegra_job_new(channel, &job);
183*7688df22SAndroid Build Coastguard Worker if (err < 0) {
184*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to create job: %s\n", strerror(-err));
185*7688df22SAndroid Build Coastguard Worker return 1;
186*7688df22SAndroid Build Coastguard Worker }
187*7688df22SAndroid Build Coastguard Worker
188*7688df22SAndroid Build Coastguard Worker err = drm_tegra_job_get_pushbuf(job, &pushbuf);
189*7688df22SAndroid Build Coastguard Worker if (err < 0) {
190*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to create push buffer: %s\n", strerror(-err));
191*7688df22SAndroid Build Coastguard Worker return 1;
192*7688df22SAndroid Build Coastguard Worker }
193*7688df22SAndroid Build Coastguard Worker
194*7688df22SAndroid Build Coastguard Worker err = drm_tegra_pushbuf_begin(pushbuf, 32, &ptr);
195*7688df22SAndroid Build Coastguard Worker if (err < 0) {
196*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to prepare push buffer: %s\n", strerror(-err));
197*7688df22SAndroid Build Coastguard Worker return err;
198*7688df22SAndroid Build Coastguard Worker }
199*7688df22SAndroid Build Coastguard Worker
200*7688df22SAndroid Build Coastguard Worker err = vic->ops->blit(vic, output, input);
201*7688df22SAndroid Build Coastguard Worker if (err < 0) {
202*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to blit surface: %s\n", strerror(-err));
203*7688df22SAndroid Build Coastguard Worker return err;
204*7688df22SAndroid Build Coastguard Worker }
205*7688df22SAndroid Build Coastguard Worker
206*7688df22SAndroid Build Coastguard Worker err = vic->ops->execute(vic, pushbuf, &ptr, output, &input, 1);
207*7688df22SAndroid Build Coastguard Worker if (err < 0) {
208*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to execute operation: %s\n", strerror(-err));
209*7688df22SAndroid Build Coastguard Worker return err;
210*7688df22SAndroid Build Coastguard Worker }
211*7688df22SAndroid Build Coastguard Worker
212*7688df22SAndroid Build Coastguard Worker err = drm_tegra_pushbuf_sync_cond(pushbuf, &ptr, vic->syncpt,
213*7688df22SAndroid Build Coastguard Worker DRM_TEGRA_SYNC_COND_OP_DONE);
214*7688df22SAndroid Build Coastguard Worker if (err < 0) {
215*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to push syncpoint: %s\n", strerror(-err));
216*7688df22SAndroid Build Coastguard Worker return err;
217*7688df22SAndroid Build Coastguard Worker }
218*7688df22SAndroid Build Coastguard Worker
219*7688df22SAndroid Build Coastguard Worker err = drm_tegra_pushbuf_end(pushbuf, ptr);
220*7688df22SAndroid Build Coastguard Worker if (err < 0) {
221*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to update push buffer: %s\n", strerror(-err));
222*7688df22SAndroid Build Coastguard Worker return err;
223*7688df22SAndroid Build Coastguard Worker }
224*7688df22SAndroid Build Coastguard Worker
225*7688df22SAndroid Build Coastguard Worker err = drm_tegra_job_submit(job, NULL);
226*7688df22SAndroid Build Coastguard Worker if (err < 0) {
227*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to submit job: %s\n", strerror(-err));
228*7688df22SAndroid Build Coastguard Worker return err;
229*7688df22SAndroid Build Coastguard Worker }
230*7688df22SAndroid Build Coastguard Worker
231*7688df22SAndroid Build Coastguard Worker err = drm_tegra_job_wait(job, 1000000000);
232*7688df22SAndroid Build Coastguard Worker if (err < 0) {
233*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to wait for job: %s\n", strerror(-err));
234*7688df22SAndroid Build Coastguard Worker return err;
235*7688df22SAndroid Build Coastguard Worker }
236*7688df22SAndroid Build Coastguard Worker
237*7688df22SAndroid Build Coastguard Worker drm_tegra_job_free(job);
238*7688df22SAndroid Build Coastguard Worker
239*7688df22SAndroid Build Coastguard Worker return 0;
240*7688df22SAndroid Build Coastguard Worker }
241*7688df22SAndroid Build Coastguard Worker
main(int argc,char * argv[])242*7688df22SAndroid Build Coastguard Worker int main(int argc, char *argv[])
243*7688df22SAndroid Build Coastguard Worker {
244*7688df22SAndroid Build Coastguard Worker const unsigned int format = VIC_PIXEL_FORMAT_A8R8G8B8;
245*7688df22SAndroid Build Coastguard Worker const unsigned int kind = VIC_BLK_KIND_PITCH;
246*7688df22SAndroid Build Coastguard Worker const unsigned int width = 16, height = 16;
247*7688df22SAndroid Build Coastguard Worker const char *device = "/dev/dri/renderD128";
248*7688df22SAndroid Build Coastguard Worker struct drm_tegra_channel *channel;
249*7688df22SAndroid Build Coastguard Worker struct vic_image *input, *output;
250*7688df22SAndroid Build Coastguard Worker struct drm_tegra *drm;
251*7688df22SAndroid Build Coastguard Worker unsigned int version;
252*7688df22SAndroid Build Coastguard Worker struct vic *vic;
253*7688df22SAndroid Build Coastguard Worker int fd, err;
254*7688df22SAndroid Build Coastguard Worker
255*7688df22SAndroid Build Coastguard Worker if (argc > 1)
256*7688df22SAndroid Build Coastguard Worker device = argv[1];
257*7688df22SAndroid Build Coastguard Worker
258*7688df22SAndroid Build Coastguard Worker fd = open(device, O_RDWR);
259*7688df22SAndroid Build Coastguard Worker if (fd < 0) {
260*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "open() failed: %s\n", strerror(errno));
261*7688df22SAndroid Build Coastguard Worker return 1;
262*7688df22SAndroid Build Coastguard Worker }
263*7688df22SAndroid Build Coastguard Worker
264*7688df22SAndroid Build Coastguard Worker err = drm_tegra_new(fd, &drm);
265*7688df22SAndroid Build Coastguard Worker if (err < 0) {
266*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to open Tegra device: %s\n", strerror(-err));
267*7688df22SAndroid Build Coastguard Worker close(fd);
268*7688df22SAndroid Build Coastguard Worker return 1;
269*7688df22SAndroid Build Coastguard Worker }
270*7688df22SAndroid Build Coastguard Worker
271*7688df22SAndroid Build Coastguard Worker err = drm_tegra_channel_open(drm, DRM_TEGRA_VIC, &channel);
272*7688df22SAndroid Build Coastguard Worker if (err < 0) {
273*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to open channel to VIC: %s\n", strerror(-err));
274*7688df22SAndroid Build Coastguard Worker return 1;
275*7688df22SAndroid Build Coastguard Worker }
276*7688df22SAndroid Build Coastguard Worker
277*7688df22SAndroid Build Coastguard Worker version = drm_tegra_channel_get_version(channel);
278*7688df22SAndroid Build Coastguard Worker printf("version: %08x\n", version);
279*7688df22SAndroid Build Coastguard Worker
280*7688df22SAndroid Build Coastguard Worker err = vic_new(drm, channel, &vic);
281*7688df22SAndroid Build Coastguard Worker if (err < 0) {
282*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to create VIC: %s\n", strerror(-err));
283*7688df22SAndroid Build Coastguard Worker return 1;
284*7688df22SAndroid Build Coastguard Worker }
285*7688df22SAndroid Build Coastguard Worker
286*7688df22SAndroid Build Coastguard Worker err = vic_image_new(vic, width, height, format, kind, DRM_TEGRA_CHANNEL_MAP_READ_WRITE,
287*7688df22SAndroid Build Coastguard Worker &input);
288*7688df22SAndroid Build Coastguard Worker if (err < 0) {
289*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to create input image: %d\n", err);
290*7688df22SAndroid Build Coastguard Worker return 1;
291*7688df22SAndroid Build Coastguard Worker }
292*7688df22SAndroid Build Coastguard Worker
293*7688df22SAndroid Build Coastguard Worker err = vic_image_new(vic, width, height, format, kind, DRM_TEGRA_CHANNEL_MAP_READ_WRITE,
294*7688df22SAndroid Build Coastguard Worker &output);
295*7688df22SAndroid Build Coastguard Worker if (err < 0) {
296*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to create output image: %d\n", err);
297*7688df22SAndroid Build Coastguard Worker return 1;
298*7688df22SAndroid Build Coastguard Worker }
299*7688df22SAndroid Build Coastguard Worker
300*7688df22SAndroid Build Coastguard Worker err = clear(vic, channel, input);
301*7688df22SAndroid Build Coastguard Worker if (err < 0) {
302*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to clear image: %s\n", strerror(-err));
303*7688df22SAndroid Build Coastguard Worker return 1;
304*7688df22SAndroid Build Coastguard Worker }
305*7688df22SAndroid Build Coastguard Worker
306*7688df22SAndroid Build Coastguard Worker err = fill(vic, channel, input);
307*7688df22SAndroid Build Coastguard Worker if (err < 0) {
308*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to fill rectangle: %s\n", strerror(-err));
309*7688df22SAndroid Build Coastguard Worker return 1;
310*7688df22SAndroid Build Coastguard Worker }
311*7688df22SAndroid Build Coastguard Worker
312*7688df22SAndroid Build Coastguard Worker err = blit(vic, channel, output, input);
313*7688df22SAndroid Build Coastguard Worker if (err < 0) {
314*7688df22SAndroid Build Coastguard Worker fprintf(stderr, "failed to blit image: %s\n", strerror(-err));
315*7688df22SAndroid Build Coastguard Worker return 1;
316*7688df22SAndroid Build Coastguard Worker }
317*7688df22SAndroid Build Coastguard Worker
318*7688df22SAndroid Build Coastguard Worker printf("input: %ux%u\n", input->width, input->height);
319*7688df22SAndroid Build Coastguard Worker vic_image_dump(input, stdout);
320*7688df22SAndroid Build Coastguard Worker
321*7688df22SAndroid Build Coastguard Worker printf("output: %ux%u\n", output->width, output->height);
322*7688df22SAndroid Build Coastguard Worker vic_image_dump(output, stdout);
323*7688df22SAndroid Build Coastguard Worker
324*7688df22SAndroid Build Coastguard Worker vic_image_free(output);
325*7688df22SAndroid Build Coastguard Worker vic_image_free(input);
326*7688df22SAndroid Build Coastguard Worker
327*7688df22SAndroid Build Coastguard Worker vic_free(vic);
328*7688df22SAndroid Build Coastguard Worker drm_tegra_channel_close(channel);
329*7688df22SAndroid Build Coastguard Worker drm_tegra_close(drm);
330*7688df22SAndroid Build Coastguard Worker close(fd);
331*7688df22SAndroid Build Coastguard Worker
332*7688df22SAndroid Build Coastguard Worker return 0;
333*7688df22SAndroid Build Coastguard Worker }
334