lib: move connector_type_str and co to drmtest
PATCH 1/5 lib: move connector_type_str and co to drmtest
These are used by multiple test cases, so make them shared.
--- demos/intel_sprite_on.c | 58 ++++------------------------------------------ lib/drmtest.c | 54 +++++++++++++++++++++++++++++++++++++++++++ lib/drmtest.h | 3 +++ tests/testdisplay.c | 61 ++++--------------------------------------------- 4 files changed, 65 insertions(+), 111 deletions(-)
demos/intel_sprite_on.c +4 -54
@@ -53,56 +53,6 @@#define ARRAY_SIZE (arr) (sizeof(arr) / sizeof((arr)[0])) -struct type_name { -int type; -const char *name; -}; - -#define type_name_fn (res) \ - static const char * res##_str(int type) { \ - unsigned int i; \ - for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \ - if (res##_names[i].type == type) \ - return res##_names[i].name; \ - } \ - return "(invalid)"; \ - } - -struct type_name encoder_type_names[] = { - {DRM_MODE_ENCODER_NONE ,"none" }, - {DRM_MODE_ENCODER_DAC ,"DAC" }, - {DRM_MODE_ENCODER_TMDS ,"TMDS" }, - {DRM_MODE_ENCODER_LVDS ,"LVDS" }, - {DRM_MODE_ENCODER_TVDAC ,"TVDAC" }, -}; -type_name_fn (encoder_type) - -struct type_name connector_status_names[] = { - {DRM_MODE_CONNECTED ,"connected" }, - {DRM_MODE_DISCONNECTED ,"disconnected" }, - {DRM_MODE_UNKNOWNCONNECTION ,"unknown" }, -}; -type_name_fn (connector_status) - -struct type_name connector_type_names[] = { - { DRM_MODE_CONNECTOR_Unknown,"unknown" }, - {DRM_MODE_CONNECTOR_VGA ,"VGA" }, - {DRM_MODE_CONNECTOR_DVII ,"DVI-I" }, - {DRM_MODE_CONNECTOR_DVID ,"DVI-D" }, - {DRM_MODE_CONNECTOR_DVIA ,"DVI-A" }, - { DRM_MODE_CONNECTOR_Composite,"composite" }, - {DRM_MODE_CONNECTOR_SVIDEO ,"s-video" }, - {DRM_MODE_CONNECTOR_LVDS ,"LVDS" }, - { DRM_MODE_CONNECTOR_Component,"component" }, - { DRM_MODE_CONNECTOR_9PinDIN,"9-pin DIN" }, - { DRM_MODE_CONNECTOR_DisplayPort,"DisplayPort" }, - {DRM_MODE_CONNECTOR_HDMIA ,"HDMI-A" }, - {DRM_MODE_CONNECTOR_HDMIB ,"HDMI-B" }, - {DRM_MODE_CONNECTOR_TV ,"TV" }, - { DRM_MODE_CONNECTOR_eDP,"Embedded DisplayPort" }, -}; -type_name_fn (connector_type) -/* * Mode setting with the kernel interfaces is a bit of a chore. * First you have to find the connector in question and make sure the
@@ -157,8 +107,8 @@ static void dump_connectors(int gfx_fd, drmModeRes *resources)printf ("%d\t%d\t%s\t%s\t%dx%d\t\t%d\n" , connector->connector_id, connector->encoder_id, -connector_status_str (connector->connection), -connector_type_str (connector->connector_type), +kmstest_connector_status_str (connector->connection), +kmstest_connector_type_str (connector->connector_type), connector->mmWidth, connector->mmHeight, connector->count_modes);
@@ -744,14 +694,14 @@ static void ricochet(int tiled, int sprite_w, int sprite_h, curr_connector.mode.flags, curr_connector.encoder->encoder_id, curr_connector.encoder->encoder_type, -encoder_type_str (curr_connector.encoder->encoder_type), +kmstest_encoder_type_str (curr_connector.encoder->encoder_type), curr_connector.encoder->crtc_id, curr_connector.encoder->possible_crtcs, curr_connector.encoder->possible_clones, curr_connector.connector->connector_id, curr_connector.connector->encoder_id, curr_connector.connector->connector_type, -connector_type_str (curr_connector.connector->connector_type), +kmstest_connector_type_str (curr_connector.connector->connector_type), curr_connector.connector->connector_type_id); printf("Sprite surface dimensions = %dx%d\n"
lib/drmtest.c +54 -0
60 lines not on this page · raw message
lib/drmtest.h +3 -0
@@ -119,6 +119,9 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,void kmstest_remove_fb (int fd,int fb_id);void kmstest_dump_mode (drmModeModeInfo *mode);int kmstest_get_pipe_from_crtc_id (int fd,int crtc_id); +const char *kmstest_encoder_type_str (int type); +const char *kmstest_connector_status_str (int type); +const char *kmstest_connector_type_str (int type);inline static void _do_or_die (const char *function,int line,int ret) {
tests/testdisplay.c +4 -57
85 lines not on this page · raw message
Signature · 1 line
1.8.1.2
PATCH 2/5 lib: add kmstest_cairo_printf_line
--- lib/drmtest.c | 106 ++++++++++++++++++++++++++++------------------------ lib/drmtest.h | 13 +++++++ tests/testdisplay.c | 96 ++++++++++++++--------------------------------- 3 files changed, 99 insertions(+), 116 deletions(-)
lib/drmtest.c +57 -49
@@ -907,45 +907,55 @@ paint_test_patterns(cairo_t *cr, int width, int height)paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,1 ,1 ); } -enum corner { - topleft, - topright, - bottomleft, - bottomright, -}; - -static void -paint_marker (cairo_t *cr,int x,int y,char *str,enum corner text_location) +int kmstest_cairo_printf_line (cairo_t *cr,enum kmstest_text_align align, +double yspacing,const char *fmt, ...) { +double x, y, xofs, yofs;cairo_text_extents_t extents; -int xoff, yoff; +char *text; +va_list ap; +int ret; -cairo_set_font_size (cr,18 ); -cairo_text_extents (cr, str, &extents); +va_start (ap, fmt); + ret =vasprintf (&text, fmt, ap); +assert (ret >=0 ); +va_end (ap); -switch (text_location) { -case topleft: - xoff =-20 ; - xoff -= extents.width; - yoff =-20 ; -break ; -case topright: - xoff =20 ; - yoff =-20 ; -break ; -case bottomleft: - xoff =-20 ; - xoff -= extents.width; - yoff =20 ; -break ; -case bottomright: - xoff =20 ; - yoff =20 ; -break ; -default : - xoff =0 ; - yoff =0 ; - } +cairo_text_extents (cr, text, &extents); + + xofs = yofs =0 ; +if (align & align_right) + xofs = -extents.width; +else if (align & align_hcenter) + xofs = -extents.width /2 ; + +if (align & align_top) + yofs = extents.height; +else if (align & align_vcenter) + yofs = extents.height /2 ; + +cairo_get_current_point (cr, &x, &y); +if (xofs || yofs) +cairo_rel_move_to (cr, xofs, yofs); + +cairo_text_path (cr, text); +cairo_set_source_rgb (cr,0 ,0 ,0 ); +cairo_stroke_preserve (cr); +cairo_set_source_rgb (cr,1 ,1 ,1 ); +cairo_fill (cr); + +cairo_move_to (cr, x, y + extents.height + yspacing); + +free (text); + +return extents.width; +} + +static void +paint_marker (cairo_t *cr,int x,int y) +{ +enum kmstest_text_align align; +int xoff, yoff;cairo_move_to (cr, x, y -20 );cairo_line_to (cr, x, y +20 );
@@ -960,12 +970,15 @@ paint_marker(cairo_t *cr, int x, int y, char *str, enum corner text_location)cairo_set_line_width (cr,2 );cairo_stroke (cr); + xoff = x ?-20 :20 ; + align = x ? align_right : align_left; + + yoff = y ?-20 :20 ; + align |= y ? align_bottom : align_top; +cairo_move_to (cr, x + xoff, y + yoff); -cairo_text_path (cr, str); -cairo_set_source_rgb (cr,0 ,0 ,0 ); -cairo_stroke_preserve (cr); -cairo_set_source_rgb (cr,1 ,1 ,1 ); -cairo_fill (cr); +cairo_set_font_size (cr,18 ); +kmstest_cairo_printf_line (cr, align,0 ,"(%d, %d)" , x, y); } unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
@@ -977,7 +990,6 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,cairo_surface_t *surface;cairo_status_t status;cairo_t *cr; -char buf[128 ];unsigned int fb_id; surface = paint_allocate_surface(fd, width, height, depth, bpp,
@@ -991,14 +1003,10 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,cairo_set_line_cap (cr,CAIRO_LINE_CAP_SQUARE );/* Paint corner markers */ -snprintf (buf,sizeof buf,"(%d, %d)" ,0 ,0 ); -paint_marker (cr,0 ,0 , buf, bottomright); -snprintf (buf,sizeof buf,"(%d, %d)" , width,0 ); -paint_marker (cr, width,0 , buf, bottomleft); -snprintf (buf,sizeof buf,"(%d, %d)" ,0 , height); -paint_marker (cr,0 , height, buf, topright); -snprintf (buf,sizeof buf,"(%d, %d)" , width, height); -paint_marker (cr, width, height, buf, topleft); +paint_marker (cr,0 ,0 ); +paint_marker (cr, width,0 ); +paint_marker (cr,0 , height); +paint_marker (cr, width, height);if (paint_func)paint_func (cr, width, height, func_arg);
lib/drmtest.h +13 -0
@@ -109,6 +109,19 @@ struct kmstest_fb {unsigned size; }; +enum kmstest_text_align { + align_left, + align_bottom = align_left, + align_right =0x01 , + align_top =0x02 , + align_vcenter =0x04 , + align_hcenter =0x08 , +}; + +int kmstest_cairo_printf_line (cairo_t *cr,enum kmstest_text_align align, +double yspacing,const char *fmt, ...) + __attribute__((format (printf,4 ,5 ))); +typedef void (*kmstest_paint_func )(cairo_t *cr,int width,int height,void *priv); unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
tests/testdisplay.c +29 -67
115 lines not on this page · raw message
Signature · 1 line
1.8.1.2
Re: [igt PATCH 2/5] lib: add kmstest_cairo_printf_line
This patch is big and doing considerable changes in paint_marker besides add cairo_printf line... doesn' t it deserves a split?
Quoted 301 lines · Imre Deak
Signed-off-by Imre Deak <[email protected]>--- lib/drmtest.c | 106 ++++++++++++++++++++++++++++------------------------ lib/drmtest.h | 13 +++++++ tests/testdisplay.c | 96 ++++++++++++++--------------------------------- 3 files changed, 99 insertions(+), 116 deletions(-)lib/drmtest.c +57
-49@@ -907,45 +907,55 @@ paint_test_patterns(cairo_t *cr, int width, int height)paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,1 ,1 ); } -enum corner { - topleft, - topright, - bottomleft, - bottomright, -}; - -static void -paint_marker (cairo_t *cr,int x,int y,char *str,enum corner text_location) +int kmstest_cairo_printf_line (cairo_t *cr,enum kmstest_text_align align, +double yspacing,const char *fmt, ...) { +double x, y, xofs, yofs;cairo_text_extents_t extents; -int xoff, yoff; +char *text; +va_list ap; +int ret; -cairo_set_font_size (cr,18 ); -cairo_text_extents (cr, str, &extents); +va_start (ap, fmt); + ret =vasprintf (&text, fmt, ap); +assert (ret >=0 ); +va_end (ap); -switch (text_location) { -case topleft: - xoff =-20 ; - xoff -= extents.width; - yoff =-20 ; -break ; -case topright: - xoff =20 ; - yoff =-20 ; -break ; -case bottomleft: - xoff =-20 ; - xoff -= extents.width; - yoff =20 ; -break ; -case bottomright: - xoff =20 ; - yoff =20 ; -break ; -default : - xoff =0 ; - yoff =0 ; - } +cairo_text_extents (cr, text, &extents); + + xofs = yofs =0 ; +if (align & align_right) + xofs = -extents.width; +else if (align & align_hcenter) + xofs = -extents.width /2 ; + +if (align & align_top) + yofs = extents.height; +else if (align & align_vcenter) + yofs = extents.height /2 ; + +cairo_get_current_point (cr, &x, &y); +if (xofs || yofs) +cairo_rel_move_to (cr, xofs, yofs); + +cairo_text_path (cr, text); +cairo_set_source_rgb (cr,0 ,0 ,0 ); +cairo_stroke_preserve (cr); +cairo_set_source_rgb (cr,1 ,1 ,1 ); +cairo_fill (cr); + +cairo_move_to (cr, x, y + extents.height + yspacing); + +free (text); + +return extents.width; +} + +static void +paint_marker (cairo_t *cr,int x,int y) +{ +enum kmstest_text_align align; +int xoff, yoff;cairo_move_to (cr, x, y -20 );cairo_line_to (cr, x, y +20 );@@ -960,12 +970,15 @@ paint_marker(cairo_t *cr, int x, int y, char *str, enum corner text_location)cairo_set_line_width (cr,2 );cairo_stroke (cr); + xoff = x ?-20 :20 ; + align = x ? align_right : align_left; + + yoff = y ?-20 :20 ; + align |= y ? align_bottom : align_top; +cairo_move_to (cr, x + xoff, y + yoff); -cairo_text_path (cr, str); -cairo_set_source_rgb (cr,0 ,0 ,0 ); -cairo_stroke_preserve (cr); -cairo_set_source_rgb (cr,1 ,1 ,1 ); -cairo_fill (cr); +cairo_set_font_size (cr,18 ); +kmstest_cairo_printf_line (cr, align,0 ,"(%d, %d)" , x, y); } unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,@@ -977,7 +990,6 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,cairo_surface_t *surface;cairo_status_t status;cairo_t *cr; -char buf[128 ];unsigned int fb_id; surface = paint_allocate_surface(fd, width, height, depth, bpp,@@ -991,14 +1003,10 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,cairo_set_line_cap (cr,CAIRO_LINE_CAP_SQUARE );/* Paint corner markers */ -snprintf (buf,sizeof buf,"(%d, %d)" ,0 ,0 ); -paint_marker (cr,0 ,0 , buf, bottomright); -snprintf (buf,sizeof buf,"(%d, %d)" , width,0 ); -paint_marker (cr, width,0 , buf, bottomleft); -snprintf (buf,sizeof buf,"(%d, %d)" ,0 , height); -paint_marker (cr,0 , height, buf, topright); -snprintf (buf,sizeof buf,"(%d, %d)" , width, height); -paint_marker (cr, width, height, buf, topleft); +paint_marker (cr,0 ,0 ); +paint_marker (cr, width,0 ); +paint_marker (cr,0 , height); +paint_marker (cr, width, height);if (paint_func)paint_func (cr, width, height, func_arg);lib/drmtest.h +13
-0@@ -109,6 +109,19 @@ struct kmstest_fb {unsigned size; }; +enum kmstest_text_align { + align_left, + align_bottom = align_left, + align_right =0x01 , + align_top =0x02 , + align_vcenter =0x04 , + align_hcenter =0x08 , +}; + +int kmstest_cairo_printf_line (cairo_t *cr,enum kmstest_text_align align, +double yspacing,const char *fmt, ...) + __attribute__((format (printf,4 ,5 ))); +typedef void (*kmstest_paint_func )(cairo_t *cr,int width,int height,void *priv); unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,tests/testdisplay.c +29
-68@@ -331,86 +331,48 @@ static void paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv) {struct connector *c = priv; -cairo_text_extents_t name_extents, mode_extents; -char name_buf[128 ], mode_buf[128 ]; -int i, x, y, modes_x, modes_y; +double str_width; +double x, y, top_y; +double max_width; +int i; -/* Get text extents for each string */ -snprintf (name_buf,sizeof name_buf,"%s" , -kmstest_connector_type_str (c->connector->connector_type)); -cairo_set_font_size (cr,48 );cairo_select_font_face (cr,"Helvetica" ,CAIRO_FONT_SLANT_NORMAL ,CAIRO_FONT_WEIGHT_NORMAL ); -cairo_text_extents (cr, name_buf, &name_extents); - -snprintf (mode_buf,sizeof mode_buf,"%s @ %dHz on %s encoder" , - c->mode.name, c->mode.vrefresh, -kmstest_encoder_type_str (c->encoder->encoder_type)); -cairo_set_font_size (cr,36 ); -cairo_text_extents (cr, mode_buf, &mode_extents); +cairo_move_to (cr, l_width /2 , l_height /2 ); -/* Paint output name */ - x = l_width /2 ; - x -= name_extents.width /2 ; - y = l_height /2 ; - y -= (name_extents.height /2 ) - (mode_extents.height /2 ) -10 ; +/* Print connector and mode name */ cairo_set_font_size (cr,48 ); -cairo_move_to (cr, x, y); -cairo_text_path (cr, name_buf); -cairo_set_source_rgb (cr,0 ,0 ,0 ); -cairo_stroke_preserve (cr); -cairo_set_source_rgb (cr,1 ,1 ,1 ); -cairo_fill (cr); - -/* Paint mode name */ - x = l_width /2 ; - x -= mode_extents.width /2 ; - modes_x = x; - y = l_height /2 ; - y += (mode_extents.height /2 ) + (name_extents.height /2 ) +10 ; +kmstest_cairo_printf_line (cr, align_hcenter,10 ,"%s" , +kmstest_connector_type_str (c->connector->connector_type)); +cairo_set_font_size (cr,36 ); -cairo_move_to (cr, x, y); -cairo_text_path (cr, mode_buf); -cairo_set_source_rgb (cr,0 ,0 ,0 ); -cairo_stroke_preserve (cr); -cairo_set_source_rgb (cr,1 ,1 ,1 ); -cairo_fill (cr); + str_width =kmstest_cairo_printf_line (cr, align_hcenter,10 , +"%s @ %dHz on %s encoder" , c->mode.name, c->mode.vrefresh, +kmstest_encoder_type_str (c->encoder->encoder_type)); + +cairo_rel_move_to (cr, -str_width /2 ,0 );/* List available modes */ -snprintf (mode_buf,sizeof mode_buf,"Available modes:" );cairo_set_font_size (cr,18 ); -cairo_text_extents (cr, mode_buf, &mode_extents); - x = modes_x; - modes_x = x + mode_extents.width; - y += mode_extents.height +10 ; - modes_y = y; -cairo_move_to (cr, x, y); -cairo_text_path (cr, mode_buf); -cairo_set_source_rgb (cr,0 ,0 ,0 ); -cairo_stroke_preserve (cr); -cairo_set_source_rgb (cr,1 ,1 ,1 ); -cairo_fill (cr); + str_width =kmstest_cairo_printf_line (cr, align_left,10 , +"Available modes:" ); +cairo_rel_move_to (cr, str_width,0 ); +cairo_get_current_point (cr, &x, &top_y); + max_width =0 ;for (i =0 ; i < c->connector->count_modes; i++) { -snprintf (mode_buf,sizeof mode_buf,"%s @ %dHz" , - c->connector->modes[i].name, - c->connector->modes[i].vrefresh); -cairo_set_font_size (cr,18 ); -cairo_text_extents (cr, mode_buf, &mode_extents); - x = modes_x - mode_extents.width;/* right justify modes */ - y += mode_extents.height +10 ; -if (y + mode_extents.height >= height) { - y = modes_y + mode_extents.height +10 ; - modes_x += mode_extents.width +10 ; - x = modes_x - mode_extents.width; +cairo_get_current_point (cr, &x, &y); +if (y >= l_height) { + x += max_width +10 ; + max_width =0 ; +cairo_move_to (cr, x, top_y); } -cairo_move_to (cr, x, y); -cairo_text_path (cr, mode_buf); -cairo_set_source_rgb (cr,0 ,0 ,0 ); -cairo_stroke_preserve (cr); -cairo_set_source_rgb (cr,1 ,1 ,1 ); -cairo_fill (cr); + str_width =kmstest_cairo_printf_line (cr, align_right,10 , +"%s @ %dHz" , c->connector->modes[i %2 ].name, + c->connector->modes[i %2 ].vrefresh); +if (str_width > max_width) + max_width = str_width; }if (qr_code) --1.8.1.2
_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Signature · 2 lines
Rodrigo Vivi Blog: http://blog.vivi.eng.br
Re: [igt PATCH 2/5] lib: add kmstest_cairo_printf_line
Quoted 2 lines · Rodrigo Vivi
This patch is big and doing considerable changes in
paint_markerbesides addcairo_printfline... doesn' t it deserves a split?
Ok, will resend this with the paint_marker changes in a separate patch.
--Imre
PATCH 3/5 lib: add kmstest_get_connector_config
In reply to Imre DeakThis is used by multiple test cases, so make it shared.
--- lib/drmtest.c | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/drmtest.h | 14 ++++++ tests/kms_flip.c | 115 ++++++++------------------------------------ tests/testdisplay.c | 134 +++++++++++++++------------------------------------- 4 files changed, 206 insertions(+), 191 deletions(-)
lib/drmtest.c +134 -0
@@ -1317,3 +1317,137 @@ int drmtest_set_vt_graphics_mode(void)return orig_vt_mode <0 ?-1 :0 ; } +static int get_connector_default_mode (int drm_fd,drmModeConnector *connector, +drmModeModeInfo *mode) +{ +drmModeRes *resources; +int i; + + resources =drmModeGetResources (drm_fd); +if (!resources) { +perror ("drmModeGetResources failed" ); + +return -1 ; + } + +if (!connector->count_modes) { +fprintf (stderr,"no modes for connector %d\n" , + connector->connector_id); +drmModeFreeResources (resources); + +return -1 ; + } + +for (i =0 ; i < connector->count_modes; i++) { +if (i ==0 || + connector->modes[i].type &DRM_MODE_TYPE_PREFERRED ) { + *mode = connector->modes[i]; +if (mode->type &DRM_MODE_TYPE_PREFERRED ) +break ; + } + } + +drmModeFreeResources (resources); + +return 0 ; +} + +int kmstest_get_connector_config (int drm_fd,uint32_t connector_id, +unsigned long crtc_idx_mask, +struct kmstest_connector_config *config) +{ +drmModeRes *resources; +drmModeConnector *connector; +drmModeEncoder *encoder; +int i, j; + + resources =drmModeGetResources (drm_fd); +if (!resources) { +perror ("drmModeGetResources failed" ); + goto err1; + } + +/* First, find the connector & mode */ + connector =drmModeGetConnector (drm_fd, connector_id); +if (!connector) + goto err2; + +if (connector->connection !=DRM_MODE_CONNECTED ) + goto err3; + +if (!connector->count_modes) { +fprintf (stderr,"connector %d has no modes\n" , connector_id); + goto err3; + } + +if (connector->connector_id != connector_id) { +fprintf (stderr,"connector id doesn't match (%d != %d)\n" , + connector->connector_id, connector_id); + goto err3; + } + +/* +* Find given CRTC if crtc_id != 0 or else the first CRTC not in use. +* In both cases find the first compatible encoder and skip the CRTC +* if there is non such. +*/ + encoder =NULL ;/* suppress GCC warning */ +for (i =0 ; i < resources->count_crtcs; i++) { +if (!resources->crtcs[i] || !(crtc_idx_mask & (1 << i))) +continue ; + +/* Now get a compatible encoder */ +for (j =0 ; j < connector->count_encoders; j++) { + encoder =drmModeGetEncoder (drm_fd, + connector->encoders[j]); + +if (!encoder) { +fprintf (stderr,"could not get encoder %d: %s\n" , + resources->encoders[j],strerror (errno)); + +continue ; + } + +if (encoder->possible_crtcs & (1 << i)) + goto found; + +drmModeFreeEncoder (encoder); + } + } + +fprintf (stderr, +"no crtc with a compatible encoder (crtc_idx_mask %08lx)\n" , + crtc_idx_mask); + goto err3; + +found: +if (get_connector_default_mode (drm_fd, connector, + &config->default_mode) <0 ) + goto err4; + + config->connector = connector; + config->encoder = encoder; + config->crtc =drmModeGetCrtc (drm_fd, resources->crtcs[i]); + config->crtc_idx = i; + config->pipe =kmstest_get_pipe_from_crtc_id (drm_fd, + config->crtc->crtc_id); + +drmModeFreeResources (resources); + +return 0 ; +err4: +drmModeFreeEncoder (encoder); +err3: +drmModeFreeConnector (connector); +err2: +drmModeFreeResources (resources); +err1: +return -1 ; +} + +void kmstest_free_connector_config (struct kmstest_connector_config *config) +{ +drmModeFreeCrtc (config->crtc); +drmModeFreeEncoder (config->encoder); +drmModeFreeConnector (config->connector); +}
lib/drmtest.h +14 -0
@@ -101,6 +101,20 @@ void drmtest_init_aperture_trashers(drm_intel_bufmgr *bufmgr);void drmtest_trash_aperture (void );void drmtest_cleanup_aperture_trashers (void ); +struct kmstest_connector_config { +drmModeCrtc *crtc; +drmModeConnector *connector; +drmModeEncoder *encoder; +drmModeModeInfo default_mode; +int crtc_idx; +int pipe; +}; + +int kmstest_get_connector_config (int drm_fd,uint32_t connector_id, +unsigned long crtc_idx_mask, +struct kmstest_connector_config *config); +void kmstest_free_connector_config (struct kmstest_connector_config *config); +/* helpers to create nice-looking framebuffers */ struct kmstest_fb {uint32_t fb_id;
tests/kms_flip.c +19 -96
170 lines not on this page · raw message
tests/testdisplay.c +39 -95
169 lines not on this page · raw message
Signature · 1 line
1.8.1.2
Re: [igt PATCH 3/5] lib: add kmstest_get_connector_config
Quoted 540 lines · Imre Deak
This is used by multiple test cases, so make it shared.
Signed-off-by Imre Deak <[email protected]>--- lib/drmtest.c | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/drmtest.h | 14 ++++++ tests/kms_flip.c | 115 ++++++++------------------------------------ tests/testdisplay.c | 134 +++++++++++++++------------------------------------- 4 files changed, 206 insertions(+), 191 deletions(-)lib/drmtest.c +134
-0@@ -1317,3 +1317,137 @@ int drmtest_set_vt_graphics_mode(void)return orig_vt_mode <0 ?-1 :0 ; } +static int get_connector_default_mode (int drm_fd,drmModeConnector *connector, +drmModeModeInfo *mode) +{ +drmModeRes *resources; +int i; + + resources =drmModeGetResources (drm_fd); +if (!resources) { +perror ("drmModeGetResources failed" ); + +return -1 ; + } + +if (!connector->count_modes) { +fprintf (stderr,"no modes for connector %d\n" , + connector->connector_id); +drmModeFreeResources (resources); + +return -1 ; + } + +for (i =0 ; i < connector->count_modes; i++) { +if (i ==0 || + connector->modes[i].type &DRM_MODE_TYPE_PREFERRED ) { + *mode = connector->modes[i]; +if (mode->type &DRM_MODE_TYPE_PREFERRED ) +break ; + } + } + +drmModeFreeResources (resources); + +return 0 ; +} + +int kmstest_get_connector_config (int drm_fd,uint32_t connector_id, +unsigned long crtc_idx_mask, +struct kmstest_connector_config *config) +{ +drmModeRes *resources; +drmModeConnector *connector; +drmModeEncoder *encoder; +int i, j; + + resources =drmModeGetResources (drm_fd); +if (!resources) { +perror ("drmModeGetResources failed" ); + goto err1; + } + +/* First, find the connector & mode */ + connector =drmModeGetConnector (drm_fd, connector_id); +if (!connector) + goto err2; + +if (connector->connection !=DRM_MODE_CONNECTED ) + goto err3; + +if (!connector->count_modes) { +fprintf (stderr,"connector %d has no modes\n" , connector_id); + goto err3; + } + +if (connector->connector_id != connector_id) { +fprintf (stderr,"connector id doesn't match (%d != %d)\n" , + connector->connector_id, connector_id); + goto err3; + } + +/* +* Find given CRTC if crtc_id != 0 or else the first CRTC not in use. +* In both cases find the first compatible encoder and skip the CRTC +* if there is non such. +*/ + encoder =NULL ;/* suppress GCC warning */ +for (i =0 ; i < resources->count_crtcs; i++) { +if (!resources->crtcs[i] || !(crtc_idx_mask & (1 << i))) +continue ; + +/* Now get a compatible encoder */ +for (j =0 ; j < connector->count_encoders; j++) { + encoder =drmModeGetEncoder (drm_fd, + connector->encoders[j]); + +if (!encoder) { +fprintf (stderr,"could not get encoder %d: %s\n" , + resources->encoders[j],strerror (errno)); + +continue ; + } + +if (encoder->possible_crtcs & (1 << i)) + goto found; + +drmModeFreeEncoder (encoder); + } + } + +fprintf (stderr, +"no crtc with a compatible encoder (crtc_idx_mask %08lx)\n" , + crtc_idx_mask); + goto err3; + +found: +if (get_connector_default_mode (drm_fd, connector, + &config->default_mode) <0 ) + goto err4; + + config->connector = connector; + config->encoder = encoder; + config->crtc =drmModeGetCrtc (drm_fd, resources->crtcs[i]); + config->crtc_idx = i; + config->pipe =kmstest_get_pipe_from_crtc_id (drm_fd, + config->crtc->crtc_id); + +drmModeFreeResources (resources); + +return 0 ; +err4: +drmModeFreeEncoder (encoder); +err3: +drmModeFreeConnector (connector); +err2: +drmModeFreeResources (resources); +err1: +return -1 ; +} + +void kmstest_free_connector_config (struct kmstest_connector_config *config) +{ +drmModeFreeCrtc (config->crtc); +drmModeFreeEncoder (config->encoder); +drmModeFreeConnector (config->connector); +}lib/drmtest.h +14
-0@@ -101,6 +101,20 @@ void drmtest_init_aperture_trashers(drm_intel_bufmgr *bufmgr);void drmtest_trash_aperture (void );void drmtest_cleanup_aperture_trashers (void ); +struct kmstest_connector_config { +drmModeCrtc *crtc; +drmModeConnector *connector; +drmModeEncoder *encoder; +drmModeModeInfo default_mode; +int crtc_idx; +int pipe; +}; + +int kmstest_get_connector_config (int drm_fd,uint32_t connector_id, +unsigned long crtc_idx_mask, +struct kmstest_connector_config *config); +void kmstest_free_connector_config (struct kmstest_connector_config *config); +/* helpers to create nice-looking framebuffers */ struct kmstest_fb {uint32_t fb_id;tests/kms_flip.c +19
-96@@ -825,97 +825,23 @@ static void update_all_state(struct test_output *o,update_state (&o->vblank_state); } -static void connector_find_preferred_mode (struct test_output *o,int crtc_id) +static void connector_find_preferred_mode (uint32_t connector_id,int crtc_idx, +struct test_output *o) { -drmModeConnector *connector; -drmModeEncoder *encoder =NULL ; -int i, j; - -/* First, find the connector & mode */ - o->mode_valid =0 ; - o->crtc =0 ; - connector =drmModeGetConnector (drm_fd, o->id); -assert (connector); - -if (connector->connection !=DRM_MODE_CONNECTED ) { -drmModeFreeConnector (connector); -return ; - } - -if (!connector->count_modes) { -fprintf (stderr,"connector %d has no modes\n" , o->id); -drmModeFreeConnector (connector); -return ; - } - -if (connector->connector_id != o->id) { -fprintf (stderr,"connector id doesn't match (%d != %d)\n" , - connector->connector_id, o->id); -drmModeFreeConnector (connector); -return ; - } - -for (j =0 ; j < connector->count_modes; j++) { - o->mode = connector->modes[j]; -if (o->mode.type &DRM_MODE_TYPE_PREFERRED ) { - o->mode_valid =1 ; -break ; - } - } - -if (!o->mode_valid) { -if (connector->count_modes >0 ) { -/* use the first mode as test mode */ - o->mode = connector->modes[0 ]; - o->mode_valid =1 ; - } -else { -fprintf (stderr,"failed to find any modes on connector %d\n" , - o->id); -return ; - } - } +struct kmstest_connector_config config; -/* Now get the encoder */ -for (i =0 ; i < connector->count_encoders; i++) { - encoder =drmModeGetEncoder (drm_fd, connector->encoders[i]); - -if (!encoder) { -fprintf (stderr,"could not get encoder %i: %s\n" , - resources->encoders[i],strerror (errno)); -drmModeFreeEncoder (encoder); -continue ; - } - -break ; - } - - o->encoder = encoder; - -if (i == resources->count_encoders) { -fprintf (stderr,"failed to find encoder\n" ); - o->mode_valid =0 ; -return ; - } - -/* Find first CRTC not in use */ -for (i =0 ; i < resources->count_crtcs; i++) { -if (resources->crtcs[i] != crtc_id) -continue ; -if (resources->crtcs[i] && - (o->encoder->possible_crtcs & (1 <<i))) { - o->crtc = resources->crtcs[i]; -break ; - } - } - -if (!o->crtc) { -fprintf (stderr,"could not find requested crtc %d\n" , crtc_id); +if (kmstest_get_connector_config (drm_fd, connector_id,1 << crtc_idx, + &config) <0 ) { o->mode_valid =0 ;return ; } - o->connector = connector; + o->connector = config.connector; + o->encoder = config.encoder; + o->crtc = config.crtc->crtc_id; + o->pipe = config.pipe; + o->mode = config.default_mode; + o->mode_valid =1 ; } static void@@ -1042,21 +968,21 @@ static unsigned event_loop(struct test_output *o, unsigned duration_sec)return end - start; } -static void run_test_on_crtc (struct test_output *o,int crtc,int duration) +static void run_test_on_crtc (struct test_output *o,int crtc_idx,int duration) {unsigned ellapsed; o->bpp =32 ; o->depth =24 ; -connector_find_preferred_mode (o, crtc); +connector_find_preferred_mode (o->id, crtc_idx, o);if (!o->mode_valid)return ; last_connector = o->connector;fprintf (stdout,"Beginning %s on crtc %d, connector %d\n" , - o->test_name, crtc, o->id); + o->test_name, o->crtc, o->id); o->fb_width = o->mode.hdisplay; o->fb_height = o->mode.vdisplay;@@ -1116,7 +1042,7 @@ static void run_test_on_crtc(struct test_output *o, int crtc, int duration)check_final_state (o, &o->vblank_state, ellapsed);fprintf (stdout,"\n%s on crtc %d, connector %d: PASSED\n\n" , - o->test_name, crtc, o->id); + o->test_name, o->crtc, o->id);kmstest_remove_fb (drm_fd, o->fb_ids[2 ]);kmstest_remove_fb (drm_fd, o->fb_ids[1 ]);@@ -1131,7 +1057,8 @@ static void run_test_on_crtc(struct test_output *o, int crtc, int duration)static int run_test (int duration,int flags,const char *test_name) {struct test_output o; -int c, i; +int c; +int crtc_idx; resources =drmModeGetResources (drm_fd);if (!resources) {@@ -1142,19 +1069,15 @@ static int run_test(int duration, int flags, const char *test_name)/* Find any connected displays */ for (c =0 ; c < resources->count_connectors; c++) { -for (i =0 ; i < resources->count_crtcs; i++) { -int crtc; - +for (crtc_idx =0 ; crtc_idx < resources->count_crtcs; crtc_idx++) {memset (&o,0 ,sizeof (o)); o.test_name = test_name; o.id = resources->connectors[c]; o.flags = flags; o.flip_state.name ="flip" ; o.vblank_state.name ="vblank" ; - crtc = resources->crtcs[i]; - o.pipe =kmstest_get_pipe_from_crtc_id (drm_fd, crtc); -run_test_on_crtc (&o, crtc, duration); +run_test_on_crtc (&o, crtc_idx, duration); } }tests/testdisplay.c +39
-96@@ -102,6 +102,7 @@ struct connector {drmModeEncoder *encoder;drmModeConnector *connector;int crtc; +int crtc_idx;int pipe; };@@ -185,101 +186,31 @@ static void dump_crtcs_fd(int drmfd)drmModeFreeResources (mode_resources); } -static void connector_find_preferred_mode (struct connector *c) +static void connector_find_preferred_mode (uint32_t connector_id, +unsigned long crtc_idx_mask, +int mode_num,struct connector *c) { -drmModeConnector *connector; -drmModeEncoder *encoder =NULL ; -int i, j; - -/* First, find the connector & mode */ - c->mode_valid =0 ; - connector =drmModeGetConnector (drm_fd, c->id); -if (!connector) { -fprintf (stderr,"could not get connector %d: %s\n" , - c->id,strerror (errno)); -drmModeFreeConnector (connector); -return ; - } - -if (connector->connection !=DRM_MODE_CONNECTED ) { -drmModeFreeConnector (connector); -return ; - } - -if (!connector->count_modes) { -fprintf (stderr,"connector %d has no modes\n" , c->id); -drmModeFreeConnector (connector); -return ; - } - -if (connector->connector_id != c->id) { -fprintf (stderr,"connector id doesn't match (%d != %d)\n" , - connector->connector_id, c->id); -drmModeFreeConnector (connector); -return ; - } - -for (j =0 ; j < connector->count_modes; j++) { - c->mode = connector->modes[j]; -if (c->mode.type &DRM_MODE_TYPE_PREFERRED ) { - c->mode_valid =1 ; -break ; - } - } - -if ( specified_mode_num !=-1 ){ - c->mode = connector->modes[specified_mode_num]; -if (c->mode.type &DRM_MODE_TYPE_PREFERRED ) - c->mode_valid =1 ; - } - -if (!c->mode_valid) { -if (connector->count_modes >0 ) { -/* use the first mode as test mode */ - c->mode = connector->modes[0 ]; - c->mode_valid =1 ; - } -else { -fprintf (stderr,"failed to find any modes on connector %d\n" , - c->id); -return ; - } - } - -/* Now get the encoder */ -for (i =0 ; i < connector->count_encoders; i++) { - encoder =drmModeGetEncoder (drm_fd, connector->encoders[i]); - -if (!encoder) { -fprintf (stderr,"could not get encoder %i: %s\n" , - resources->encoders[i],strerror (errno)); -drmModeFreeEncoder (encoder); -continue ; - } - -break ; - } - - c->encoder = encoder; +struct kmstest_connector_config config; -if (i == resources->count_encoders) { -fprintf (stderr,"failed to find encoder\n" ); +if (kmstest_get_connector_config (drm_fd, connector_id, crtc_idx_mask, + &config) <0 ) { c->mode_valid =0 ;return ; } -/* Find first CRTC not in use */ -for (i =0 ; i < resources->count_crtcs; i++) { -if (resources->crtcs[i] && (c->encoder->possible_crtcs & (1 <<i))) -break ; + c->connector = config.connector; + c->encoder = config.encoder; + c->crtc = config.crtc->crtc_id; + c->crtc_idx = config.crtc_idx; + c->pipe = config.pipe; + +if (mode_num !=-1 ) { +assert (mode_num < config.connector->count_modes); + c->mode = config.connector->modes[mode_num]; + }else { + c->mode = config.default_mode; } - c->crtc = resources->crtcs[i]; - c->pipe = i; - -if (test_preferred_mode || force_mode || specified_mode_num !=-1 ) - resources->crtcs[i] =0 ; - - c->connector = connector; + c->mode_valid =1 ; } static void@@ -409,10 +340,6 @@ set_mode(struct connector *c)else if (depth >16 && depth <=32 ) bpp =32 ; -connector_find_preferred_mode (c); -if (!c->mode_valid) -return ; - test_mode_num =1 ;if (force_mode){memcpy ( &c->mode, &force_timing,sizeof (force_timing));@@ -506,13 +433,30 @@ int update_display(void) }if (test_preferred_mode || test_all_modes || force_mode || specified_disp_id !=-1 ) { +unsigned long crtc_idx_mask =-1UL ; +/* Find any connected displays */ for (c =0 ; c < resources->count_connectors; c++) { - connectors[c].id = resources->connectors[c]; -if ( specified_disp_id !=-1 && connectors[c].id != specified_disp_id ) +struct connector *connector = &connectors[c]; + + connector->id = resources->connectors[c]; +if (specified_disp_id !=-1 && + connector->id != specified_disp_id) +continue ; + +connector_find_preferred_mode (connector->id, + crtc_idx_mask, + specified_mode_num, + connector); +if (!connector->mode_valid)continue ; -set_mode (&connectors[c]); +set_mode (connector); + +if (test_preferred_mode || force_mode || + specified_mode_num !=-1 ) + crtc_idx_mask &= ~(1 << connector->crtc_idx); + } }drmModeFreeResources (resources); --1.8.1.2
_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Signature · 2 lines
Rodrigo Vivi Blog: http://blog.vivi.eng.br
PATCH 4/5 lib: refactor kmstest_create_fb
In reply to Imre DeakFactor out parts that will be used by an upcoming patch adding kmstest_create_fb2.
Also call the fb paint functions directly, there is not much point in passing a function pointer for that.
--- lib/drmtest.c | 176 ++++++++++++++++++++++++++++++++-------------------- lib/drmtest.h | 15 +++-- tests/kms_flip.c | 30 +++++---- tests/testdisplay.c | 15 +++-- 4 files changed, 147 insertions(+), 89 deletions(-)
lib/drmtest.c +110 -66
@@ -39,6 +39,7 @@#include <getopt.h> #include <stdlib.h> #include <linux/kd.h> +#include <drm/drm_fourcc.h> #include "drmtest.h" #include "i915_drm.h"
@@ -788,16 +789,14 @@ void drmtest_cleanup_aperture_trashers(void) }/* helpers to create nice-looking framebuffers */ -static cairo_surface_t * -paint_allocate_surface (int fd,int width,int height,int depth,int bpp, -bool tiled, -struct kmstest_fb *fb_info) +static int create_bo_for_fb (int fd,int width,int height,int bpp, +bool tiled,uint32_t *gem_handle_ret, +unsigned *size_ret,unsigned *stride_ret) { -cairo_format_t format;struct drm_i915_gem_set_tiling set_tiling; +uint32_t gem_handle;int size;unsigned stride; -uint32_t *fb_ptr;if (tiled) {int v;
@@ -823,49 +822,24 @@ paint_allocate_surface(int fd, int width, int height, int depth, int bpp, size = stride * height; } -switch (depth) { -case 16 : - format =CAIRO_FORMAT_RGB16_565 ; -break ; -case 24 : - format =CAIRO_FORMAT_RGB24 ; -break ; -#if 0 -case 30 : - format =CAIRO_FORMAT_RGB30 ; -break ; -#endif -case 32 : - format =CAIRO_FORMAT_ARGB32 ; -break ; -default : -fprintf (stderr,"bad depth %d\n" , depth); -return NULL ; - } - -assert (bpp >= depth); - - fb_info->gem_handle =gem_create (fd, size); + gem_handle =gem_create (fd, size);if (tiled) { - set_tiling.handle = fb_info->gem_handle; + set_tiling.handle = gem_handle; set_tiling.tiling_mode =I915_TILING_X ; set_tiling.stride = stride;if (ioctl (fd,DRM_IOCTL_I915_GEM_SET_TILING , &set_tiling)) {fprintf (stderr,"set tiling failed: %s (stride=%d, size=%d)\n" ,strerror (errno), stride, size); -return NULL ; +return -1 ; } } - fb_ptr =gem_mmap (fd, fb_info->gem_handle, size,PROT_READ |PROT_WRITE ); - - fb_info->stride = stride; - fb_info->size = size; + *stride_ret = stride; + *size_ret = size; + *gem_handle_ret = gem_handle; -return cairo_image_surface_create_for_data ((unsigned char *)fb_ptr, - format, width, height, - stride); +return 0 ; } static void
@@ -981,23 +955,8 @@ paint_marker(cairo_t *cr, int x, int y)kmstest_cairo_printf_line (cr, align,0 ,"(%d, %d)" , x, y); } -unsigned int kmstest_create_fb (int fd,int width,int height,int bpp, -int depth,bool tiled, -struct kmstest_fb *fb_info, -kmstest_paint_func paint_func, -void *func_arg) +void kmstest_paint_test_pattern (cairo_t *cr,int width,int height) { -cairo_surface_t *surface; -cairo_status_t status; -cairo_t *cr; -unsigned int fb_id; - - surface =paint_allocate_surface (fd, width, height, depth, bpp, - tiled, fb_info); -assert (surface); - - cr =cairo_create (surface); -paint_test_patterns (cr, width, height);cairo_set_line_cap (cr,CAIRO_LINE_CAP_SQUARE );
@@ -1008,27 +967,112 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,paint_marker (cr,0 , height);paint_marker (cr, width, height); -if (paint_func) -paint_func (cr, width, height, func_arg); +assert (!cairo_status (cr)); +} + +#define DF (did, cid, _bpp, _depth) \ + { DRM_FORMAT_##did, CAIRO_FORMAT_##cid, # did, _bpp, _depth } +static struct format_desc_struct { +uint32_t drm_id; +cairo_format_t cairo_id; +const char *name; +int bpp; +int depth; +} format_desc[] = { +DF (RGB565 ,RGB16_565 ,16 ,16 ), +DF (RGB888 ,INVALID ,24 ,24 ), +DF (XRGB8888 ,RGB24 ,32 ,24 ), +DF (XRGB2101010 ,RGB30 ,32 ,30 ), +DF (ARGB8888 ,ARGB32 ,32 ,32 ), +}; +#undef DF + +#define for_each_format (f) \ + for (f = format_desc; f - format_desc < ARRAY_SIZE(format_desc); f++) + +static uint32_t bpp_depth_to_drm_format (int bpp,int depth) +{ +struct format_desc_struct *f; + +for_each_format (f) +if (f->bpp == bpp && f->depth == depth) +return f->drm_id; + +abort (); +} + +/* Return fb_id on success, 0 on error */ +unsigned int kmstest_create_fb (int fd,int width,int height,int bpp, +int depth,bool tiled,struct kmstest_fb *fb) +{ +memset (fb,0 ,sizeof (*fb)); - status =cairo_status (cr); -assert (!status); -cairo_destroy (cr); +if (create_bo_for_fb (fd, width, height, bpp, tiled, &fb->gem_handle, + &fb->size, &fb->stride) <0 ) +return 0 ; + +if (drmModeAddFB (fd, width, height, depth, bpp, fb->stride, + fb->gem_handle, &fb->fb_id) <0 ) { +gem_close (fd, fb->gem_handle); + +return 0 ; + } + + fb->width = width; + fb->height = height; + fb->drm_format =bpp_depth_to_drm_format (bpp, depth); + +return fb->fb_id; +} + +static cairo_format_t drm_format_to_cairo (uint32_t drm_format) +{ +struct format_desc_struct *f; -do_or_die (drmModeAddFB (fd, width, height, depth, bpp, - fb_info->stride, - fb_info->gem_handle, &fb_id)); +for_each_format (f) +if (f->drm_id == drm_format) +return f->cairo_id; +abort (); +} + +static cairo_t *create_cairo_ctx (int fd,struct kmstest_fb *fb) +{ +cairo_t *cr; +cairo_surface_t *surface; +cairo_format_t cformat; +void *fb_ptr; + + cformat =drm_format_to_cairo (fb->drm_format); + fb_ptr =gem_mmap (fd, fb->gem_handle, fb->size,PROT_READ |PROT_WRITE ); + surface =cairo_image_surface_create_for_data ((unsigned char *)fb_ptr, + cformat, fb->width, + fb->height, fb->stride); +assert (surface); + cr =cairo_create (surface);cairo_surface_destroy (surface); - fb_info->fb_id = fb_id; +return cr; +} + +cairo_t *kmstest_get_cairo_ctx (int fd,struct kmstest_fb *fb) +{ + +if (!fb->cairo_ctx) + fb->cairo_ctx =create_cairo_ctx (fd, fb); + +gem_set_domain (fd, fb->gem_handle,I915_GEM_DOMAIN_CPU , +I915_GEM_DOMAIN_CPU ); -return fb_id; +return fb->cairo_ctx; } -void kmstest_remove_fb (int fd,int fb_id) +void kmstest_remove_fb (int fd,struct kmstest_fb *fb) { -do_or_die (drmModeRmFB (fd, fb_id)); +if (fb->cairo_ctx) +cairo_destroy (fb->cairo_ctx); +do_or_die (drmModeRmFB (fd, fb->fb_id)); +gem_close (fd, fb->gem_handle); }struct type_name {
lib/drmtest.h +9 -6
@@ -119,8 +119,13 @@ void kmstest_free_connector_config(struct kmstest_connector_config *config);struct kmstest_fb {uint32_t fb_id;uint32_t gem_handle; +uint32_t drm_format; +int width; +int height; +int depth;unsigned stride;unsigned size; +cairo_t *cairo_ctx; };enum kmstest_text_align {
@@ -136,14 +141,12 @@ int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align, double yspacing, const char *fmt, ...) __attribute__((format (printf, 4, 5))); -typedef void (*kmstest_paint_func )(cairo_t *cr,int width,int height,void *priv); -unsigned int kmstest_create_fb (int fd,int width,int height,int bpp,int depth,bool tiled, -struct kmstest_fb *fb_info, -kmstest_paint_func paint_func, -void *func_arg); -void kmstest_remove_fb (int fd,int fb_id); +struct kmstest_fb *fb_info); +void kmstest_remove_fb (int fd,struct kmstest_fb *fb_info); +cairo_t *kmstest_get_cairo_ctx (int fd,struct kmstest_fb *fb); +void kmstest_paint_test_pattern (cairo_t *cr,int width,int height);void kmstest_dump_mode (drmModeModeInfo *mode);int kmstest_get_pipe_from_crtc_id (int fd,int crtc_id);const char *kmstest_encoder_type_str (int type);
tests/kms_flip.c +18 -12
@@ -844,10 +844,13 @@ static void connector_find_preferred_mode(uint32_t connector_id, int crtc_idx, o->mode_valid =1 ; } -static void -paint_flip_mode (cairo_t *cr,int width,int height,void *priv) +static void paint_flip_mode (struct kmstest_fb *fb,bool odd_frame) { -bool odd_frame = (bool ) priv; +cairo_t *cr =kmstest_get_cairo_ctx (drm_fd, fb); +int width = fb->width; +int height = fb->height; + +kmstest_paint_test_pattern (cr, width, height);if (odd_frame)cairo_rectangle (cr, width/4 , height/2 , width/4 , height/8 );
@@ -856,6 +859,8 @@ paint_flip_mode(cairo_t *cr, int width, int height, void *priv)cairo_set_source_rgb (cr,1 ,1 ,1 );cairo_fill (cr); + +assert (!cairo_status (cr)); } static int
@@ -991,20 +996,21 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration) o->fb_width *=2 ; o->fb_ids[0 ] =kmstest_create_fb (drm_fd, o->fb_width, o->fb_height, - o->bpp, o->depth, false, &o->fb_info[0 ], - paint_flip_mode, (void *)false); + o->bpp, o->depth, false, &o->fb_info[0 ]); o->fb_ids[1 ] =kmstest_create_fb (drm_fd, o->fb_width, o->fb_height, - o->bpp, o->depth, false, &o->fb_info[1 ], - paint_flip_mode, (void *)true); + o->bpp, o->depth, false, &o->fb_info[1 ]); o->fb_ids[2 ] =kmstest_create_fb (drm_fd, o->fb_width, o->fb_height, - o->bpp, o->depth, true, &o->fb_info[2 ], - paint_flip_mode, (void *)true); + o->bpp, o->depth, true, &o->fb_info[2 ]);if (!o->fb_ids[0 ] || !o->fb_ids[1 ] || !o->fb_ids[2 ]) {fprintf (stderr,"failed to create fbs\n" );exit (3 ); } +paint_flip_mode (&o->fb_info[0 ], false); +paint_flip_mode (&o->fb_info[1 ], true); +paint_flip_mode (&o->fb_info[2 ], true); +set_y_tiling (o,2 );kmstest_dump_mode (&o->mode);
@@ -1044,9 +1050,9 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration)fprintf (stdout,"\n%s on crtc %d, connector %d: PASSED\n\n" , o->test_name, o->crtc, o->id); -kmstest_remove_fb (drm_fd, o->fb_ids[2 ]); -kmstest_remove_fb (drm_fd, o->fb_ids[1 ]); -kmstest_remove_fb (drm_fd, o->fb_ids[0 ]); +kmstest_remove_fb (drm_fd, &o->fb_info[2 ]); +kmstest_remove_fb (drm_fd, &o->fb_info[1 ]); +kmstest_remove_fb (drm_fd, &o->fb_info[0 ]); last_connector =NULL ;
tests/testdisplay.c +10 -5
@@ -258,15 +258,18 @@ static void paint_image(cairo_t *cr, const char *file)cairo_surface_destroy (image); } -static void -paint_output_info (cairo_t *cr,int l_width,int l_height,void *priv) +static void paint_output_info (struct connector *c,struct kmstest_fb *fb) { -struct connector *c = priv; +cairo_t *cr =kmstest_get_cairo_ctx (drm_fd, fb); +int l_width = fb->width; +int l_height = fb->height;double str_width;double x, y, top_y;double max_width;int i; +kmstest_paint_test_pattern (cr, l_width, l_height); +cairo_select_font_face (cr,"Helvetica" ,CAIRO_FONT_SLANT_NORMAL ,CAIRO_FONT_WEIGHT_NORMAL );
@@ -308,6 +311,8 @@ paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)if (qr_code)paint_image (cr,"./pass.png" ); + +assert (!cairo_status (cr)); }static void sighandler (int signo)
@@ -362,8 +367,8 @@ set_mode(struct connector *c) height = c->mode.vdisplay; fb_id =kmstest_create_fb (drm_fd, width, height, bpp, depth, - enable_tiling, &fb_info, - paint_output_info, c); + enable_tiling, &fb_info); +paint_output_info (c, &fb_info); fb_ptr =gem_mmap (drm_fd, fb_info.gem_handle, fb_info.size,PROT_READ |PROT_WRITE );
Signature · 1 line
1.8.1.2
Re: [igt PATCH 4/5] lib: refactor kmstest_create_fb
what a huge patch... but hopefully I haven' t missed anything. Feel free to use Reviewed-by: Rodrigo Vivi <[email protected]>
Quoted 415 lines · Imre Deak
Factor out parts that will be used by an upcoming patch adding
kmstest_create_fb2.Also call the fb paint functions directly, there is not much point in passing a function pointer for that.
Signed-off-by Imre Deak <[email protected]>--- lib/drmtest.c | 176 ++++++++++++++++++++++++++++++++-------------------- lib/drmtest.h | 15 +++-- tests/kms_flip.c | 30 +++++---- tests/testdisplay.c | 15 +++-- 4 files changed, 147 insertions(+), 89 deletions(-)lib/drmtest.c +110
-66@@ -39,6 +39,7 @@#include <getopt.h> #include <stdlib.h> #include <linux/kd.h> +#include <drm/drm_fourcc.h> #include "drmtest.h" #include "i915_drm.h" @@ -788,16 +789,14 @@ void drmtest_cleanup_aperture_trashers(void) }/* helpers to create nice-looking framebuffers */ -static cairo_surface_t * -paint_allocate_surface (int fd,int width,int height,int depth,int bpp, -bool tiled, -struct kmstest_fb *fb_info) +static int create_bo_for_fb (int fd,int width,int height,int bpp, +bool tiled,uint32_t *gem_handle_ret, +unsigned *size_ret,unsigned *stride_ret) { -cairo_format_t format;struct drm_i915_gem_set_tiling set_tiling; +uint32_t gem_handle;int size;unsigned stride; -uint32_t *fb_ptr;if (tiled) {int v;@@ -823,49 +822,24 @@ paint_allocate_surface(int fd, int width, int height, int depth, int bpp, size = stride * height; } -switch (depth) { -case 16 : - format =CAIRO_FORMAT_RGB16_565 ; -break ; -case 24 : - format =CAIRO_FORMAT_RGB24 ; -break ; -#if 0 -case 30 : - format =CAIRO_FORMAT_RGB30 ; -break ; -#endif -case 32 : - format =CAIRO_FORMAT_ARGB32 ; -break ; -default : -fprintf (stderr,"bad depth %d\n" , depth); -return NULL ; - } - -assert (bpp >= depth); - - fb_info->gem_handle =gem_create (fd, size); + gem_handle =gem_create (fd, size);if (tiled) { - set_tiling.handle = fb_info->gem_handle; + set_tiling.handle = gem_handle; set_tiling.tiling_mode =I915_TILING_X ; set_tiling.stride = stride;if (ioctl (fd,DRM_IOCTL_I915_GEM_SET_TILING , &set_tiling)) {fprintf (stderr,"set tiling failed: %s (stride=%d, size=%d)\n" ,strerror (errno), stride, size); -return NULL ; +return -1 ; } } - fb_ptr =gem_mmap (fd, fb_info->gem_handle, size,PROT_READ |PROT_WRITE ); - - fb_info->stride = stride; - fb_info->size = size; + *stride_ret = stride; + *size_ret = size; + *gem_handle_ret = gem_handle; -return cairo_image_surface_create_for_data ((unsigned char *)fb_ptr, - format, width, height, - stride); +return 0 ; } static void@@ -981,23 +955,8 @@ paint_marker(cairo_t *cr, int x, int y)kmstest_cairo_printf_line (cr, align,0 ,"(%d, %d)" , x, y); } -unsigned int kmstest_create_fb (int fd,int width,int height,int bpp, -int depth,bool tiled, -struct kmstest_fb *fb_info, -kmstest_paint_func paint_func, -void *func_arg) +void kmstest_paint_test_pattern (cairo_t *cr,int width,int height) { -cairo_surface_t *surface; -cairo_status_t status; -cairo_t *cr; -unsigned int fb_id; - - surface =paint_allocate_surface (fd, width, height, depth, bpp, - tiled, fb_info); -assert (surface); - - cr =cairo_create (surface); -paint_test_patterns (cr, width, height);cairo_set_line_cap (cr,CAIRO_LINE_CAP_SQUARE );@@ -1008,27 +967,112 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,paint_marker (cr,0 , height);paint_marker (cr, width, height); -if (paint_func) -paint_func (cr, width, height, func_arg); +assert (!cairo_status (cr)); +} + +#define DF (did, cid, _bpp, _depth) \ + { DRM_FORMAT_##did, CAIRO_FORMAT_##cid, # did, _bpp, _depth } +static struct format_desc_struct { +uint32_t drm_id; +cairo_format_t cairo_id; +const char *name; +int bpp; +int depth; +} format_desc[] = { +DF (RGB565 ,RGB16_565 ,16 ,16 ), +DF (RGB888 ,INVALID ,24 ,24 ), +DF (XRGB8888 ,RGB24 ,32 ,24 ), +DF (XRGB2101010 ,RGB30 ,32 ,30 ), +DF (ARGB8888 ,ARGB32 ,32 ,32 ), +}; +#undef DF + +#define for_each_format (f) \ + for (f = format_desc; f - format_desc < ARRAY_SIZE(format_desc); f++) + +static uint32_t bpp_depth_to_drm_format (int bpp,int depth) +{ +struct format_desc_struct *f; + +for_each_format (f) +if (f->bpp == bpp && f->depth == depth) +return f->drm_id; + +abort (); +} + +/* Return fb_id on success, 0 on error */ +unsigned int kmstest_create_fb (int fd,int width,int height,int bpp, +int depth,bool tiled,struct kmstest_fb *fb) +{ +memset (fb,0 ,sizeof (*fb)); - status =cairo_status (cr); -assert (!status); -cairo_destroy (cr); +if (create_bo_for_fb (fd, width, height, bpp, tiled, &fb->gem_handle, + &fb->size, &fb->stride) <0 ) +return 0 ; + +if (drmModeAddFB (fd, width, height, depth, bpp, fb->stride, + fb->gem_handle, &fb->fb_id) <0 ) { +gem_close (fd, fb->gem_handle); + +return 0 ; + } + + fb->width = width; + fb->height = height; + fb->drm_format =bpp_depth_to_drm_format (bpp, depth); + +return fb->fb_id; +} + +static cairo_format_t drm_format_to_cairo (uint32_t drm_format) +{ +struct format_desc_struct *f; -do_or_die (drmModeAddFB (fd, width, height, depth, bpp, - fb_info->stride, - fb_info->gem_handle, &fb_id)); +for_each_format (f) +if (f->drm_id == drm_format) +return f->cairo_id; +abort (); +} + +static cairo_t *create_cairo_ctx (int fd,struct kmstest_fb *fb) +{ +cairo_t *cr; +cairo_surface_t *surface; +cairo_format_t cformat; +void *fb_ptr; + + cformat =drm_format_to_cairo (fb->drm_format); + fb_ptr =gem_mmap (fd, fb->gem_handle, fb->size,PROT_READ |PROT_WRITE ); + surface =cairo_image_surface_create_for_data ((unsigned char *)fb_ptr, + cformat, fb->width, + fb->height, fb->stride); +assert (surface); + cr =cairo_create (surface);cairo_surface_destroy (surface); - fb_info->fb_id = fb_id; +return cr; +} + +cairo_t *kmstest_get_cairo_ctx (int fd,struct kmstest_fb *fb) +{ + +if (!fb->cairo_ctx) + fb->cairo_ctx =create_cairo_ctx (fd, fb); + +gem_set_domain (fd, fb->gem_handle,I915_GEM_DOMAIN_CPU , +I915_GEM_DOMAIN_CPU ); -return fb_id; +return fb->cairo_ctx; } -void kmstest_remove_fb (int fd,int fb_id) +void kmstest_remove_fb (int fd,struct kmstest_fb *fb) { -do_or_die (drmModeRmFB (fd, fb_id)); +if (fb->cairo_ctx) +cairo_destroy (fb->cairo_ctx); +do_or_die (drmModeRmFB (fd, fb->fb_id)); +gem_close (fd, fb->gem_handle); }struct type_name {lib/drmtest.h +9
-6@@ -119,8 +119,13 @@ void kmstest_free_connector_config(struct kmstest_connector_config *config);struct kmstest_fb {uint32_t fb_id;uint32_t gem_handle; +uint32_t drm_format; +int width; +int height; +int depth;unsigned stride;unsigned size; +cairo_t *cairo_ctx; };enum kmstest_text_align {@@ -136,14 +141,12 @@ int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align, double yspacing, const char *fmt, ...) __attribute__((format (printf, 4, 5))); -typedef void (*kmstest_paint_func )(cairo_t *cr,int width,int height,void *priv); -unsigned int kmstest_create_fb (int fd,int width,int height,int bpp,int depth,bool tiled, -struct kmstest_fb *fb_info, -kmstest_paint_func paint_func, -void *func_arg); -void kmstest_remove_fb (int fd,int fb_id); +struct kmstest_fb *fb_info); +void kmstest_remove_fb (int fd,struct kmstest_fb *fb_info); +cairo_t *kmstest_get_cairo_ctx (int fd,struct kmstest_fb *fb); +void kmstest_paint_test_pattern (cairo_t *cr,int width,int height);void kmstest_dump_mode (drmModeModeInfo *mode);int kmstest_get_pipe_from_crtc_id (int fd,int crtc_id);const char *kmstest_encoder_type_str (int type);tests/kms_flip.c +18
-12@@ -844,10 +844,13 @@ static void connector_find_preferred_mode(uint32_t connector_id, int crtc_idx, o->mode_valid =1 ; } -static void -paint_flip_mode (cairo_t *cr,int width,int height,void *priv) +static void paint_flip_mode (struct kmstest_fb *fb,bool odd_frame) { -bool odd_frame = (bool ) priv; +cairo_t *cr =kmstest_get_cairo_ctx (drm_fd, fb); +int width = fb->width; +int height = fb->height; + +kmstest_paint_test_pattern (cr, width, height);if (odd_frame)cairo_rectangle (cr, width/4 , height/2 , width/4 , height/8 );@@ -856,6 +859,8 @@ paint_flip_mode(cairo_t *cr, int width, int height, void *priv)cairo_set_source_rgb (cr,1 ,1 ,1 );cairo_fill (cr); + +assert (!cairo_status (cr)); } static int@@ -991,20 +996,21 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration) o->fb_width *=2 ; o->fb_ids[0 ] =kmstest_create_fb (drm_fd, o->fb_width, o->fb_height, - o->bpp, o->depth, false, &o->fb_info[0 ], - paint_flip_mode, (void *)false); + o->bpp, o->depth, false, &o->fb_info[0 ]); o->fb_ids[1 ] =kmstest_create_fb (drm_fd, o->fb_width, o->fb_height, - o->bpp, o->depth, false, &o->fb_info[1 ], - paint_flip_mode, (void *)true); + o->bpp, o->depth, false, &o->fb_info[1 ]); o->fb_ids[2 ] =kmstest_create_fb (drm_fd, o->fb_width, o->fb_height, - o->bpp, o->depth, true, &o->fb_info[2 ], - paint_flip_mode, (void *)true); + o->bpp, o->depth, true, &o->fb_info[2 ]);if (!o->fb_ids[0 ] || !o->fb_ids[1 ] || !o->fb_ids[2 ]) {fprintf (stderr,"failed to create fbs\n" );exit (3 ); } +paint_flip_mode (&o->fb_info[0 ], false); +paint_flip_mode (&o->fb_info[1 ], true); +paint_flip_mode (&o->fb_info[2 ], true); +set_y_tiling (o,2 );kmstest_dump_mode (&o->mode);@@ -1044,9 +1050,9 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration)fprintf (stdout,"\n%s on crtc %d, connector %d: PASSED\n\n" , o->test_name, o->crtc, o->id); -kmstest_remove_fb (drm_fd, o->fb_ids[2 ]); -kmstest_remove_fb (drm_fd, o->fb_ids[1 ]); -kmstest_remove_fb (drm_fd, o->fb_ids[0 ]); +kmstest_remove_fb (drm_fd, &o->fb_info[2 ]); +kmstest_remove_fb (drm_fd, &o->fb_info[1 ]); +kmstest_remove_fb (drm_fd, &o->fb_info[0 ]); last_connector =NULL ;tests/testdisplay.c +10
-6@@ -258,15 +258,18 @@ static void paint_image(cairo_t *cr, const char *file)cairo_surface_destroy (image); } -static void -paint_output_info (cairo_t *cr,int l_width,int l_height,void *priv) +static void paint_output_info (struct connector *c,struct kmstest_fb *fb) { -struct connector *c = priv; +cairo_t *cr =kmstest_get_cairo_ctx (drm_fd, fb); +int l_width = fb->width; +int l_height = fb->height;double str_width;double x, y, top_y;double max_width;int i; +kmstest_paint_test_pattern (cr, l_width, l_height); +cairo_select_font_face (cr,"Helvetica" ,CAIRO_FONT_SLANT_NORMAL ,CAIRO_FONT_WEIGHT_NORMAL );@@ -308,6 +311,8 @@ paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)if (qr_code)paint_image (cr,"./pass.png" ); + +assert (!cairo_status (cr)); }static void sighandler (int signo)@@ -362,8 +367,8 @@ set_mode(struct connector *c) height = c->mode.vdisplay; fb_id =kmstest_create_fb (drm_fd, width, height, bpp, depth, - enable_tiling, &fb_info, - paint_output_info, c); + enable_tiling, &fb_info); +paint_output_info (c, &fb_info); fb_ptr =gem_mmap (drm_fd, fb_info.gem_handle, fb_info.size,PROT_READ |PROT_WRITE ); --1.8.1.2
_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Signature · 2 lines
Rodrigo Vivi Blog: http://blog.vivi.eng.br
PATCH 5/5 tests: add kms_render
In reply to Imre DeakAdd a test going through all connectors/crtcs/modes/formats painting to a front FB with CPU or painting to a back FB with CPU and blitting it to the front FB.
Only formats understood by cairo are supported for now.
--- lib/drmtest.c | 101 ++++++++++++++++++++-- lib/drmtest.h | 7 ++ tests/.gitignore | 1 + tests/Makefile.am | 1 + tests/kms_render.c | 245 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 349 insertions(+), 6 deletions(-) create mode 100644 tests/kms_render.c
lib/drmtest.c +95 -6
@@ -842,8 +842,8 @@ static int create_bo_for_fb(int fd, int width, int height, int bpp,return 0 ; } -static void -paint_color_gradient (cairo_t *cr,int x,int y,int w,int h, +void +kmstest_paint_color_gradient (cairo_t *cr,int x,int y,int w,int h,int r,int g,int b) {cairo_pattern_t *pat;
@@ -869,16 +869,16 @@ paint_test_patterns(cairo_t *cr, int width, int height) gr_height = height *0.08 ; x = (width /2 ) - (gr_width /2 ); -paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,0 ,0 ); +kmstest_paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,0 ,0 ); y += gr_height; -paint_color_gradient (cr, x, y, gr_width, gr_height,0 ,1 ,0 ); +kmstest_paint_color_gradient (cr, x, y, gr_width, gr_height,0 ,1 ,0 ); y += gr_height; -paint_color_gradient (cr, x, y, gr_width, gr_height,0 ,0 ,1 ); +kmstest_paint_color_gradient (cr, x, y, gr_width, gr_height,0 ,0 ,1 ); y += gr_height; -paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,1 ,1 ); +kmstest_paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,1 ,1 ); } int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
@@ -1025,6 +1025,55 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,return fb->fb_id; } +static uint32_t drm_format_to_bpp (uint32_t drm_format) +{ +struct format_desc_struct *f; + +for_each_format (f) +if (f->drm_id == drm_format) +return f->bpp; + +abort (); +} + +unsigned int kmstest_create_fb2 (int fd,int width,int height,uint32_t format, +bool tiled,struct kmstest_fb *fb) +{ +uint32_t handles[4 ]; +uint32_t pitches[4 ]; +uint32_t offsets[4 ]; +uint32_t fb_id; +int bpp; +int ret; + +memset (fb,0 ,sizeof (*fb)); + + bpp =drm_format_to_bpp (format); + ret =create_bo_for_fb (fd, width, height, bpp, tiled, &fb->gem_handle, + &fb->size, &fb->stride); +if (ret <0 ) +return ret; + +memset (handles,0 ,sizeof (handles)); + handles[0 ] = fb->gem_handle; +memset (pitches,0 ,sizeof (pitches)); + pitches[0 ] = fb->stride; +memset (offsets,0 ,sizeof (offsets)); +if (drmModeAddFB2 (fd, width, height, format, handles, pitches, + offsets, &fb_id,0 ) <0 ) { +gem_close (fd, fb->gem_handle); + +return 0 ; + } + + fb->width = width; + fb->height = height; + fb->drm_format = format; + fb->fb_id = fb_id; + +return fb_id; +} +static cairo_format_t drm_format_to_cairo (uint32_t drm_format) {struct format_desc_struct *f;
@@ -1075,6 +1124,46 @@ void kmstest_remove_fb(int fd, struct kmstest_fb *fb)gem_close (fd, fb->gem_handle); } +const char *kmstest_format_str (uint32_t drm_format) +{ +struct format_desc_struct *f; + +for_each_format (f) +if (f->drm_id == drm_format) +return f->name; + +return "invalid" ; +} + +const char *kmstest_pipe_str (int pipe) +{ +const char *str[] = {"A" ,"B" ,"C" }; + +if (pipe >2 ) +return "invalid" ; + +return str[pipe]; +} + +void kmstest_get_all_formats (const uint32_t **formats,int *format_count) +{ +static uint32_t *drm_formats; + +if (!drm_formats) { +struct format_desc_struct *f; +uint32_t *format; + + drm_formats =calloc (ARRAY_SIZE (format_desc), +sizeof (*drm_formats)); + format = &drm_formats[0 ]; +for_each_format (f) + *format++ = f->drm_id; + } + + *formats = drm_formats; + *format_count =ARRAY_SIZE (format_desc); +} +struct type_name {int type;const char *name;
lib/drmtest.h +7 -0
@@ -144,11 +144,18 @@ int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,unsigned int kmstest_create_fb (int fd,int width,int height,int bpp,int depth,bool tiled,struct kmstest_fb *fb_info); +unsigned int kmstest_create_fb2 (int fd,int width,int height,uint32_t format, +bool tiled,struct kmstest_fb *fb);void kmstest_remove_fb (int fd,struct kmstest_fb *fb_info);cairo_t *kmstest_get_cairo_ctx (int fd,struct kmstest_fb *fb); +void kmstest_paint_color_gradient (cairo_t *cr,int x,int y,int w,int h, +int r,int g,int b);void kmstest_paint_test_pattern (cairo_t *cr,int width,int height);void kmstest_dump_mode (drmModeModeInfo *mode);int kmstest_get_pipe_from_crtc_id (int fd,int crtc_id); +const char *kmstest_format_str (uint32_t drm_format); +const char *kmstest_pipe_str (int pipe); +void kmstest_get_all_formats (const uint32_t **formats,int *format_count);const char *kmstest_encoder_type_str (int type);const char *kmstest_connector_status_str (int type);const char *kmstest_connector_type_str (int type);
tests/.gitignore +1 -0
@@ -85,6 +85,7 @@ getclient getstats getversion kms_flip +kms_render prime_nv_api prime_nv_pcopy prime_nv_test
tests/Makefile.am +1 -0
@@ -33,6 +33,7 @@ TESTS_progs_M = \ gem_tiled_partial_pwrite_pread \ $(NOUVEAU_TESTS_M) \ kms_flip \ + kms_render \ prime_self_import \ $(NULL)
tests/kms_render.c new file +245 -0
245 lines not on this page · raw message
Signature · 1 line
1.8.1.2
Re: [igt PATCH 5/5] tests: add kms_render
nice tests, only now I understood why Daniel "randomly" volunteered me to review this series ;)
Quoted 460 lines · Imre Deak
Add a test going through all connectors/crtcs/modes/formats painting to a front FB with CPU or painting to a back FB with CPU and blitting it to the front FB.
Only formats understood by cairo are supported for now.
Signed-off-by Imre Deak <[email protected]>--- lib/drmtest.c | 101 ++++++++++++++++++++-- lib/drmtest.h | 7 ++ tests/.gitignore | 1 + tests/Makefile.am | 1 + tests/kms_render.c | 245 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 349 insertions(+), 6 deletions(-) create mode 100644 tests/kms_render.clib/drmtest.c +95
-6@@ -842,8 +842,8 @@ static int create_bo_for_fb(int fd, int width, int height, int bpp,return 0 ; } -static void -paint_color_gradient (cairo_t *cr,int x,int y,int w,int h, +void +kmstest_paint_color_gradient (cairo_t *cr,int x,int y,int w,int h,int r,int g,int b) {cairo_pattern_t *pat;@@ -869,16 +869,16 @@ paint_test_patterns(cairo_t *cr, int width, int height) gr_height = height *0.08 ; x = (width /2 ) - (gr_width /2 ); -paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,0 ,0 ); +kmstest_paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,0 ,0 ); y += gr_height; -paint_color_gradient (cr, x, y, gr_width, gr_height,0 ,1 ,0 ); +kmstest_paint_color_gradient (cr, x, y, gr_width, gr_height,0 ,1 ,0 ); y += gr_height; -paint_color_gradient (cr, x, y, gr_width, gr_height,0 ,0 ,1 ); +kmstest_paint_color_gradient (cr, x, y, gr_width, gr_height,0 ,0 ,1 ); y += gr_height; -paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,1 ,1 ); +kmstest_paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,1 ,1 ); } int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,@@ -1025,6 +1025,55 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,return fb->fb_id; } +static uint32_t drm_format_to_bpp (uint32_t drm_format) +{ +struct format_desc_struct *f; + +for_each_format (f) +if (f->drm_id == drm_format) +return f->bpp; + +abort (); +} + +unsigned int kmstest_create_fb2 (int fd,int width,int height,uint32_t format, +bool tiled,struct kmstest_fb *fb) +{ +uint32_t handles[4 ]; +uint32_t pitches[4 ]; +uint32_t offsets[4 ]; +uint32_t fb_id; +int bpp; +int ret; + +memset (fb,0 ,sizeof (*fb)); + + bpp =drm_format_to_bpp (format); + ret =create_bo_for_fb (fd, width, height, bpp, tiled, &fb->gem_handle, + &fb->size, &fb->stride); +if (ret <0 ) +return ret; + +memset (handles,0 ,sizeof (handles)); + handles[0 ] = fb->gem_handle; +memset (pitches,0 ,sizeof (pitches)); + pitches[0 ] = fb->stride; +memset (offsets,0 ,sizeof (offsets)); +if (drmModeAddFB2 (fd, width, height, format, handles, pitches, + offsets, &fb_id,0 ) <0 ) { +gem_close (fd, fb->gem_handle); + +return 0 ; + } + + fb->width = width; + fb->height = height; + fb->drm_format = format; + fb->fb_id = fb_id; + +return fb_id; +} +static cairo_format_t drm_format_to_cairo (uint32_t drm_format) {struct format_desc_struct *f;@@ -1075,6 +1124,46 @@ void kmstest_remove_fb(int fd, struct kmstest_fb *fb)gem_close (fd, fb->gem_handle); } +const char *kmstest_format_str (uint32_t drm_format) +{ +struct format_desc_struct *f; + +for_each_format (f) +if (f->drm_id == drm_format) +return f->name; + +return "invalid" ; +} + +const char *kmstest_pipe_str (int pipe) +{ +const char *str[] = {"A" ,"B" ,"C" }; + +if (pipe >2 ) +return "invalid" ; + +return str[pipe]; +} + +void kmstest_get_all_formats (const uint32_t **formats,int *format_count) +{ +static uint32_t *drm_formats; + +if (!drm_formats) { +struct format_desc_struct *f; +uint32_t *format; + + drm_formats =calloc (ARRAY_SIZE (format_desc), +sizeof (*drm_formats)); + format = &drm_formats[0 ]; +for_each_format (f) + *format++ = f->drm_id; + } + + *formats = drm_formats; + *format_count =ARRAY_SIZE (format_desc); +} +struct type_name {int type;const char *name;lib/drmtest.h +7
-0@@ -144,11 +144,18 @@ int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,unsigned int kmstest_create_fb (int fd,int width,int height,int bpp,int depth,bool tiled,struct kmstest_fb *fb_info); +unsigned int kmstest_create_fb2 (int fd,int width,int height,uint32_t format, +bool tiled,struct kmstest_fb *fb);void kmstest_remove_fb (int fd,struct kmstest_fb *fb_info);cairo_t *kmstest_get_cairo_ctx (int fd,struct kmstest_fb *fb); +void kmstest_paint_color_gradient (cairo_t *cr,int x,int y,int w,int h, +int r,int g,int b);void kmstest_paint_test_pattern (cairo_t *cr,int width,int height);void kmstest_dump_mode (drmModeModeInfo *mode);int kmstest_get_pipe_from_crtc_id (int fd,int crtc_id); +const char *kmstest_format_str (uint32_t drm_format); +const char *kmstest_pipe_str (int pipe); +void kmstest_get_all_formats (const uint32_t **formats,int *format_count);const char *kmstest_encoder_type_str (int type);const char *kmstest_connector_status_str (int type);const char *kmstest_connector_type_str (int type);tests/.gitignore +1
-0@@ -85,6 +85,7 @@ getclient getstats getversion kms_flip +kms_render prime_nv_api prime_nv_pcopy prime_nv_testtests/Makefile.am +1
-0@@ -33,6 +33,7 @@ TESTS_progs_M = \ gem_tiled_partial_pwrite_pread \ $(NOUVEAU_TESTS_M) \ kms_flip \ + kms_render \ prime_self_import \ $(NULL)tests/kms_render.c new file +245
-1@@ -0,0 +1,245 @@ +/* +* 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. +* +* Authors: +* Imre Deak <[email protected]> +*/ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <assert.h> +#include <cairo.h> +#include <errno.h> +#include <stdint.h> +#include <unistd.h> +#include <sys/time.h> + +#include "drmtest.h" +#include "testdisplay.h" +#include "intel_bufmgr.h" +#include "intel_batchbuffer.h" +#include "intel_gpu_tools.h" + +drmModeRes *resources; +int drm_fd; +static drm_intel_bufmgr *bufmgr; +struct intel_batchbuffer *batch; +uint32_t devid; + +enum test_flags { +TEST_DIRECT_RENDER =0x01 , +TEST_GPU_BLIT =0x02 , +}; + +static int paint_fb (struct kmstest_fb *fb,const char *test_name, +const char *mode_format_str,const char *cconf_str) +{ +cairo_t *cr; + + cr =kmstest_get_cairo_ctx (drm_fd, fb); +if (!cr) +return -1 ; + +kmstest_paint_color_gradient (cr,0 ,0 , fb->width, fb->height,1 ,1 ,1 ); +kmstest_paint_test_pattern (cr, fb->width, fb->height); + +cairo_select_font_face (cr,"Helvetica" ,CAIRO_FONT_SLANT_NORMAL , +CAIRO_FONT_WEIGHT_NORMAL ); +cairo_move_to (cr, fb->width /2 , fb->height /2 ); +cairo_set_font_size (cr,36 ); +kmstest_cairo_printf_line (cr, align_hcenter,10 ,"%s" , test_name); +kmstest_cairo_printf_line (cr, align_hcenter,10 ,"%s" , mode_format_str); +kmstest_cairo_printf_line (cr, align_hcenter,10 ,"%s" , cconf_str); + +return 0 ; +} + +static void gpu_blit (struct kmstest_fb *dst_fb,struct kmstest_fb *src_fb) +{ +drm_intel_bo *dst_bo; +drm_intel_bo *src_bo; + + dst_bo =gem_handle_to_libdrm_bo (bufmgr, drm_fd,"destination" , + dst_fb->gem_handle); +assert (dst_bo); + src_bo =gem_handle_to_libdrm_bo (bufmgr, drm_fd,"source" , + src_fb->gem_handle); +assert (src_bo); + +intel_copy_bo (batch, dst_bo, src_bo, src_fb->width, src_fb->height); +intel_batchbuffer_flush (batch); +gem_quiescent_gpu (drm_fd); + +drm_intel_bo_unreference (src_bo); +drm_intel_bo_unreference (dst_bo); +} + +static int test_format (const char *test_name, +struct kmstest_connector_config *cconf, +drmModeModeInfo *mode,uint32_t format, +enum test_flags flags) +{ +int width; +int height; +struct kmstest_fb fb[2 ]; +char *mode_format_str; +char *cconf_str; +int ret; + + ret =asprintf (&mode_format_str,"%s @ %dHz / %s" , + mode->name, mode->vrefresh,kmstest_format_str (format)); +assert (ret >0 ); + ret =asprintf (&cconf_str,"pipe %s, encoder %s, connector %s" , +kmstest_pipe_str (cconf->pipe), +kmstest_encoder_type_str (cconf->encoder->encoder_type), +kmstest_connector_type_str (cconf->connector->connector_type)); +assert (ret >0 ); + +printf ("Beginning test %s with %s on %s\n" , + test_name, mode_format_str, cconf_str); + + width = mode->hdisplay; + height = mode->vdisplay; + +if (!kmstest_create_fb2 (drm_fd, width, height, format, false, &fb[0 ])) + goto err1; + +if (!kmstest_create_fb2 (drm_fd, width, height, format, false, &fb[1 ])) + goto err2; + +do_or_die (drmModeSetCrtc (drm_fd, cconf->crtc->crtc_id, fb[0 ].fb_id, +0 ,0 , &cconf->connector->connector_id,1 , + mode)); +do_or_die (drmModePageFlip (drm_fd, cconf->crtc->crtc_id, fb[0 ].fb_id, +0 ,NULL )); +sleep (2 ); + +if (flags &TEST_DIRECT_RENDER ) { +paint_fb (&fb[0 ], test_name, mode_format_str, cconf_str); + }else if (flags &TEST_GPU_BLIT ) { +paint_fb (&fb[1 ], test_name, mode_format_str, cconf_str); +gpu_blit (&fb[0 ], &fb[1 ]); + } +sleep (5 ); + +printf ("Test %s with %s on %s: PASSED\n" , + test_name, mode_format_str, cconf_str); +free (mode_format_str); +free (cconf_str); + +kmstest_remove_fb (drm_fd, &fb[1 ]); +kmstest_remove_fb (drm_fd, &fb[0 ]); + +return 0 ; + +err2: +kmstest_remove_fb (drm_fd, &fb[0 ]); +err1: +fprintf (stderr,"skip testing unsupported format %s\n" , +kmstest_format_str (format)); + +return -1 ; +} + +static void test_connector (const char *test_name, +struct kmstest_connector_config *cconf, +enum test_flags flags) +{ +const uint32_t *formats; +int format_count; +int i; + +kmstest_get_all_formats (&formats, &format_count); +for (i =0 ; i < cconf->connector->count_modes; i++) { +int j; + +for (j =0 ; j < format_count; j++) +test_format (test_name, + cconf, &cconf->connector->modes[i], + formats[j], flags); + } +} + +static int run_test (const char *test_name,enum test_flags flags) +{ +int i; + + resources =drmModeGetResources (drm_fd); +assert (resources); + +/* Find any connected displays */ +for (i =0 ; i < resources->count_connectors; i++) { +uint32_t connector_id; +int j; + + connector_id = resources->connectors[i]; +for (j =0 ; j < resources->count_crtcs; j++) { +struct kmstest_connector_config cconf; +int ret; + + ret =kmstest_get_connector_config (drm_fd, connector_id, +1 << j, &cconf); +if (ret <0 ) +continue ; + +test_connector (test_name, &cconf, flags); + +kmstest_free_connector_config (&cconf); + } + } + +drmModeFreeResources (resources); + +return 1 ; +} + +int main (int argc,char **argv) +{ +struct { +enum test_flags flags; +const char *name; + } tests[] = { + {TEST_DIRECT_RENDER ,"direct-render" }, + {TEST_GPU_BLIT ,"gpu-blit" }, + }; +int i; + +drmtest_subtest_init (argc, argv); + +if (!drmtest_only_list_subtests ()) { + drm_fd =drm_open_any (); + + bufmgr =drm_intel_bufmgr_gem_init (drm_fd,4096 ); + devid =intel_get_drm_devid (drm_fd); + batch =intel_batchbuffer_alloc (bufmgr, devid); + +do_or_die (drmtest_set_vt_graphics_mode ()); + } + +for (i =0 ; i <ARRAY_SIZE (tests); i++) { +if (drmtest_run_subtest (tests[i].name)) +run_test (tests[i].name, tests[i].flags); + } + +if (!drmtest_only_list_subtests ()) +close (drm_fd); + +return 0 ; +} --1.8.1.2
_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Signature · 2 lines
Rodrigo Vivi Blog: http://blog.vivi.eng.br
Re: [igt PATCH 5/5] tests: add kms_render
Quoted 3 lines · Rodrigo Vivi
nice tests, only now I understood why Daniel "randomly" volunteered me to review this series ;)
Reviewed-by Rodrigo Vivi <[email protected]>
Thanks for the review, the patchset is pushed now to igt.
--Imre
v2 cover tests: add tests for front buffer rendering
In reply to Imre Deakv2:
- split changes to paint_marker() to a separate patch (Rodrigo)
Imre Deak (6):
lib: move connector_type_str and co to drmtest
lib: add kmstest_cairo_printf_line
lib: use kmstest_cairo_printf_line in paint_marker
lib: add kmstest_get_connector_config
lib: refactor kmstest_create_fb
tests: add kms_render
demos/intel_sprite_on.c | 58 +---- lib/drmtest.c | 575 +++++++++++++++++++++++++++++++++++++----------- lib/drmtest.h | 50 ++++- tests/.gitignore | 1 + tests/Makefile.am | 1 + tests/kms_flip.c | 145 ++++-------- tests/kms_render.c | 245 +++++++++++++++++++++ tests/testdisplay.c | 304 +++++++------------------ 8 files changed, 866 insertions(+), 513 deletions(-) create mode 100644 tests/kms_render.c
Signature · 1 line
1.8.1.2
PATCH v2 1/6 lib: move connector_type_str and co to drmtest
These are used by multiple test cases, so make them shared.
--- demos/intel_sprite_on.c | 58 ++++------------------------------------------ lib/drmtest.c | 54 +++++++++++++++++++++++++++++++++++++++++++ lib/drmtest.h | 3 +++ tests/testdisplay.c | 61 ++++--------------------------------------------- 4 files changed, 65 insertions(+), 111 deletions(-)
demos/intel_sprite_on.c +4 -54
@@ -53,56 +53,6 @@#define ARRAY_SIZE (arr) (sizeof(arr) / sizeof((arr)[0])) -struct type_name { -int type; -const char *name; -}; - -#define type_name_fn (res) \ - static const char * res##_str(int type) { \ - unsigned int i; \ - for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \ - if (res##_names[i].type == type) \ - return res##_names[i].name; \ - } \ - return "(invalid)"; \ - } - -struct type_name encoder_type_names[] = { - {DRM_MODE_ENCODER_NONE ,"none" }, - {DRM_MODE_ENCODER_DAC ,"DAC" }, - {DRM_MODE_ENCODER_TMDS ,"TMDS" }, - {DRM_MODE_ENCODER_LVDS ,"LVDS" }, - {DRM_MODE_ENCODER_TVDAC ,"TVDAC" }, -}; -type_name_fn (encoder_type) - -struct type_name connector_status_names[] = { - {DRM_MODE_CONNECTED ,"connected" }, - {DRM_MODE_DISCONNECTED ,"disconnected" }, - {DRM_MODE_UNKNOWNCONNECTION ,"unknown" }, -}; -type_name_fn (connector_status) - -struct type_name connector_type_names[] = { - { DRM_MODE_CONNECTOR_Unknown,"unknown" }, - {DRM_MODE_CONNECTOR_VGA ,"VGA" }, - {DRM_MODE_CONNECTOR_DVII ,"DVI-I" }, - {DRM_MODE_CONNECTOR_DVID ,"DVI-D" }, - {DRM_MODE_CONNECTOR_DVIA ,"DVI-A" }, - { DRM_MODE_CONNECTOR_Composite,"composite" }, - {DRM_MODE_CONNECTOR_SVIDEO ,"s-video" }, - {DRM_MODE_CONNECTOR_LVDS ,"LVDS" }, - { DRM_MODE_CONNECTOR_Component,"component" }, - { DRM_MODE_CONNECTOR_9PinDIN,"9-pin DIN" }, - { DRM_MODE_CONNECTOR_DisplayPort,"DisplayPort" }, - {DRM_MODE_CONNECTOR_HDMIA ,"HDMI-A" }, - {DRM_MODE_CONNECTOR_HDMIB ,"HDMI-B" }, - {DRM_MODE_CONNECTOR_TV ,"TV" }, - { DRM_MODE_CONNECTOR_eDP,"Embedded DisplayPort" }, -}; -type_name_fn (connector_type) -/* * Mode setting with the kernel interfaces is a bit of a chore. * First you have to find the connector in question and make sure the
@@ -157,8 +107,8 @@ static void dump_connectors(int gfx_fd, drmModeRes *resources)printf ("%d\t%d\t%s\t%s\t%dx%d\t\t%d\n" , connector->connector_id, connector->encoder_id, -connector_status_str (connector->connection), -connector_type_str (connector->connector_type), +kmstest_connector_status_str (connector->connection), +kmstest_connector_type_str (connector->connector_type), connector->mmWidth, connector->mmHeight, connector->count_modes);
@@ -744,14 +694,14 @@ static void ricochet(int tiled, int sprite_w, int sprite_h, curr_connector.mode.flags, curr_connector.encoder->encoder_id, curr_connector.encoder->encoder_type, -encoder_type_str (curr_connector.encoder->encoder_type), +kmstest_encoder_type_str (curr_connector.encoder->encoder_type), curr_connector.encoder->crtc_id, curr_connector.encoder->possible_crtcs, curr_connector.encoder->possible_clones, curr_connector.connector->connector_id, curr_connector.connector->encoder_id, curr_connector.connector->connector_type, -connector_type_str (curr_connector.connector->connector_type), +kmstest_connector_type_str (curr_connector.connector->connector_type), curr_connector.connector->connector_type_id); printf("Sprite surface dimensions = %dx%d\n"
lib/drmtest.c +54 -0
60 lines not on this page · raw message
lib/drmtest.h +3 -0
@@ -119,6 +119,9 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,void kmstest_remove_fb (int fd,int fb_id);void kmstest_dump_mode (drmModeModeInfo *mode);int kmstest_get_pipe_from_crtc_id (int fd,int crtc_id); +const char *kmstest_encoder_type_str (int type); +const char *kmstest_connector_status_str (int type); +const char *kmstest_connector_type_str (int type);inline static void _do_or_die (const char *function,int line,int ret) {
tests/testdisplay.c +4 -57
85 lines not on this page · raw message
Signature · 1 line
1.8.1.2
PATCH v2 2/6 lib: add kmstest_cairo_printf_line
In reply to Imre Deak--- lib/drmtest.c | 44 ++++++++++++++++++++++++ lib/drmtest.h | 13 ++++++++ tests/testdisplay.c | 96 ++++++++++++++++------------------------------------- 3 files changed, 86 insertions(+), 67 deletions(-)
lib/drmtest.c +44 -0
@@ -907,6 +907,50 @@ paint_test_patterns(cairo_t *cr, int width, int height)paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,1 ,1 ); } +int kmstest_cairo_printf_line (cairo_t *cr,enum kmstest_text_align align, +double yspacing,const char *fmt, ...) +{ +double x, y, xofs, yofs; +cairo_text_extents_t extents; +char *text; +va_list ap; +int ret; + +va_start (ap, fmt); + ret =vasprintf (&text, fmt, ap); +assert (ret >=0 ); +va_end (ap); + +cairo_text_extents (cr, text, &extents); + + xofs = yofs =0 ; +if (align & align_right) + xofs = -extents.width; +else if (align & align_hcenter) + xofs = -extents.width /2 ; + +if (align & align_top) + yofs = extents.height; +else if (align & align_vcenter) + yofs = extents.height /2 ; + +cairo_get_current_point (cr, &x, &y); +if (xofs || yofs) +cairo_rel_move_to (cr, xofs, yofs); + +cairo_text_path (cr, text); +cairo_set_source_rgb (cr,0 ,0 ,0 ); +cairo_stroke_preserve (cr); +cairo_set_source_rgb (cr,1 ,1 ,1 ); +cairo_fill (cr); + +cairo_move_to (cr, x, y + extents.height + yspacing); + +free (text); + +return extents.width; +} +enum corner { topleft, topright,
lib/drmtest.h +13 -0
@@ -109,6 +109,19 @@ struct kmstest_fb {unsigned size; }; +enum kmstest_text_align { + align_left, + align_bottom = align_left, + align_right =0x01 , + align_top =0x02 , + align_vcenter =0x04 , + align_hcenter =0x08 , +}; + +int kmstest_cairo_printf_line (cairo_t *cr,enum kmstest_text_align align, +double yspacing,const char *fmt, ...) + __attribute__((format (printf,4 ,5 ))); +typedef void (*kmstest_paint_func )(cairo_t *cr,int width,int height,void *priv); unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
tests/testdisplay.c +29 -67
115 lines not on this page · raw message
Signature · 1 line
1.8.1.2
Re: [PATCH v2 2/6] lib: add kmstest_cairo_printf_line
Quoted 213 lines · Imre Deak
Signed-off-by Imre Deak <[email protected]>--- lib/drmtest.c | 44 ++++++++++++++++++++++++ lib/drmtest.h | 13 ++++++++ tests/testdisplay.c | 96 ++++++++++++++++------------------------------------- 3 files changed, 86 insertions(+), 67 deletions(-)lib/drmtest.c +44
-0@@ -907,6 +907,50 @@ paint_test_patterns(cairo_t *cr, int width, int height)paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,1 ,1 ); } +int kmstest_cairo_printf_line (cairo_t *cr,enum kmstest_text_align align, +double yspacing,const char *fmt, ...) +{ +double x, y, xofs, yofs; +cairo_text_extents_t extents; +char *text; +va_list ap; +int ret; + +va_start (ap, fmt); + ret =vasprintf (&text, fmt, ap); +assert (ret >=0 ); +va_end (ap); + +cairo_text_extents (cr, text, &extents); + + xofs = yofs =0 ; +if (align & align_right) + xofs = -extents.width; +else if (align & align_hcenter) + xofs = -extents.width /2 ; + +if (align & align_top) + yofs = extents.height; +else if (align & align_vcenter) + yofs = extents.height /2 ; + +cairo_get_current_point (cr, &x, &y); +if (xofs || yofs) +cairo_rel_move_to (cr, xofs, yofs); + +cairo_text_path (cr, text); +cairo_set_source_rgb (cr,0 ,0 ,0 ); +cairo_stroke_preserve (cr); +cairo_set_source_rgb (cr,1 ,1 ,1 ); +cairo_fill (cr); + +cairo_move_to (cr, x, y + extents.height + yspacing); + +free (text); + +return extents.width; +} +enum corner { topleft, topright,lib/drmtest.h +13
-0@@ -109,6 +109,19 @@ struct kmstest_fb {unsigned size; }; +enum kmstest_text_align { + align_left, + align_bottom = align_left, + align_right =0x01 , + align_top =0x02 , + align_vcenter =0x04 , + align_hcenter =0x08 , +}; + +int kmstest_cairo_printf_line (cairo_t *cr,enum kmstest_text_align align, +double yspacing,const char *fmt, ...) + __attribute__((format (printf,4 ,5 ))); +typedef void (*kmstest_paint_func )(cairo_t *cr,int width,int height,void *priv); unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,tests/testdisplay.c +29
-68@@ -331,86 +331,48 @@ static void paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv) {struct connector *c = priv; -cairo_text_extents_t name_extents, mode_extents; -char name_buf[128 ], mode_buf[128 ]; -int i, x, y, modes_x, modes_y; +double str_width; +double x, y, top_y; +double max_width; +int i; -/* Get text extents for each string */ -snprintf (name_buf,sizeof name_buf,"%s" , -kmstest_connector_type_str (c->connector->connector_type)); -cairo_set_font_size (cr,48 );cairo_select_font_face (cr,"Helvetica" ,CAIRO_FONT_SLANT_NORMAL ,CAIRO_FONT_WEIGHT_NORMAL ); -cairo_text_extents (cr, name_buf, &name_extents); - -snprintf (mode_buf,sizeof mode_buf,"%s @ %dHz on %s encoder" , - c->mode.name, c->mode.vrefresh, -kmstest_encoder_type_str (c->encoder->encoder_type)); -cairo_set_font_size (cr,36 ); -cairo_text_extents (cr, mode_buf, &mode_extents); +cairo_move_to (cr, l_width /2 , l_height /2 ); -/* Paint output name */ - x = l_width /2 ; - x -= name_extents.width /2 ; - y = l_height /2 ; - y -= (name_extents.height /2 ) - (mode_extents.height /2 ) -10 ; +/* Print connector and mode name */ cairo_set_font_size (cr,48 ); -cairo_move_to (cr, x, y); -cairo_text_path (cr, name_buf); -cairo_set_source_rgb (cr,0 ,0 ,0 ); -cairo_stroke_preserve (cr); -cairo_set_source_rgb (cr,1 ,1 ,1 ); -cairo_fill (cr); - -/* Paint mode name */ - x = l_width /2 ; - x -= mode_extents.width /2 ; - modes_x = x; - y = l_height /2 ; - y += (mode_extents.height /2 ) + (name_extents.height /2 ) +10 ; +kmstest_cairo_printf_line (cr, align_hcenter,10 ,"%s" , +kmstest_connector_type_str (c->connector->connector_type)); +cairo_set_font_size (cr,36 ); -cairo_move_to (cr, x, y); -cairo_text_path (cr, mode_buf); -cairo_set_source_rgb (cr,0 ,0 ,0 ); -cairo_stroke_preserve (cr); -cairo_set_source_rgb (cr,1 ,1 ,1 ); -cairo_fill (cr); + str_width =kmstest_cairo_printf_line (cr, align_hcenter,10 , +"%s @ %dHz on %s encoder" , c->mode.name, c->mode.vrefresh, +kmstest_encoder_type_str (c->encoder->encoder_type)); + +cairo_rel_move_to (cr, -str_width /2 ,0 );/* List available modes */ -snprintf (mode_buf,sizeof mode_buf,"Available modes:" );cairo_set_font_size (cr,18 ); -cairo_text_extents (cr, mode_buf, &mode_extents); - x = modes_x; - modes_x = x + mode_extents.width; - y += mode_extents.height +10 ; - modes_y = y; -cairo_move_to (cr, x, y); -cairo_text_path (cr, mode_buf); -cairo_set_source_rgb (cr,0 ,0 ,0 ); -cairo_stroke_preserve (cr); -cairo_set_source_rgb (cr,1 ,1 ,1 ); -cairo_fill (cr); + str_width =kmstest_cairo_printf_line (cr, align_left,10 , +"Available modes:" ); +cairo_rel_move_to (cr, str_width,0 ); +cairo_get_current_point (cr, &x, &top_y); + max_width =0 ;for (i =0 ; i < c->connector->count_modes; i++) { -snprintf (mode_buf,sizeof mode_buf,"%s @ %dHz" , - c->connector->modes[i].name, - c->connector->modes[i].vrefresh); -cairo_set_font_size (cr,18 ); -cairo_text_extents (cr, mode_buf, &mode_extents); - x = modes_x - mode_extents.width;/* right justify modes */ - y += mode_extents.height +10 ; -if (y + mode_extents.height >= height) { - y = modes_y + mode_extents.height +10 ; - modes_x += mode_extents.width +10 ; - x = modes_x - mode_extents.width; +cairo_get_current_point (cr, &x, &y); +if (y >= l_height) { + x += max_width +10 ; + max_width =0 ; +cairo_move_to (cr, x, top_y); } -cairo_move_to (cr, x, y); -cairo_text_path (cr, mode_buf); -cairo_set_source_rgb (cr,0 ,0 ,0 ); -cairo_stroke_preserve (cr); -cairo_set_source_rgb (cr,1 ,1 ,1 ); -cairo_fill (cr); + str_width =kmstest_cairo_printf_line (cr, align_right,10 , +"%s @ %dHz" , c->connector->modes[i %2 ].name, + c->connector->modes[i %2 ].vrefresh); +if (str_width > max_width) + max_width = str_width; }if (qr_code) --1.8.1.2
_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Signature · 2 lines
Rodrigo Vivi Blog: http://blog.vivi.eng.br
PATCH v3 2/6 lib: add kmstest_cairo_printf_line
In reply to Imre Deak--- lib/drmtest.c | 44 ++++++++++++++++++++++++ lib/drmtest.h | 13 ++++++++ tests/testdisplay.c | 96 ++++++++++++++++------------------------------------- 3 files changed, 86 insertions(+), 67 deletions(-)
lib/drmtest.c +44 -0
@@ -907,6 +907,50 @@ paint_test_patterns(cairo_t *cr, int width, int height)paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,1 ,1 ); } +int kmstest_cairo_printf_line (cairo_t *cr,enum kmstest_text_align align, +double yspacing,const char *fmt, ...) +{ +double x, y, xofs, yofs; +cairo_text_extents_t extents; +char *text; +va_list ap; +int ret; + +va_start (ap, fmt); + ret =vasprintf (&text, fmt, ap); +assert (ret >=0 ); +va_end (ap); + +cairo_text_extents (cr, text, &extents); + + xofs = yofs =0 ; +if (align & align_right) + xofs = -extents.width; +else if (align & align_hcenter) + xofs = -extents.width /2 ; + +if (align & align_top) + yofs = extents.height; +else if (align & align_vcenter) + yofs = extents.height /2 ; + +cairo_get_current_point (cr, &x, &y); +if (xofs || yofs) +cairo_rel_move_to (cr, xofs, yofs); + +cairo_text_path (cr, text); +cairo_set_source_rgb (cr,0 ,0 ,0 ); +cairo_stroke_preserve (cr); +cairo_set_source_rgb (cr,1 ,1 ,1 ); +cairo_fill (cr); + +cairo_move_to (cr, x, y + extents.height + yspacing); + +free (text); + +return extents.width; +} +enum corner { topleft, topright,
lib/drmtest.h +13 -0
@@ -109,6 +109,19 @@ struct kmstest_fb {unsigned size; }; +enum kmstest_text_align { + align_left, + align_bottom = align_left, + align_right =0x01 , + align_top =0x02 , + align_vcenter =0x04 , + align_hcenter =0x08 , +}; + +int kmstest_cairo_printf_line (cairo_t *cr,enum kmstest_text_align align, +double yspacing,const char *fmt, ...) + __attribute__((format (printf,4 ,5 ))); +typedef void (*kmstest_paint_func )(cairo_t *cr,int width,int height,void *priv); unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
tests/testdisplay.c +29 -67
115 lines not on this page · raw message
Signature · 1 line
1.8.1.2
PATCH v2 3/6 lib: use kmstest_cairo_printf_line in paint_marker
In reply to Imre Deak--- lib/drmtest.c | 64 +++++++++++++---------------------------------------------- 1 file changed, 14 insertions(+), 50 deletions(-)
lib/drmtest.c +14 -50
@@ -951,46 +951,12 @@ int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,return extents.width; } -enum corner { - topleft, - topright, - bottomleft, - bottomright, -}; -static void -paint_marker (cairo_t *cr,int x,int y,char *str,enum corner text_location) +paint_marker (cairo_t *cr,int x,int y) { -cairo_text_extents_t extents; +enum kmstest_text_align align;int xoff, yoff; -cairo_set_font_size (cr,18 ); -cairo_text_extents (cr, str, &extents); - -switch (text_location) { -case topleft: - xoff =-20 ; - xoff -= extents.width; - yoff =-20 ; -break ; -case topright: - xoff =20 ; - yoff =-20 ; -break ; -case bottomleft: - xoff =-20 ; - xoff -= extents.width; - yoff =20 ; -break ; -case bottomright: - xoff =20 ; - yoff =20 ; -break ; -default : - xoff =0 ; - yoff =0 ; - } -cairo_move_to (cr, x, y -20 );cairo_line_to (cr, x, y +20 );cairo_move_to (cr, x -20 , y);
@@ -1004,12 +970,15 @@ paint_marker(cairo_t *cr, int x, int y, char *str, enum corner text_location)cairo_set_line_width (cr,2 );cairo_stroke (cr); + xoff = x ?-20 :20 ; + align = x ? align_right : align_left; + + yoff = y ?-20 :20 ; + align |= y ? align_bottom : align_top; +cairo_move_to (cr, x + xoff, y + yoff); -cairo_text_path (cr, str); -cairo_set_source_rgb (cr,0 ,0 ,0 ); -cairo_stroke_preserve (cr); -cairo_set_source_rgb (cr,1 ,1 ,1 ); -cairo_fill (cr); +cairo_set_font_size (cr,18 ); +kmstest_cairo_printf_line (cr, align,0 ,"(%d, %d)" , x, y); } unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,
@@ -1021,7 +990,6 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,cairo_surface_t *surface;cairo_status_t status;cairo_t *cr; -char buf[128 ];unsigned int fb_id; surface = paint_allocate_surface(fd, width, height, depth, bpp,
@@ -1035,14 +1003,10 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,cairo_set_line_cap (cr,CAIRO_LINE_CAP_SQUARE );/* Paint corner markers */ -snprintf (buf,sizeof buf,"(%d, %d)" ,0 ,0 ); -paint_marker (cr,0 ,0 , buf, bottomright); -snprintf (buf,sizeof buf,"(%d, %d)" , width,0 ); -paint_marker (cr, width,0 , buf, bottomleft); -snprintf (buf,sizeof buf,"(%d, %d)" ,0 , height); -paint_marker (cr,0 , height, buf, topright); -snprintf (buf,sizeof buf,"(%d, %d)" , width, height); -paint_marker (cr, width, height, buf, topleft); +paint_marker (cr,0 ,0 ); +paint_marker (cr, width,0 ); +paint_marker (cr,0 , height); +paint_marker (cr, width, height);if (paint_func)paint_func (cr, width, height, func_arg);
Signature · 1 line
1.8.1.2
Re: [PATCH v2 3/6] lib: use kmstest_cairo_printf_line in paint_marker
Quoted 113 lines · Imre Deak
Signed-off-by Imre Deak <[email protected]>--- lib/drmtest.c | 64 +++++++++++++---------------------------------------------- 1 file changed, 14 insertions(+), 50 deletions(-)lib/drmtest.c +14
-51@@ -951,46 +951,12 @@ int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,return extents.width; } -enum corner { - topleft, - topright, - bottomleft, - bottomright, -}; -static void -paint_marker (cairo_t *cr,int x,int y,char *str,enum corner text_location) +paint_marker (cairo_t *cr,int x,int y) { -cairo_text_extents_t extents; +enum kmstest_text_align align;int xoff, yoff; -cairo_set_font_size (cr,18 ); -cairo_text_extents (cr, str, &extents); - -switch (text_location) { -case topleft: - xoff =-20 ; - xoff -= extents.width; - yoff =-20 ; -break ; -case topright: - xoff =20 ; - yoff =-20 ; -break ; -case bottomleft: - xoff =-20 ; - xoff -= extents.width; - yoff =20 ; -break ; -case bottomright: - xoff =20 ; - yoff =20 ; -break ; -default : - xoff =0 ; - yoff =0 ; - } -cairo_move_to (cr, x, y -20 );cairo_line_to (cr, x, y +20 );cairo_move_to (cr, x -20 , y);@@ -1004,12 +970,15 @@ paint_marker(cairo_t *cr, int x, int y, char *str, enum corner text_location)cairo_set_line_width (cr,2 );cairo_stroke (cr); + xoff = x ?-20 :20 ; + align = x ? align_right : align_left; + + yoff = y ?-20 :20 ; + align |= y ? align_bottom : align_top; +cairo_move_to (cr, x + xoff, y + yoff); -cairo_text_path (cr, str); -cairo_set_source_rgb (cr,0 ,0 ,0 ); -cairo_stroke_preserve (cr); -cairo_set_source_rgb (cr,1 ,1 ,1 ); -cairo_fill (cr); +cairo_set_font_size (cr,18 ); +kmstest_cairo_printf_line (cr, align,0 ,"(%d, %d)" , x, y); } unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,@@ -1021,7 +990,6 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,cairo_surface_t *surface;cairo_status_t status;cairo_t *cr; -char buf[128 ];unsigned int fb_id; surface = paint_allocate_surface(fd, width, height, depth, bpp,@@ -1035,14 +1003,10 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,cairo_set_line_cap (cr,CAIRO_LINE_CAP_SQUARE );/* Paint corner markers */ -snprintf (buf,sizeof buf,"(%d, %d)" ,0 ,0 ); -paint_marker (cr,0 ,0 , buf, bottomright); -snprintf (buf,sizeof buf,"(%d, %d)" , width,0 ); -paint_marker (cr, width,0 , buf, bottomleft); -snprintf (buf,sizeof buf,"(%d, %d)" ,0 , height); -paint_marker (cr,0 , height, buf, topright); -snprintf (buf,sizeof buf,"(%d, %d)" , width, height); -paint_marker (cr, width, height, buf, topleft); +paint_marker (cr,0 ,0 ); +paint_marker (cr, width,0 ); +paint_marker (cr,0 , height); +paint_marker (cr, width, height);if (paint_func)paint_func (cr, width, height, func_arg); --1.8.1.2
_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Signature · 2 lines
Rodrigo Vivi Blog: http://blog.vivi.eng.br
PATCH v2 4/6 lib: add kmstest_get_connector_config
In reply to Imre DeakThis is used by multiple test cases, so make it shared.
--- lib/drmtest.c | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/drmtest.h | 14 ++++++ tests/kms_flip.c | 115 ++++++++------------------------------------ tests/testdisplay.c | 134 +++++++++++++++------------------------------------- 4 files changed, 206 insertions(+), 191 deletions(-)
lib/drmtest.c +134 -0
@@ -1317,3 +1317,137 @@ int drmtest_set_vt_graphics_mode(void)return orig_vt_mode <0 ?-1 :0 ; } +static int get_connector_default_mode (int drm_fd,drmModeConnector *connector, +drmModeModeInfo *mode) +{ +drmModeRes *resources; +int i; + + resources =drmModeGetResources (drm_fd); +if (!resources) { +perror ("drmModeGetResources failed" ); + +return -1 ; + } + +if (!connector->count_modes) { +fprintf (stderr,"no modes for connector %d\n" , + connector->connector_id); +drmModeFreeResources (resources); + +return -1 ; + } + +for (i =0 ; i < connector->count_modes; i++) { +if (i ==0 || + connector->modes[i].type &DRM_MODE_TYPE_PREFERRED ) { + *mode = connector->modes[i]; +if (mode->type &DRM_MODE_TYPE_PREFERRED ) +break ; + } + } + +drmModeFreeResources (resources); + +return 0 ; +} + +int kmstest_get_connector_config (int drm_fd,uint32_t connector_id, +unsigned long crtc_idx_mask, +struct kmstest_connector_config *config) +{ +drmModeRes *resources; +drmModeConnector *connector; +drmModeEncoder *encoder; +int i, j; + + resources =drmModeGetResources (drm_fd); +if (!resources) { +perror ("drmModeGetResources failed" ); + goto err1; + } + +/* First, find the connector & mode */ + connector =drmModeGetConnector (drm_fd, connector_id); +if (!connector) + goto err2; + +if (connector->connection !=DRM_MODE_CONNECTED ) + goto err3; + +if (!connector->count_modes) { +fprintf (stderr,"connector %d has no modes\n" , connector_id); + goto err3; + } + +if (connector->connector_id != connector_id) { +fprintf (stderr,"connector id doesn't match (%d != %d)\n" , + connector->connector_id, connector_id); + goto err3; + } + +/* +* Find given CRTC if crtc_id != 0 or else the first CRTC not in use. +* In both cases find the first compatible encoder and skip the CRTC +* if there is non such. +*/ + encoder =NULL ;/* suppress GCC warning */ +for (i =0 ; i < resources->count_crtcs; i++) { +if (!resources->crtcs[i] || !(crtc_idx_mask & (1 << i))) +continue ; + +/* Now get a compatible encoder */ +for (j =0 ; j < connector->count_encoders; j++) { + encoder =drmModeGetEncoder (drm_fd, + connector->encoders[j]); + +if (!encoder) { +fprintf (stderr,"could not get encoder %d: %s\n" , + resources->encoders[j],strerror (errno)); + +continue ; + } + +if (encoder->possible_crtcs & (1 << i)) + goto found; + +drmModeFreeEncoder (encoder); + } + } + +fprintf (stderr, +"no crtc with a compatible encoder (crtc_idx_mask %08lx)\n" , + crtc_idx_mask); + goto err3; + +found: +if (get_connector_default_mode (drm_fd, connector, + &config->default_mode) <0 ) + goto err4; + + config->connector = connector; + config->encoder = encoder; + config->crtc =drmModeGetCrtc (drm_fd, resources->crtcs[i]); + config->crtc_idx = i; + config->pipe =kmstest_get_pipe_from_crtc_id (drm_fd, + config->crtc->crtc_id); + +drmModeFreeResources (resources); + +return 0 ; +err4: +drmModeFreeEncoder (encoder); +err3: +drmModeFreeConnector (connector); +err2: +drmModeFreeResources (resources); +err1: +return -1 ; +} + +void kmstest_free_connector_config (struct kmstest_connector_config *config) +{ +drmModeFreeCrtc (config->crtc); +drmModeFreeEncoder (config->encoder); +drmModeFreeConnector (config->connector); +}
lib/drmtest.h +14 -0
@@ -101,6 +101,20 @@ void drmtest_init_aperture_trashers(drm_intel_bufmgr *bufmgr);void drmtest_trash_aperture (void );void drmtest_cleanup_aperture_trashers (void ); +struct kmstest_connector_config { +drmModeCrtc *crtc; +drmModeConnector *connector; +drmModeEncoder *encoder; +drmModeModeInfo default_mode; +int crtc_idx; +int pipe; +}; + +int kmstest_get_connector_config (int drm_fd,uint32_t connector_id, +unsigned long crtc_idx_mask, +struct kmstest_connector_config *config); +void kmstest_free_connector_config (struct kmstest_connector_config *config); +/* helpers to create nice-looking framebuffers */ struct kmstest_fb {uint32_t fb_id;
tests/kms_flip.c +19 -96
170 lines not on this page · raw message
tests/testdisplay.c +39 -95
169 lines not on this page · raw message
Signature · 1 line
1.8.1.2
PATCH v2 5/6 lib: refactor kmstest_create_fb
In reply to Imre DeakFactor out parts that will be used by an upcoming patch adding kmstest_create_fb2.
Also call the fb paint functions directly, there is not much point in passing a function pointer for that.
--- lib/drmtest.c | 176 ++++++++++++++++++++++++++++++++-------------------- lib/drmtest.h | 15 +++-- tests/kms_flip.c | 30 +++++---- tests/testdisplay.c | 15 +++-- 4 files changed, 147 insertions(+), 89 deletions(-)
lib/drmtest.c +110 -66
@@ -39,6 +39,7 @@#include <getopt.h> #include <stdlib.h> #include <linux/kd.h> +#include <drm/drm_fourcc.h> #include "drmtest.h" #include "i915_drm.h"
@@ -788,16 +789,14 @@ void drmtest_cleanup_aperture_trashers(void) }/* helpers to create nice-looking framebuffers */ -static cairo_surface_t * -paint_allocate_surface (int fd,int width,int height,int depth,int bpp, -bool tiled, -struct kmstest_fb *fb_info) +static int create_bo_for_fb (int fd,int width,int height,int bpp, +bool tiled,uint32_t *gem_handle_ret, +unsigned *size_ret,unsigned *stride_ret) { -cairo_format_t format;struct drm_i915_gem_set_tiling set_tiling; +uint32_t gem_handle;int size;unsigned stride; -uint32_t *fb_ptr;if (tiled) {int v;
@@ -823,49 +822,24 @@ paint_allocate_surface(int fd, int width, int height, int depth, int bpp, size = stride * height; } -switch (depth) { -case 16 : - format =CAIRO_FORMAT_RGB16_565 ; -break ; -case 24 : - format =CAIRO_FORMAT_RGB24 ; -break ; -#if 0 -case 30 : - format =CAIRO_FORMAT_RGB30 ; -break ; -#endif -case 32 : - format =CAIRO_FORMAT_ARGB32 ; -break ; -default : -fprintf (stderr,"bad depth %d\n" , depth); -return NULL ; - } - -assert (bpp >= depth); - - fb_info->gem_handle =gem_create (fd, size); + gem_handle =gem_create (fd, size);if (tiled) { - set_tiling.handle = fb_info->gem_handle; + set_tiling.handle = gem_handle; set_tiling.tiling_mode =I915_TILING_X ; set_tiling.stride = stride;if (ioctl (fd,DRM_IOCTL_I915_GEM_SET_TILING , &set_tiling)) {fprintf (stderr,"set tiling failed: %s (stride=%d, size=%d)\n" ,strerror (errno), stride, size); -return NULL ; +return -1 ; } } - fb_ptr =gem_mmap (fd, fb_info->gem_handle, size,PROT_READ |PROT_WRITE ); - - fb_info->stride = stride; - fb_info->size = size; + *stride_ret = stride; + *size_ret = size; + *gem_handle_ret = gem_handle; -return cairo_image_surface_create_for_data ((unsigned char *)fb_ptr, - format, width, height, - stride); +return 0 ; } static void
@@ -981,23 +955,8 @@ paint_marker(cairo_t *cr, int x, int y)kmstest_cairo_printf_line (cr, align,0 ,"(%d, %d)" , x, y); } -unsigned int kmstest_create_fb (int fd,int width,int height,int bpp, -int depth,bool tiled, -struct kmstest_fb *fb_info, -kmstest_paint_func paint_func, -void *func_arg) +void kmstest_paint_test_pattern (cairo_t *cr,int width,int height) { -cairo_surface_t *surface; -cairo_status_t status; -cairo_t *cr; -unsigned int fb_id; - - surface =paint_allocate_surface (fd, width, height, depth, bpp, - tiled, fb_info); -assert (surface); - - cr =cairo_create (surface); -paint_test_patterns (cr, width, height);cairo_set_line_cap (cr,CAIRO_LINE_CAP_SQUARE );
@@ -1008,27 +967,112 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,paint_marker (cr,0 , height);paint_marker (cr, width, height); -if (paint_func) -paint_func (cr, width, height, func_arg); +assert (!cairo_status (cr)); +} + +#define DF (did, cid, _bpp, _depth) \ + { DRM_FORMAT_##did, CAIRO_FORMAT_##cid, # did, _bpp, _depth } +static struct format_desc_struct { +uint32_t drm_id; +cairo_format_t cairo_id; +const char *name; +int bpp; +int depth; +} format_desc[] = { +DF (RGB565 ,RGB16_565 ,16 ,16 ), +DF (RGB888 ,INVALID ,24 ,24 ), +DF (XRGB8888 ,RGB24 ,32 ,24 ), +DF (XRGB2101010 ,RGB30 ,32 ,30 ), +DF (ARGB8888 ,ARGB32 ,32 ,32 ), +}; +#undef DF + +#define for_each_format (f) \ + for (f = format_desc; f - format_desc < ARRAY_SIZE(format_desc); f++) + +static uint32_t bpp_depth_to_drm_format (int bpp,int depth) +{ +struct format_desc_struct *f; + +for_each_format (f) +if (f->bpp == bpp && f->depth == depth) +return f->drm_id; + +abort (); +} + +/* Return fb_id on success, 0 on error */ +unsigned int kmstest_create_fb (int fd,int width,int height,int bpp, +int depth,bool tiled,struct kmstest_fb *fb) +{ +memset (fb,0 ,sizeof (*fb)); - status =cairo_status (cr); -assert (!status); -cairo_destroy (cr); +if (create_bo_for_fb (fd, width, height, bpp, tiled, &fb->gem_handle, + &fb->size, &fb->stride) <0 ) +return 0 ; + +if (drmModeAddFB (fd, width, height, depth, bpp, fb->stride, + fb->gem_handle, &fb->fb_id) <0 ) { +gem_close (fd, fb->gem_handle); + +return 0 ; + } + + fb->width = width; + fb->height = height; + fb->drm_format =bpp_depth_to_drm_format (bpp, depth); + +return fb->fb_id; +} + +static cairo_format_t drm_format_to_cairo (uint32_t drm_format) +{ +struct format_desc_struct *f; -do_or_die (drmModeAddFB (fd, width, height, depth, bpp, - fb_info->stride, - fb_info->gem_handle, &fb_id)); +for_each_format (f) +if (f->drm_id == drm_format) +return f->cairo_id; +abort (); +} + +static cairo_t *create_cairo_ctx (int fd,struct kmstest_fb *fb) +{ +cairo_t *cr; +cairo_surface_t *surface; +cairo_format_t cformat; +void *fb_ptr; + + cformat =drm_format_to_cairo (fb->drm_format); + fb_ptr =gem_mmap (fd, fb->gem_handle, fb->size,PROT_READ |PROT_WRITE ); + surface =cairo_image_surface_create_for_data ((unsigned char *)fb_ptr, + cformat, fb->width, + fb->height, fb->stride); +assert (surface); + cr =cairo_create (surface);cairo_surface_destroy (surface); - fb_info->fb_id = fb_id; +return cr; +} + +cairo_t *kmstest_get_cairo_ctx (int fd,struct kmstest_fb *fb) +{ + +if (!fb->cairo_ctx) + fb->cairo_ctx =create_cairo_ctx (fd, fb); + +gem_set_domain (fd, fb->gem_handle,I915_GEM_DOMAIN_CPU , +I915_GEM_DOMAIN_CPU ); -return fb_id; +return fb->cairo_ctx; } -void kmstest_remove_fb (int fd,int fb_id) +void kmstest_remove_fb (int fd,struct kmstest_fb *fb) { -do_or_die (drmModeRmFB (fd, fb_id)); +if (fb->cairo_ctx) +cairo_destroy (fb->cairo_ctx); +do_or_die (drmModeRmFB (fd, fb->fb_id)); +gem_close (fd, fb->gem_handle); }struct type_name {
lib/drmtest.h +9 -6
@@ -119,8 +119,13 @@ void kmstest_free_connector_config(struct kmstest_connector_config *config);struct kmstest_fb {uint32_t fb_id;uint32_t gem_handle; +uint32_t drm_format; +int width; +int height; +int depth;unsigned stride;unsigned size; +cairo_t *cairo_ctx; };enum kmstest_text_align {
@@ -136,14 +141,12 @@ int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align, double yspacing, const char *fmt, ...) __attribute__((format (printf, 4, 5))); -typedef void (*kmstest_paint_func )(cairo_t *cr,int width,int height,void *priv); -unsigned int kmstest_create_fb (int fd,int width,int height,int bpp,int depth,bool tiled, -struct kmstest_fb *fb_info, -kmstest_paint_func paint_func, -void *func_arg); -void kmstest_remove_fb (int fd,int fb_id); +struct kmstest_fb *fb_info); +void kmstest_remove_fb (int fd,struct kmstest_fb *fb_info); +cairo_t *kmstest_get_cairo_ctx (int fd,struct kmstest_fb *fb); +void kmstest_paint_test_pattern (cairo_t *cr,int width,int height);void kmstest_dump_mode (drmModeModeInfo *mode);int kmstest_get_pipe_from_crtc_id (int fd,int crtc_id);const char *kmstest_encoder_type_str (int type);
tests/kms_flip.c +18 -12
@@ -844,10 +844,13 @@ static void connector_find_preferred_mode(uint32_t connector_id, int crtc_idx, o->mode_valid =1 ; } -static void -paint_flip_mode (cairo_t *cr,int width,int height,void *priv) +static void paint_flip_mode (struct kmstest_fb *fb,bool odd_frame) { -bool odd_frame = (bool ) priv; +cairo_t *cr =kmstest_get_cairo_ctx (drm_fd, fb); +int width = fb->width; +int height = fb->height; + +kmstest_paint_test_pattern (cr, width, height);if (odd_frame)cairo_rectangle (cr, width/4 , height/2 , width/4 , height/8 );
@@ -856,6 +859,8 @@ paint_flip_mode(cairo_t *cr, int width, int height, void *priv)cairo_set_source_rgb (cr,1 ,1 ,1 );cairo_fill (cr); + +assert (!cairo_status (cr)); } static int
@@ -991,20 +996,21 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration) o->fb_width *=2 ; o->fb_ids[0 ] =kmstest_create_fb (drm_fd, o->fb_width, o->fb_height, - o->bpp, o->depth, false, &o->fb_info[0 ], - paint_flip_mode, (void *)false); + o->bpp, o->depth, false, &o->fb_info[0 ]); o->fb_ids[1 ] =kmstest_create_fb (drm_fd, o->fb_width, o->fb_height, - o->bpp, o->depth, false, &o->fb_info[1 ], - paint_flip_mode, (void *)true); + o->bpp, o->depth, false, &o->fb_info[1 ]); o->fb_ids[2 ] =kmstest_create_fb (drm_fd, o->fb_width, o->fb_height, - o->bpp, o->depth, true, &o->fb_info[2 ], - paint_flip_mode, (void *)true); + o->bpp, o->depth, true, &o->fb_info[2 ]);if (!o->fb_ids[0 ] || !o->fb_ids[1 ] || !o->fb_ids[2 ]) {fprintf (stderr,"failed to create fbs\n" );exit (3 ); } +paint_flip_mode (&o->fb_info[0 ], false); +paint_flip_mode (&o->fb_info[1 ], true); +paint_flip_mode (&o->fb_info[2 ], true); +set_y_tiling (o,2 );kmstest_dump_mode (&o->mode);
@@ -1044,9 +1050,9 @@ static void run_test_on_crtc(struct test_output *o, int crtc_idx, int duration)fprintf (stdout,"\n%s on crtc %d, connector %d: PASSED\n\n" , o->test_name, o->crtc, o->id); -kmstest_remove_fb (drm_fd, o->fb_ids[2 ]); -kmstest_remove_fb (drm_fd, o->fb_ids[1 ]); -kmstest_remove_fb (drm_fd, o->fb_ids[0 ]); +kmstest_remove_fb (drm_fd, &o->fb_info[2 ]); +kmstest_remove_fb (drm_fd, &o->fb_info[1 ]); +kmstest_remove_fb (drm_fd, &o->fb_info[0 ]); last_connector =NULL ;
tests/testdisplay.c +10 -5
@@ -258,15 +258,18 @@ static void paint_image(cairo_t *cr, const char *file)cairo_surface_destroy (image); } -static void -paint_output_info (cairo_t *cr,int l_width,int l_height,void *priv) +static void paint_output_info (struct connector *c,struct kmstest_fb *fb) { -struct connector *c = priv; +cairo_t *cr =kmstest_get_cairo_ctx (drm_fd, fb); +int l_width = fb->width; +int l_height = fb->height;double str_width;double x, y, top_y;double max_width;int i; +kmstest_paint_test_pattern (cr, l_width, l_height); +cairo_select_font_face (cr,"Helvetica" ,CAIRO_FONT_SLANT_NORMAL ,CAIRO_FONT_WEIGHT_NORMAL );
@@ -308,6 +311,8 @@ paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)if (qr_code)paint_image (cr,"./pass.png" ); + +assert (!cairo_status (cr)); }static void sighandler (int signo)
@@ -362,8 +367,8 @@ set_mode(struct connector *c) height = c->mode.vdisplay; fb_id =kmstest_create_fb (drm_fd, width, height, bpp, depth, - enable_tiling, &fb_info, - paint_output_info, c); + enable_tiling, &fb_info); +paint_output_info (c, &fb_info); fb_ptr =gem_mmap (drm_fd, fb_info.gem_handle, fb_info.size,PROT_READ |PROT_WRITE );
Signature · 1 line
1.8.1.2
PATCH v2 6/6 tests: add kms_render
In reply to Imre DeakAdd a test going through all connectors/crtcs/modes/formats painting to a front FB with CPU or painting to a back FB with CPU and blitting it to the front FB.
Only formats understood by cairo are supported for now.
--- lib/drmtest.c | 101 ++++++++++++++++++++-- lib/drmtest.h | 7 ++ tests/.gitignore | 1 + tests/Makefile.am | 1 + tests/kms_render.c | 245 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 349 insertions(+), 6 deletions(-) create mode 100644 tests/kms_render.c
lib/drmtest.c +95 -6
@@ -842,8 +842,8 @@ static int create_bo_for_fb(int fd, int width, int height, int bpp,return 0 ; } -static void -paint_color_gradient (cairo_t *cr,int x,int y,int w,int h, +void +kmstest_paint_color_gradient (cairo_t *cr,int x,int y,int w,int h,int r,int g,int b) {cairo_pattern_t *pat;
@@ -869,16 +869,16 @@ paint_test_patterns(cairo_t *cr, int width, int height) gr_height = height *0.08 ; x = (width /2 ) - (gr_width /2 ); -paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,0 ,0 ); +kmstest_paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,0 ,0 ); y += gr_height; -paint_color_gradient (cr, x, y, gr_width, gr_height,0 ,1 ,0 ); +kmstest_paint_color_gradient (cr, x, y, gr_width, gr_height,0 ,1 ,0 ); y += gr_height; -paint_color_gradient (cr, x, y, gr_width, gr_height,0 ,0 ,1 ); +kmstest_paint_color_gradient (cr, x, y, gr_width, gr_height,0 ,0 ,1 ); y += gr_height; -paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,1 ,1 ); +kmstest_paint_color_gradient (cr, x, y, gr_width, gr_height,1 ,1 ,1 ); } int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,
@@ -1025,6 +1025,55 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,return fb->fb_id; } +static uint32_t drm_format_to_bpp (uint32_t drm_format) +{ +struct format_desc_struct *f; + +for_each_format (f) +if (f->drm_id == drm_format) +return f->bpp; + +abort (); +} + +unsigned int kmstest_create_fb2 (int fd,int width,int height,uint32_t format, +bool tiled,struct kmstest_fb *fb) +{ +uint32_t handles[4 ]; +uint32_t pitches[4 ]; +uint32_t offsets[4 ]; +uint32_t fb_id; +int bpp; +int ret; + +memset (fb,0 ,sizeof (*fb)); + + bpp =drm_format_to_bpp (format); + ret =create_bo_for_fb (fd, width, height, bpp, tiled, &fb->gem_handle, + &fb->size, &fb->stride); +if (ret <0 ) +return ret; + +memset (handles,0 ,sizeof (handles)); + handles[0 ] = fb->gem_handle; +memset (pitches,0 ,sizeof (pitches)); + pitches[0 ] = fb->stride; +memset (offsets,0 ,sizeof (offsets)); +if (drmModeAddFB2 (fd, width, height, format, handles, pitches, + offsets, &fb_id,0 ) <0 ) { +gem_close (fd, fb->gem_handle); + +return 0 ; + } + + fb->width = width; + fb->height = height; + fb->drm_format = format; + fb->fb_id = fb_id; + +return fb_id; +} +static cairo_format_t drm_format_to_cairo (uint32_t drm_format) {struct format_desc_struct *f;
@@ -1075,6 +1124,46 @@ void kmstest_remove_fb(int fd, struct kmstest_fb *fb)gem_close (fd, fb->gem_handle); } +const char *kmstest_format_str (uint32_t drm_format) +{ +struct format_desc_struct *f; + +for_each_format (f) +if (f->drm_id == drm_format) +return f->name; + +return "invalid" ; +} + +const char *kmstest_pipe_str (int pipe) +{ +const char *str[] = {"A" ,"B" ,"C" }; + +if (pipe >2 ) +return "invalid" ; + +return str[pipe]; +} + +void kmstest_get_all_formats (const uint32_t **formats,int *format_count) +{ +static uint32_t *drm_formats; + +if (!drm_formats) { +struct format_desc_struct *f; +uint32_t *format; + + drm_formats =calloc (ARRAY_SIZE (format_desc), +sizeof (*drm_formats)); + format = &drm_formats[0 ]; +for_each_format (f) + *format++ = f->drm_id; + } + + *formats = drm_formats; + *format_count =ARRAY_SIZE (format_desc); +} +struct type_name {int type;const char *name;
lib/drmtest.h +7 -0
@@ -144,11 +144,18 @@ int kmstest_cairo_printf_line(cairo_t *cr, enum kmstest_text_align align,unsigned int kmstest_create_fb (int fd,int width,int height,int bpp,int depth,bool tiled,struct kmstest_fb *fb_info); +unsigned int kmstest_create_fb2 (int fd,int width,int height,uint32_t format, +bool tiled,struct kmstest_fb *fb);void kmstest_remove_fb (int fd,struct kmstest_fb *fb_info);cairo_t *kmstest_get_cairo_ctx (int fd,struct kmstest_fb *fb); +void kmstest_paint_color_gradient (cairo_t *cr,int x,int y,int w,int h, +int r,int g,int b);void kmstest_paint_test_pattern (cairo_t *cr,int width,int height);void kmstest_dump_mode (drmModeModeInfo *mode);int kmstest_get_pipe_from_crtc_id (int fd,int crtc_id); +const char *kmstest_format_str (uint32_t drm_format); +const char *kmstest_pipe_str (int pipe); +void kmstest_get_all_formats (const uint32_t **formats,int *format_count);const char *kmstest_encoder_type_str (int type);const char *kmstest_connector_status_str (int type);const char *kmstest_connector_type_str (int type);
tests/.gitignore +1 -0
@@ -85,6 +85,7 @@ getclient getstats getversion kms_flip +kms_render prime_nv_api prime_nv_pcopy prime_nv_test
tests/Makefile.am +1 -0
@@ -33,6 +33,7 @@ TESTS_progs_M = \ gem_tiled_partial_pwrite_pread \ $(NOUVEAU_TESTS_M) \ kms_flip \ + kms_render \ prime_self_import \ $(NULL)
tests/kms_render.c new file +245 -0
245 lines not on this page · raw message
Signature · 1 line
1.8.1.2
Quoted 278 lines · Imre Deak
These are used by multiple test cases, so make them shared.
Signed-off-by Imre Deak <[email protected]>--- demos/intel_sprite_on.c | 58 ++++------------------------------------------ lib/drmtest.c | 54 +++++++++++++++++++++++++++++++++++++++++++ lib/drmtest.h | 3 +++ tests/testdisplay.c | 61 ++++--------------------------------------------- 4 files changed, 65 insertions(+), 111 deletions(-)demos/intel_sprite_on.c +4
-54@@ -53,56 +53,6 @@#define ARRAY_SIZE (arr) (sizeof(arr) / sizeof((arr)[0])) -struct type_name { -int type; -const char *name; -}; - -#define type_name_fn (res) \ - static const char * res##_str(int type) { \ - unsigned int i; \ - for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \ - if (res##_names[i].type == type) \ - return res##_names[i].name; \ - } \ - return "(invalid)"; \ - } - -struct type_name encoder_type_names[] = { - {DRM_MODE_ENCODER_NONE ,"none" }, - {DRM_MODE_ENCODER_DAC ,"DAC" }, - {DRM_MODE_ENCODER_TMDS ,"TMDS" }, - {DRM_MODE_ENCODER_LVDS ,"LVDS" }, - {DRM_MODE_ENCODER_TVDAC ,"TVDAC" }, -}; -type_name_fn (encoder_type) - -struct type_name connector_status_names[] = { - {DRM_MODE_CONNECTED ,"connected" }, - {DRM_MODE_DISCONNECTED ,"disconnected" }, - {DRM_MODE_UNKNOWNCONNECTION ,"unknown" }, -}; -type_name_fn (connector_status) - -struct type_name connector_type_names[] = { - { DRM_MODE_CONNECTOR_Unknown,"unknown" }, - {DRM_MODE_CONNECTOR_VGA ,"VGA" }, - {DRM_MODE_CONNECTOR_DVII ,"DVI-I" }, - {DRM_MODE_CONNECTOR_DVID ,"DVI-D" }, - {DRM_MODE_CONNECTOR_DVIA ,"DVI-A" }, - { DRM_MODE_CONNECTOR_Composite,"composite" }, - {DRM_MODE_CONNECTOR_SVIDEO ,"s-video" }, - {DRM_MODE_CONNECTOR_LVDS ,"LVDS" }, - { DRM_MODE_CONNECTOR_Component,"component" }, - { DRM_MODE_CONNECTOR_9PinDIN,"9-pin DIN" }, - { DRM_MODE_CONNECTOR_DisplayPort,"DisplayPort" }, - {DRM_MODE_CONNECTOR_HDMIA ,"HDMI-A" }, - {DRM_MODE_CONNECTOR_HDMIB ,"HDMI-B" }, - {DRM_MODE_CONNECTOR_TV ,"TV" }, - { DRM_MODE_CONNECTOR_eDP,"Embedded DisplayPort" }, -}; -type_name_fn (connector_type) -/* * Mode setting with the kernel interfaces is a bit of a chore. * First you have to find the connector in question and make sure the @@ -157,8 +107,8 @@ static void dump_connectors(int gfx_fd, drmModeRes *resources)printf ("%d\t%d\t%s\t%s\t%dx%d\t\t%d\n" , connector->connector_id, connector->encoder_id, -connector_status_str (connector->connection), -connector_type_str (connector->connector_type), +kmstest_connector_status_str (connector->connection), +kmstest_connector_type_str (connector->connector_type), connector->mmWidth, connector->mmHeight, connector->count_modes);@@ -744,14 +694,14 @@ static void ricochet(int tiled, int sprite_w, int sprite_h, curr_connector.mode.flags, curr_connector.encoder->encoder_id, curr_connector.encoder->encoder_type, -encoder_type_str (curr_connector.encoder->encoder_type), +kmstest_encoder_type_str (curr_connector.encoder->encoder_type), curr_connector.encoder->crtc_id, curr_connector.encoder->possible_crtcs, curr_connector.encoder->possible_clones, curr_connector.connector->connector_id, curr_connector.connector->encoder_id, curr_connector.connector->connector_type, -connector_type_str (curr_connector.connector->connector_type), +kmstest_connector_type_str (curr_connector.connector->connector_type), curr_connector.connector->connector_type_id); printf("Sprite surface dimensions = %dx%d\n"lib/drmtest.c +54
-0@@ -1023,6 +1023,60 @@ void kmstest_remove_fb(int fd, int fb_id)do_or_die (drmModeRmFB (fd, fb_id)); } +struct type_name { +int type; +const char *name; +}; + +#define type_name_fn (res) \ +const char * kmstest_##res##_str(int type) { \ + unsigned int i; \ + for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \ + if (res##_names[i].type == type) \ + return res##_names[i].name; \ + } \ + return "(invalid)"; \ +} + +struct type_name encoder_type_names[] = { + {DRM_MODE_ENCODER_NONE ,"none" }, + {DRM_MODE_ENCODER_DAC ,"DAC" }, + {DRM_MODE_ENCODER_TMDS ,"TMDS" }, + {DRM_MODE_ENCODER_LVDS ,"LVDS" }, + {DRM_MODE_ENCODER_TVDAC ,"TVDAC" }, +}; + +type_name_fn (encoder_type) + +struct type_name connector_status_names[] = { + {DRM_MODE_CONNECTED ,"connected" }, + {DRM_MODE_DISCONNECTED ,"disconnected" }, + {DRM_MODE_UNKNOWNCONNECTION ,"unknown" }, +}; + +type_name_fn (connector_status) + +struct type_name connector_type_names[] = { + { DRM_MODE_CONNECTOR_Unknown,"unknown" }, + {DRM_MODE_CONNECTOR_VGA ,"VGA" }, + {DRM_MODE_CONNECTOR_DVII ,"DVI-I" }, + {DRM_MODE_CONNECTOR_DVID ,"DVI-D" }, + {DRM_MODE_CONNECTOR_DVIA ,"DVI-A" }, + { DRM_MODE_CONNECTOR_Composite,"composite" }, + {DRM_MODE_CONNECTOR_SVIDEO ,"s-video" }, + {DRM_MODE_CONNECTOR_LVDS ,"LVDS" }, + { DRM_MODE_CONNECTOR_Component,"component" }, + { DRM_MODE_CONNECTOR_9PinDIN,"9-pin DIN" }, + { DRM_MODE_CONNECTOR_DisplayPort,"DisplayPort" }, + {DRM_MODE_CONNECTOR_HDMIA ,"HDMI-A" }, + {DRM_MODE_CONNECTOR_HDMIB ,"HDMI-B" }, + {DRM_MODE_CONNECTOR_TV ,"TV" }, + { DRM_MODE_CONNECTOR_eDP,"Embedded DisplayPort" }, +}; + +type_name_fn (connector_type) + + void kmstest_dump_mode(drmModeModeInfo *mode) { printf(" %s %d %d %d %d %d %d %d %d %d 0x%x 0x%x %d\n",lib/drmtest.h +3
-0@@ -119,6 +119,9 @@ unsigned int kmstest_create_fb(int fd, int width, int height, int bpp,void kmstest_remove_fb (int fd,int fb_id);void kmstest_dump_mode (drmModeModeInfo *mode);int kmstest_get_pipe_from_crtc_id (int fd,int crtc_id); +const char *kmstest_encoder_type_str (int type); +const char *kmstest_connector_status_str (int type); +const char *kmstest_connector_type_str (int type);inline static void _do_or_die (const char *function,int line,int ret) {tests/testdisplay.c +4
-58@@ -88,59 +88,6 @@ uint32_t *fb_ptr;#define ARRAY_SIZE (arr) (sizeof(arr) / sizeof((arr)[0])) -struct type_name { -int type; -const char *name; -}; - -#define type_name_fn (res) \ -static const char * res##_str(int type) { \ - unsigned int i; \ - for (i = 0; i < ARRAY_SIZE(res##_names); i++) { \ - if (res##_names[i].type == type) \ - return res##_names[i].name; \ - } \ - return "(invalid)"; \ -} - -struct type_name encoder_type_names[] = { - {DRM_MODE_ENCODER_NONE ,"none" }, - {DRM_MODE_ENCODER_DAC ,"DAC" }, - {DRM_MODE_ENCODER_TMDS ,"TMDS" }, - {DRM_MODE_ENCODER_LVDS ,"LVDS" }, - {DRM_MODE_ENCODER_TVDAC ,"TVDAC" }, -}; - -type_name_fn (encoder_type) - -struct type_name connector_status_names[] = { - {DRM_MODE_CONNECTED ,"connected" }, - {DRM_MODE_DISCONNECTED ,"disconnected" }, - {DRM_MODE_UNKNOWNCONNECTION ,"unknown" }, -}; - -type_name_fn (connector_status) - -struct type_name connector_type_names[] = { - { DRM_MODE_CONNECTOR_Unknown,"unknown" }, - {DRM_MODE_CONNECTOR_VGA ,"VGA" }, - {DRM_MODE_CONNECTOR_DVII ,"DVI-I" }, - {DRM_MODE_CONNECTOR_DVID ,"DVI-D" }, - {DRM_MODE_CONNECTOR_DVIA ,"DVI-A" }, - { DRM_MODE_CONNECTOR_Composite,"composite" }, - {DRM_MODE_CONNECTOR_SVIDEO ,"s-video" }, - {DRM_MODE_CONNECTOR_LVDS ,"LVDS" }, - { DRM_MODE_CONNECTOR_Component,"component" }, - { DRM_MODE_CONNECTOR_9PinDIN,"9-pin DIN" }, - { DRM_MODE_CONNECTOR_DisplayPort,"DisplayPort" }, - {DRM_MODE_CONNECTOR_HDMIA ,"HDMI-A" }, - {DRM_MODE_CONNECTOR_HDMIB ,"HDMI-B" }, - {DRM_MODE_CONNECTOR_TV ,"TV" }, - { DRM_MODE_CONNECTOR_eDP,"Embedded DisplayPort" }, -}; - -type_name_fn (connector_type) -/* * Mode setting with the kernel interfaces is a bit of a chore. * First you have to find the connector in question and make sure the @@ -185,8 +132,8 @@ static void dump_connectors_fd(int drmfd)printf ("%d\t%d\t%s\t%s\t%dx%d\t\t%d\n" , connector->connector_id, connector->encoder_id, -connector_status_str (connector->connection), -connector_type_str (connector->connector_type), +kmstest_connector_status_str (connector->connection), +kmstest_connector_type_str (connector->connector_type), connector->mmWidth, connector->mmHeight, connector->count_modes);@@ -390,7 +337,7 @@ paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)/* Get text extents for each string */ snprintf (name_buf,sizeof name_buf,"%s" , -connector_type_str (c->connector->connector_type)); +kmstest_connector_type_str (c->connector->connector_type));cairo_set_font_size (cr,48 ); cairo_select_font_face(cr, "Helvetica", CAIRO_FONT_SLANT_NORMAL,@@ -399,7 +346,7 @@ paint_output_info(cairo_t *cr, int l_width, int l_height, void *priv)snprintf (mode_buf,sizeof mode_buf,"%s @ %dHz on %s encoder" , c->mode.name, c->mode.vrefresh, -encoder_type_str (c->encoder->encoder_type)); +kmstest_encoder_type_str (c->encoder->encoder_type));cairo_set_font_size (cr,36 );cairo_text_extents (cr, mode_buf, &mode_extents); --1.8.1.2
_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
Signature · 2 lines
Rodrigo Vivi Blog: http://blog.vivi.eng.br