summaryrefslogtreecommitdiff
path: root/src/gallium/state_trackers/egl/drm/native_drm.h
blob: 18cebf4e276dfdf6729f45b08e31503152f8d94f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/*
 * Mesa 3-D graphics library
 * Version:  7.8
 *
 * Copyright (C) 2010 Chia-I Wu <olv@0xlab.org>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

#ifndef _NATIVE_DRM_H_
#define _NATIVE_DRM_H_

#include <xf86drm.h>
#include <xf86drmMode.h>

#include "pipe/p_compiler.h"
#include "util/u_format.h"
#include "pipe/p_state.h"
#include "state_tracker/drm_driver.h"

#include "common/native.h"
#include "common/native_helper.h"

#ifdef HAVE_WAYLAND_BACKEND
#include "common/native_wayland_drm_bufmgr_helper.h"
#endif

#include "gbm_gallium_drmint.h"

struct drm_config;
struct drm_crtc;
struct drm_connector;
struct drm_mode;
struct drm_surface;

struct drm_display {
   struct native_display base;

   const struct native_event_handler *event_handler;

   struct gbm_gallium_drm_device *gbmdrm;
   int own_gbm;
   int fd;
   char *device_name;
   struct drm_config *config;

   /* for modesetting */
   drmModeResPtr resources;
   struct drm_connector *connectors;
   int num_connectors;

   struct drm_surface **shown_surfaces;
   /* save the original settings of the CRTCs */
   struct drm_crtc *saved_crtcs;

#ifdef HAVE_WAYLAND_BACKEND
   struct wl_drm *wl_server_drm; /* for EGL_WL_bind_wayland_display */
#endif
};

struct drm_config {
   struct native_config base;
};

struct drm_crtc {
   drmModeCrtcPtr crtc;
   uint32_t connectors[32];
   int num_connectors;
};

struct drm_framebuffer {
   struct pipe_resource *texture;
   boolean is_passive;

   uint32_t buffer_id;
};

struct drm_surface {
   struct native_surface base;
   struct drm_display *drmdpy;

   struct resource_surface *rsurf;
   enum pipe_format color_format;
   int width, height;

   unsigned int sequence_number;
   struct drm_framebuffer front_fb, back_fb;

   boolean is_shown;
   struct drm_crtc current_crtc;

   boolean have_pageflip;
};

struct drm_connector {
   struct native_connector base;

   uint32_t connector_id;
   drmModeConnectorPtr connector;
   struct drm_mode *drm_modes;
   int num_modes;
};

struct drm_mode {
   struct native_mode base;
   drmModeModeInfo mode;
};

static INLINE struct drm_display *
drm_display(const struct native_display *ndpy)
{
   return (struct drm_display *) ndpy;
}

static INLINE struct drm_config *
drm_config(const struct native_config *nconf)
{
   return (struct drm_config *) nconf;
}

static INLINE struct drm_surface *
drm_surface(const struct native_surface *nsurf)
{
   return (struct drm_surface *) nsurf;
}

static INLINE struct drm_connector *
drm_connector(const struct native_connector *nconn)
{
   return (struct drm_connector *) nconn;
}

static INLINE struct drm_mode *
drm_mode(const struct native_mode *nmode)
{
   return (struct drm_mode *) nmode;
}

boolean
drm_display_init_modeset(struct native_display *ndpy);

void
drm_display_fini_modeset(struct native_display *ndpy);

struct native_surface *
drm_display_create_surface_from_resource(struct native_display *ndpy,
                                         struct pipe_resource *resource);

#endif /* _NATIVE_DRM_H_ */