From 782093450b535c9957521fe40641e3de3619254c Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Wed, 12 Mar 2014 20:32:23 +0100 Subject: m + cython side of drm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- Makefile | 14 +-- TODO | 1 + src/blueshift_drm.pyx | 307 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/blueshift_drm_c.c | 11 +- 4 files changed, 319 insertions(+), 14 deletions(-) create mode 100644 src/blueshift_drm.pyx diff --git a/Makefile b/Makefile index bdc5bdd..9d3f78a 100644 --- a/Makefile +++ b/Makefile @@ -37,9 +37,9 @@ COMMAND ?= blueshift PKGNAME ?= blueshift # Bindings for display server access -SERVER_BINDINGS ?= randr vidmode +SERVER_BINDINGS ?= randr vidmode drm # Executable bindings for display server access -EXECS ?= idcrtc iccprofile drm +EXECS ?= idcrtc iccprofile # Executable library files EXECLIBS = $(foreach E,$(EXECS),blueshift_$(E)) @@ -62,7 +62,7 @@ FLAGS = $$($(PKGCONFIG) --cflags $(LIBS)) -std=$(STD) $(WARN) $(OPTIMISE) -fPIC # Resource files DATAFILES = 2deg 10deg redshift redshift_old # Python source files -PYFILES = __main__.py colour.py curve.py monitor.py solar.py icc.py adhoc.py +PYFILES = __main__.py colour.py curve.py monitor.py solar.py icc.py adhoc.py backlight.py # Library files CBINDINGS = $(foreach B,$(SERVER_BINDINGS),blueshift_$(B).so) # Configuration script example files @@ -95,11 +95,7 @@ bin/blueshift_iccprofile: obj/blueshift_iccprofile.o @mkdir -p bin $(CC) $(FLAGS) $$($(PKGCONFIG) --libs $($(LIBS_))) -o $@ $^ -bin/blueshift_drm: LIBS_=LIBS_drm -bin/blueshift_drm: obj/blueshift_drm_c.o - @mkdir -p bin - $(CC) $(FLAGS) $$($(PKGCONFIG) --libs $($(LIBS_))) -o $@ $^ - +bin/blueshift_drm.so: LIBS_=LIBS_drm bin/blueshift_randr.so: LIBS_=LIBS_randr bin/blueshift_vidmode.so: LIBS_=LIBS_vidmode bin/%.so: obj/%.o obj/%_c.o @@ -325,5 +321,5 @@ uninstall: .PHONY: all clean: - -rm -r bin obj src/blueshift_randr.c src/blueshift_vidmode.c blueshift.{info,pdf,ps,dvi} + -rm -r bin obj src/blueshift_{randr,vidmode,drm}.c blueshift.{info,pdf,ps,dvi} diff --git a/TODO b/TODO index cf27481..47c3b2b 100644 --- a/TODO +++ b/TODO @@ -10,4 +10,5 @@ Medium priority: Low priority: Add wayland support Add mir support + Do less malloc:s and free:s diff --git a/src/blueshift_drm.pyx b/src/blueshift_drm.pyx new file mode 100644 index 0000000..30f07c1 --- /dev/null +++ b/src/blueshift_drm.pyx @@ -0,0 +1,307 @@ +# -*- python -*- + +# 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 . + +cimport cython +from libc.stdlib cimport malloc, free + + +cdef extern void blueshift_drm_close() +cdef extern int blueshift_drm_card_count() +cdef extern int blueshift_drm_open_card(int card_index) +cdef extern void blueshift_drm_update_card(int connection) +cdef extern void blueshift_drm_close_card(int connection) +cdef extern int blueshift_drm_crtc_count(int connection) +cdef extern int blueshift_drm_connector_count(int connection) +cdef extern int blueshift_drm_gamma_size(int connection, int crtc_index) +cdef extern int blueshift_drm_get_gamma_ramps(int connection, int crtc_index, int gamma_size, + unsigned short int* red, + unsigned short int* green, + unsigned short int* blue) +cdef extern int blueshift_drm_set_gamma_ramps(int connection, int crtc_index, int gamma_size, + unsigned short int* red, + unsigned short int* green, + unsigned short int* blue) +cdef extern void blueshift_drm_open_connector(int connection, int connector_index) +cdef extern void blueshift_drm_close_connector(int connection, int connector_index) +cdef extern int blueshift_drm_get_width(int connection, int connector_index) +cdef extern int blueshift_drm_get_height(int connection, int connector_index) +cdef extern int blueshift_drm_is_connected(int connection, int connector_index) +cdef extern int blueshift_drm_get_crtc(int connection, int connector_index) +cdef extern int blueshift_drm_get_connector_type_index(int connection, int connector_index) +cdef extern const char* blueshift_drm_get_connector_type_name(int connection, int connector_index) +cdef extern long int blueshift_drm_get_edid(int connection, int connector_index, char* edid, + long int size, int hexadecimal) + + +def drm_close(): + ''' + Free all resources, but you need to close all connections first + ''' + blueshift_drm_close() + + +def drm_card_count(): + ''' + Get the number of cards present on the system + + @return :int The number of cards present on the system + ''' + return blueshift_drm_card_count() + + +def drm_open_card(int card_index): + ''' + Open connection to a graphics card + + @param card_index The index of the graphics card + @return :int -1 on failure, otherwise an identifier for the connection to the card + ''' + return blueshift_drm_open_card(card_index) + + +def drm_update_card(int connection): + ''' + Update the resource, required after `blueshift_drm_open_card` + + @param connection The identifier for the connection to the card + ''' + blueshift_drm_update_card(connection) + + +def drm_close_card(int connection): + ''' + Close connection to the graphics card + + @param connection The identifier for the connection to the card + ''' + blueshift_drm_close_card(connection) + + +def drm_crtc_count(int connection): + ''' + Return the number of CRTC:s on the opened card + + @param connection The identifier for the connection to the card + @return :int The number of CRTC:s on the opened card + ''' + return blueshift_drm_crtc_count(connection) + + +def drm_connector_count(int connection): + ''' + Return the number of connectors on the opened card + + @param connection The identifier for the connection to the card + @return :int The number of connectors on the opened card + ''' + return blueshift_drm_connector_count(connection) + + +def drm_gamma_size(int connection, int crtc_index): + ''' + 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 :int The size of the gamma ramps on a CRTC + ''' + return blueshift_drm_gamma_size(connection, crtc_index) + + +def drm_get_gamma_ramps(int connection, int crtc_index, int gamma_size): + ''' + Get 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 + @return :(r:list, g:list, b:list)? The current red, green and blue colour curves + ''' + cdef unsigned short int* r + cdef unsigned short int* g + cdef unsigned short int* b + r = malloc(gamma_size * 2) + g = malloc(gamma_size * 2) + b = malloc(gamma_size * 2) + if (r is NULL) or (g is NULL) or (b is NULL): + raise MemoryError() + rc = blueshift_drm_get_gamma_ramps(connection, crtc_index, gamma_size, r, g, b) + if rc == 0: + rc_r, rc_g, rc_b = [], [], [] + for i in range(gamma_size): + rc_r.append(r[i]) + rc_g.append(g[i]) + rc_b.append(b[i]) + free(r) + free(g) + free(b) + return (rc_r, rc_g, rc_b) + else: + free(r) + free(g) + free(b) + return None + + +def drm_set_gamma_ramps(int connection, int crtc_index, int gamma_size, r_curve, g_curve, b_curve): + ''' + 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 r_curve:list The red gamma ramp + @param g_curve:list The green gamma ramp + @param b_curve:list The blue gamma ramp + @return :int Zero on success + ''' + cdef unsigned short int* r + cdef unsigned short int* g + cdef unsigned short int* b + r = malloc(gamma_size * 2) + g = malloc(gamma_size * 2) + b = malloc(gamma_size * 2) + if (r is NULL) or (g is NULL) or (b is NULL): + raise MemoryError() + for i in range(gamma_size): + r[i] = r_curve[i] & 0xFFFF + g[i] = g_curve[i] & 0xFFFF + b[i] = b_curve[i] & 0xFFFF + rc = blueshift_drm_set_gamma_ramps(connection, crtc_index, gamma_size, r, g, b) + free(r) + free(g) + free(b) + return rc + + +def drm_open_connector(int connection, int connector_index): + ''' + Acquire information about a connector + + @param connection The identifier for the connection to the card + @param connector_index The index of the connector + ''' + blueshift_drm_open_connector(connection, connector_index) + + +def drm_close_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 + ''' + blueshift_drm_close_connector(connection, connector_index) + + +def drm_get_width(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 :int The physical width of the monitor in millimetres, 0 if unknown or not connected + ''' + return blueshift_drm_get_width(connection, connector_index) + + +def drm_get_height(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 :int The physical height of the monitor in millimetres, 0 if unknown or not connected + ''' + return blueshift_drm_get_height(connection, connector_index) + + +def drm_is_connected(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 :int 1 if there is a connection, 0 otherwise, -1 if unknown + ''' + return blueshift_drm_is_connected(connection, connector_index) + + +def drm_get_crtc(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 :int The index of the CRTC + ''' + return blueshift_drm_get_crtc(connection, connector_index) + + +def drm_get_connector_type_index(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 :int The connector type by index, 0 for unknown + ''' + return blueshift_drm_get_connector_type_index(connection, connector_index) + + +def drm_get_connector_type_name(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 :str The connector type by name, "Unknown" if not identifiable, + "Unrecognised" if Blueshift does not recognise it. + ''' + return blueshift_drm_get_connector_type_name(connection, connector_index) + + +def drm_get_edid(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 + @return :str? The extended display identification data for the monitor + ''' + cdef long int size + cdef long int got + cdef char* edid + cdef bytes rc + + size = 256 + edid = malloc(size + 1) + got = blueshift_drm_get_edid(connection, connector_index, edid, size, 1) + + if got == 0: + free(edid) + return None + + if got * 2 > size: + size = got + blueshift_drm_get_edid(connection, connector_index, edid, size, 1) + + edid[got * 2] = 0 + rc = edid + free(edid) + return rc + diff --git a/src/blueshift_drm_c.c b/src/blueshift_drm_c.c index 121b689..a521545 100644 --- a/src/blueshift_drm_c.c +++ b/src/blueshift_drm_c.c @@ -89,7 +89,7 @@ static long card_connection_reuse_size = 0; /** - * Free all resources, but your need to close all connections first + * Free all resources, but you need to close all connections first */ void blueshift_drm_close() { @@ -446,10 +446,10 @@ const char* blueshift_drm_get_connector_type_name(int connection, int connector_ * @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 hex Whether to convert to hexadecimal representation, this is preferable + * @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 hex) +long blueshift_drm_get_edid(int connection, int connector_index, char* edid, long size, int hexadecimal) { card_connection* card = card_connections + connection; drmModeConnector* connector = *(card->connectors + connector_index); @@ -464,7 +464,7 @@ long blueshift_drm_get_edid(int connection, int connector_index, char* edid, lon if (!strcmp("EDID", prop->name)) { drmModePropertyBlobRes* blob = drmModeGetPropertyBlob(fd, connector->prop_values[prop_i]); - if (hex) + if (hexadecimal) { rc += blob->length; uint32_t n = size / 2; @@ -489,7 +489,7 @@ long blueshift_drm_get_edid(int connection, int connector_index, char* edid, lon } - +/* int main(int argc, char** argv) { int card_n = blueshift_drm_card_count(); @@ -607,4 +607,5 @@ int main(int argc, char** argv) blueshift_drm_close(); return 0; } +*/ -- cgit v1.2.3-70-g09d2