/** * 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 . */ #ifndef BLUESHIFT_DRM_C_H #define BLUESHIFT_DRM_C_H #include #include #include #include #include #include #include #include #include #ifndef O_CLOEXEC # define O_CLOEXEC 02000000 #endif #ifndef PATH_MAX # define PATH_MAX 4096 #endif /* Requires video group */ #include #include /** * 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) __attribute__((pure)); /** * 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) __attribute__((pure)); /** * 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) __attribute__((pure)); /** * 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) __attribute__((pure)); /** * 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) __attribute__((pure)); /** * 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) __attribute__((pure)); /** * 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) __attribute__((pure)); /** * 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