xref: /aosp_15_r20/external/libdrm/tests/tegra/gr2d-fill.c (revision 7688df22e49036ff52a766b7101da3a49edadb8c)
1*7688df22SAndroid Build Coastguard Worker /*
2*7688df22SAndroid Build Coastguard Worker  * Copyright © 2014 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 #ifdef HAVE_CONFIG_H
24*7688df22SAndroid Build Coastguard Worker #  include "config.h"
25*7688df22SAndroid Build Coastguard Worker #endif
26*7688df22SAndroid Build Coastguard Worker 
27*7688df22SAndroid Build Coastguard Worker #include <errno.h>
28*7688df22SAndroid Build Coastguard Worker #include <fcntl.h>
29*7688df22SAndroid Build Coastguard Worker #include <stdbool.h>
30*7688df22SAndroid Build Coastguard Worker #include <stdint.h>
31*7688df22SAndroid Build Coastguard Worker #include <stdio.h>
32*7688df22SAndroid Build Coastguard Worker #include <stdlib.h>
33*7688df22SAndroid Build Coastguard Worker #include <string.h>
34*7688df22SAndroid Build Coastguard Worker #include <unistd.h>
35*7688df22SAndroid Build Coastguard Worker 
36*7688df22SAndroid Build Coastguard Worker #include <sys/ioctl.h>
37*7688df22SAndroid Build Coastguard Worker 
38*7688df22SAndroid Build Coastguard Worker #include "xf86drm.h"
39*7688df22SAndroid Build Coastguard Worker #include "xf86drmMode.h"
40*7688df22SAndroid Build Coastguard Worker #include "drm_fourcc.h"
41*7688df22SAndroid Build Coastguard Worker 
42*7688df22SAndroid Build Coastguard Worker #include "drm-test-tegra.h"
43*7688df22SAndroid Build Coastguard Worker #include "tegra.h"
44*7688df22SAndroid Build Coastguard Worker 
main(int argc,char * argv[])45*7688df22SAndroid Build Coastguard Worker int main(int argc, char *argv[])
46*7688df22SAndroid Build Coastguard Worker {
47*7688df22SAndroid Build Coastguard Worker     uint32_t format = DRM_FORMAT_XRGB8888;
48*7688df22SAndroid Build Coastguard Worker     struct drm_tegra_gr2d *gr2d;
49*7688df22SAndroid Build Coastguard Worker     struct drm_framebuffer *fb;
50*7688df22SAndroid Build Coastguard Worker     struct drm_screen *screen;
51*7688df22SAndroid Build Coastguard Worker     unsigned int pitch, size;
52*7688df22SAndroid Build Coastguard Worker     struct drm_tegra_bo *bo;
53*7688df22SAndroid Build Coastguard Worker     struct drm_tegra *drm;
54*7688df22SAndroid Build Coastguard Worker     uint32_t handle;
55*7688df22SAndroid Build Coastguard Worker     int fd, err;
56*7688df22SAndroid Build Coastguard Worker     void *ptr;
57*7688df22SAndroid Build Coastguard Worker 
58*7688df22SAndroid Build Coastguard Worker     fd = drm_open(argv[1]);
59*7688df22SAndroid Build Coastguard Worker     if (fd < 0) {
60*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to open DRM device %s: %s\n", argv[1],
61*7688df22SAndroid Build Coastguard Worker                 strerror(errno));
62*7688df22SAndroid Build Coastguard Worker         return 1;
63*7688df22SAndroid Build Coastguard Worker     }
64*7688df22SAndroid Build Coastguard Worker 
65*7688df22SAndroid Build Coastguard Worker     err = drm_screen_open(&screen, fd);
66*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
67*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to open screen: %s\n", strerror(-err));
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_new(fd, &drm);
72*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
73*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to create Tegra DRM context: %s\n",
74*7688df22SAndroid Build Coastguard Worker                 strerror(-err));
75*7688df22SAndroid Build Coastguard Worker         return 1;
76*7688df22SAndroid Build Coastguard Worker     }
77*7688df22SAndroid Build Coastguard Worker 
78*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_gr2d_open(drm, &gr2d);
79*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
80*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to open gr2d channel: %s\n",
81*7688df22SAndroid Build Coastguard Worker                 strerror(-err));
82*7688df22SAndroid Build Coastguard Worker         return 1;
83*7688df22SAndroid Build Coastguard Worker     }
84*7688df22SAndroid Build Coastguard Worker 
85*7688df22SAndroid Build Coastguard Worker     pitch = screen->width * screen->bpp / 8;
86*7688df22SAndroid Build Coastguard Worker     size = pitch * screen->height;
87*7688df22SAndroid Build Coastguard Worker 
88*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_bo_new(drm, 0, size, &bo);
89*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
90*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to create buffer object: %s\n",
91*7688df22SAndroid Build Coastguard Worker                 strerror(-err));
92*7688df22SAndroid Build Coastguard Worker         return 1;
93*7688df22SAndroid Build Coastguard Worker     }
94*7688df22SAndroid Build Coastguard Worker 
95*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_bo_get_handle(bo, &handle);
96*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
97*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to get handle to buffer object: %s\n",
98*7688df22SAndroid Build Coastguard Worker                 strerror(-err));
99*7688df22SAndroid Build Coastguard Worker         return 1;
100*7688df22SAndroid Build Coastguard Worker     }
101*7688df22SAndroid Build Coastguard Worker 
102*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_bo_map(bo, &ptr);
103*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
104*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to map buffer object: %s\n",
105*7688df22SAndroid Build Coastguard Worker                 strerror(-err));
106*7688df22SAndroid Build Coastguard Worker         return 1;
107*7688df22SAndroid Build Coastguard Worker     }
108*7688df22SAndroid Build Coastguard Worker 
109*7688df22SAndroid Build Coastguard Worker     memset(ptr, 0xff, size);
110*7688df22SAndroid Build Coastguard Worker 
111*7688df22SAndroid Build Coastguard Worker     err = drm_framebuffer_new(&fb, screen, handle, screen->width,
112*7688df22SAndroid Build Coastguard Worker                               screen->height, pitch, format, bo);
113*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
114*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to create framebuffer: %s\n",
115*7688df22SAndroid Build Coastguard Worker                 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_screen_set_framebuffer(screen, fb);
120*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
121*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to display framebuffer: %s\n",
122*7688df22SAndroid Build Coastguard Worker                 strerror(-err));
123*7688df22SAndroid Build Coastguard Worker         return 1;
124*7688df22SAndroid Build Coastguard Worker     }
125*7688df22SAndroid Build Coastguard Worker 
126*7688df22SAndroid Build Coastguard Worker     sleep(1);
127*7688df22SAndroid Build Coastguard Worker 
128*7688df22SAndroid Build Coastguard Worker     err = drm_tegra_gr2d_fill(gr2d, fb, fb->width / 4, fb->height / 4,
129*7688df22SAndroid Build Coastguard Worker                               fb->width / 2, fb->height / 2, 0x00000000);
130*7688df22SAndroid Build Coastguard Worker     if (err < 0) {
131*7688df22SAndroid Build Coastguard Worker         fprintf(stderr, "failed to fill rectangle: %s\n",
132*7688df22SAndroid Build Coastguard Worker                 strerror(-err));
133*7688df22SAndroid Build Coastguard Worker         return 1;
134*7688df22SAndroid Build Coastguard Worker     }
135*7688df22SAndroid Build Coastguard Worker 
136*7688df22SAndroid Build Coastguard Worker     sleep(1);
137*7688df22SAndroid Build Coastguard Worker 
138*7688df22SAndroid Build Coastguard Worker     drm_framebuffer_free(fb);
139*7688df22SAndroid Build Coastguard Worker     drm_tegra_bo_unref(bo);
140*7688df22SAndroid Build Coastguard Worker     drm_tegra_gr2d_close(gr2d);
141*7688df22SAndroid Build Coastguard Worker     drm_tegra_close(drm);
142*7688df22SAndroid Build Coastguard Worker     drm_screen_close(screen);
143*7688df22SAndroid Build Coastguard Worker     drm_close(fd);
144*7688df22SAndroid Build Coastguard Worker 
145*7688df22SAndroid Build Coastguard Worker     return 0;
146*7688df22SAndroid Build Coastguard Worker }
147