xref: /aosp_15_r20/external/mesa3d/src/loader/loader_dri_helper.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Permission to use, copy, modify, distribute, and sell this software and its
3  * documentation for any purpose is hereby granted without fee, provided that
4  * the above copyright notice appear in all copies and that both that copyright
5  * notice and this permission notice appear in supporting documentation, and
6  * that the name of the copyright holders not be used in advertising or
7  * publicity pertaining to distribution of the software without specific,
8  * written prior permission.  The copyright holders make no representations
9  * about the suitability of this software for any purpose.  It is provided "as
10  * is" without express or implied warranty.
11  *
12  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
13  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
14  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
15  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
16  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
17  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
18  * OF THIS SOFTWARE.
19  */
20 
21 #ifndef LOADER_DRI_HELPER_H
22 #define LOADER_DRI_HELPER_H
23 
24 #include <stdbool.h>
25 #include <sys/types.h>
26 
27 #include <GL/gl.h> /* mesa_interface needs GL types */
28 #include "mesa_interface.h"
29 #include <c11/threads.h>
30 #include "util/format/u_formats.h"
31 
32 #ifdef HAVE_X11_PLATFORM
33 #include <xcb/xcb.h>
34 #include <xcb/dri3.h>
35 #include <xcb/present.h>
36 
37 struct loader_crtc_info {
38    xcb_randr_crtc_t id;
39    xcb_timestamp_t timestamp;
40 
41    int16_t x, y;
42    uint16_t width, height;
43 
44    unsigned refresh_numerator;
45    unsigned refresh_denominator;
46 };
47 
48 struct loader_screen_resources {
49    mtx_t mtx;
50 
51    xcb_connection_t *conn;
52    xcb_screen_t *screen;
53 
54    xcb_timestamp_t config_timestamp;
55 
56    /* Number of CRTCs with an active mode set */
57    unsigned num_crtcs;
58    struct loader_crtc_info *crtcs;
59 };
60 #endif
61 
62 
63 /**
64  * These formats correspond to the similarly named MESA_FORMAT_*
65  * tokens, except in the native endian of the CPU.  For example, on
66  * little endian __DRI_IMAGE_FORMAT_XRGB8888 corresponds to
67  * MESA_FORMAT_XRGB8888, but MESA_FORMAT_XRGB8888_REV on big endian.
68  *
69  * __DRI_IMAGE_FORMAT_NONE is for images that aren't directly usable
70  * by the driver (YUV planar formats) but serve as a base image for
71  * creating sub-images for the different planes within the image.
72  *
73  * R8, GR88 and NONE should not be used with createImageFromName or
74  * createImage, and are returned by query from sub images created with
75  * createImageFromNames (NONE, see above) and fromPlane (R8 & GR88).
76  */
77 #define __DRI_IMAGE_FORMAT_RGB565       PIPE_FORMAT_B5G6R5_UNORM
78 #define __DRI_IMAGE_FORMAT_XRGB8888     PIPE_FORMAT_BGRX8888_UNORM
79 #define __DRI_IMAGE_FORMAT_ARGB8888     PIPE_FORMAT_BGRA8888_UNORM
80 #define __DRI_IMAGE_FORMAT_ABGR8888     PIPE_FORMAT_RGBA8888_UNORM
81 #define __DRI_IMAGE_FORMAT_XBGR8888     PIPE_FORMAT_RGBX8888_UNORM
82 #define __DRI_IMAGE_FORMAT_R8           PIPE_FORMAT_R8_UNORM
83 #define __DRI_IMAGE_FORMAT_GR88         PIPE_FORMAT_RG88_UNORM
84 #define __DRI_IMAGE_FORMAT_NONE         PIPE_FORMAT_NONE
85 #define __DRI_IMAGE_FORMAT_XRGB2101010  PIPE_FORMAT_B10G10R10X2_UNORM
86 #define __DRI_IMAGE_FORMAT_ARGB2101010  PIPE_FORMAT_B10G10R10A2_UNORM
87 #define __DRI_IMAGE_FORMAT_SARGB8       PIPE_FORMAT_BGRA8888_SRGB
88 #define __DRI_IMAGE_FORMAT_ARGB1555     PIPE_FORMAT_B5G5R5A1_UNORM
89 #define __DRI_IMAGE_FORMAT_R16          PIPE_FORMAT_R16_UNORM
90 #define __DRI_IMAGE_FORMAT_GR1616       PIPE_FORMAT_RG1616_UNORM
91 #define __DRI_IMAGE_FORMAT_XBGR2101010  PIPE_FORMAT_R10G10B10X2_UNORM
92 #define __DRI_IMAGE_FORMAT_ABGR2101010  PIPE_FORMAT_R10G10B10A2_UNORM
93 #define __DRI_IMAGE_FORMAT_SABGR8       PIPE_FORMAT_RGBA8888_SRGB
94 #define __DRI_IMAGE_FORMAT_XBGR16161616F PIPE_FORMAT_R16G16B16X16_FLOAT
95 #define __DRI_IMAGE_FORMAT_ABGR16161616F PIPE_FORMAT_R16G16B16A16_FLOAT
96 #define __DRI_IMAGE_FORMAT_SXRGB8       PIPE_FORMAT_BGRX8888_SRGB
97 #define __DRI_IMAGE_FORMAT_ABGR16161616 PIPE_FORMAT_R16G16B16X16_UNORM
98 #define __DRI_IMAGE_FORMAT_XBGR16161616 PIPE_FORMAT_R16G16B16A16_UNORM
99 #define __DRI_IMAGE_FORMAT_ARGB4444	PIPE_FORMAT_B4G4R4A4_UNORM
100 #define __DRI_IMAGE_FORMAT_XRGB4444	PIPE_FORMAT_B4G4R4X4_UNORM
101 #define __DRI_IMAGE_FORMAT_ABGR4444	PIPE_FORMAT_R4G4B4A4_UNORM
102 #define __DRI_IMAGE_FORMAT_XBGR4444	PIPE_FORMAT_R4G4B4X4_UNORM
103 #define __DRI_IMAGE_FORMAT_XRGB1555	PIPE_FORMAT_B5G5R5X1_UNORM
104 #define __DRI_IMAGE_FORMAT_ABGR1555	PIPE_FORMAT_R5G5B5A1_UNORM
105 #define __DRI_IMAGE_FORMAT_XBGR1555	PIPE_FORMAT_R5G5B5X1_UNORM
106 
107 int
108 loader_image_format_to_fourcc(int format);
109 
110 int
111 loader_fourcc_to_image_format(int format);
112 
113 #ifdef HAVE_X11_PLATFORM
114 void
115 loader_init_screen_resources(struct loader_screen_resources *res,
116                              xcb_connection_t *conn,
117                              xcb_screen_t *screen);
118 bool
119 loader_update_screen_resources(struct loader_screen_resources *res);
120 
121 void
122 loader_destroy_screen_resources(struct loader_screen_resources *res);
123 #endif
124 
125 #endif /* LOADER_DRI_HELPER_H */
126