summaryrefslogtreecommitdiffstats
path: root/src/blueshift_drm_c.h
blob: 3a4f7388d93c23eb2580c5eaafa17d0e9adaaa03 (plain) (blame)
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
/**
 * Copyright © 2014  Mattias Andrée (maandree@member.fsf.org)
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#ifndef BLUESHIFT_DRM_C_H
#define BLUESHIFT_DRM_C_H


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <alloca.h>

#ifndef O_CLOEXEC
  #define O_CLOEXEC  02000000
#endif

/* Requires video group */
#include <xf86drm.h>
#include <xf86drmMode.h>



/**
 * Resources for an open connection to a graphics card
 */
typedef struct _card_connection
{
  /**
   * File descriptor for the connection
   */
  int fd;
  
  /**
   * Card resources
   */
  drmModeRes* res;
  
  /**
   * Resources for open connectors
   */
   drmModeConnector** connectors;
  
} card_connection;



/**
 * Free all resources, but you need to close all connections first
 */
void blueshift_drm_close(void);

/**
 * Get the number of cards present on the system
 * 
 * @return  The number of cards present on the system
 */
int blueshift_drm_card_count(void);

/**
 * Open connection to a graphics card
 * 
 * @param   card_index  The index of the graphics card
 * @return              -1 on failure, otherwise an identifier for the connection to the card
 */
int blueshift_drm_open_card(int card_index);

/**
 * Update the resource, required after `blueshift_drm_open_card`
 * 
 * @param  connection  The identifier for the connection to the card
 */
void blueshift_drm_update_card(int connection);

/**
 * Close connection to the graphics card
 * 
 * @param  connection  The identifier for the connection to the card
 */
void blueshift_drm_close_card(int connection);

/**
 * Return the number of CRTC:s on the opened card
 * 
 * @param   connection  The identifier for the connection to the card
 * @return              The number of CRTC:s on the opened card
 */
int blueshift_drm_crtc_count(int connection);

/**
 * Return the number of connectors on the opened card
 * 
 * @param   connection  The identifier for the connection to the card
 * @return              The number of connectors on the opened card
 */
int blueshift_drm_connector_count(int connection);

/**
 * Return the size of the gamma ramps on a CRTC
 * 
 * @param   connection  The identifier for the connection to the card
 * @param   crtc_index  The index of the CRTC
 * @return              The size of the gamma ramps on a CRTC
 */
int blueshift_drm_gamma_size(int connection, int crtc_index);

/**
 * Get the current gamma ramps of a monitor
 * 
 * @param   connection  The identifier for the connection to the card
 * @param   crtc_index  The index of the CRTC to read from
 * @param   gamma_size  The size a gamma ramp
 * @param   red         Storage location for the red gamma ramp
 * @param   green       Storage location for the green gamma ramp
 * @param   blue        Storage location for the blue gamma ramp
 * @return              Zero on success
 */
int blueshift_drm_get_gamma_ramps(int connection, int crtc_index, int gamma_size, uint16_t* red, uint16_t* green, uint16_t* blue);

/**
 * Set the gamma ramps of the of a monitor
 * 
 * @param   connection  The identifier for the connection to the card
 * @param   crtc_index  The index of the CRTC to read from
 * @param   gamma_size  The size a gamma ramp
 * @param   red         The red gamma ramp
 * @param   green       The green gamma ramp
 * @param   blue        The blue gamma ramp
 * @return              Zero on success
 */
int blueshift_drm_set_gamma_ramps(int connection, int crtc_index, int gamma_size, uint16_t* red, uint16_t* green, uint16_t* blue);

/**
 * Acquire information about a connector
 * 
 * @param  connection       The identifier for the connection to the card
 * @param  connector_index  The index of the connector
 */
void blueshift_drm_open_connector(int connection, int connector_index);

/**
 * Release information about a connector
 * 
 * @param  connection       The identifier for the connection to the card
 * @param  connector_index  The index of the connector
 */
void blueshift_drm_close_connector(int connection, int connector_index);

/**
 * Get the physical width the monitor connected to a connector
 * 
 * @param   connection       The identifier for the connection to the card
 * @param   connector_index  The index of the connector
 * @return                   The physical width of the monitor in millimetres, 0 if unknown or not connected
 */
int blueshift_drm_get_width(int connection, int connector_index);

/**
 * Get the physical height the monitor connected to a connector
 * 
 * @param   connection       The identifier for the connection to the card
 * @param   connector_index  The index of the connector
 * @return                   The physical height of the monitor in millimetres, 0 if unknown or not connected
 */
int blueshift_drm_get_height(int connection, int connector_index);

/**
 * Get whether a monitor is connected to a connector
 * 
 * @param   connection       The identifier for the connection to the card
 * @param   connector_index  The index of the connector
 * @return                   1 if there is a connection, 0 otherwise, -1 if unknown
 */
int blueshift_drm_is_connected(int connection, int connector_index);

/**
 * Get the index of the CRTC of the monitor connected to a connector
 * 
 * @param   connection       The identifier for the connection to the card
 * @param   connector_index  The index of the connector
 * @return                   The index of the CRTC
 */
int blueshift_drm_get_crtc(int connection, int connector_index);

/**
 * Get the index of the type of a connector
 * 
 * @param   connection       The identifier for the connection to the card
 * @param   connector_index  The index of the connector
 * @return                   The connector type by index, 0 for unknown
 */
int blueshift_drm_get_connector_type_index(int connection, int connector_index);

/**
 * Get the name of the type of a connector
 * 
 * @param   connection       The identifier for the connection to the card
 * @param   connector_index  The index of the connector
 * @return                   The connector type by name, "Unknown" if not identifiable,
 *                           "Unrecognised" if Blueshift does not recognise it.
 */
const char* blueshift_drm_get_connector_type_name(int connection, int connector_index);

/**
 * Get the extended display identification data for the monitor connected to a connector
 * 
 * @param   connection       The identifier for the connection to the card
 * @param   connector_index  The index of the connector
 * @param   edid             Storage location for the EDID, it should be 128 bytes, 256 bytes + zero termination if hex
 * @param   size             The size allocated to `edid` excluding your zero termination
 * @param   hexadecimal      Whether to convert to hexadecimal representation, this is preferable
 * @return                   The length of the found value, 0 if none, as if hex is false
 */
long blueshift_drm_get_edid(int connection, int connector_index, char* edid, long size, int hexadecimal);



#endif