@ -262,10 +262,12 @@ drm_fb_destroy_callback(struct gbm_bo *bo, void *data)
}
}
static struct drm_fb *
static struct drm_fb *
drm_fb_create_dumb ( struct drm_backend * b , unsigned width , unsigned height )
drm_fb_create_dumb ( struct drm_backend * b , unsigned width , unsigned height ,
uint32_t format )
{
{
struct drm_fb * fb ;
struct drm_fb * fb ;
int ret ;
int ret ;
uint32_t bpp , depth ;
struct drm_mode_create_dumb create_arg ;
struct drm_mode_create_dumb create_arg ;
struct drm_mode_destroy_dumb destroy_arg ;
struct drm_mode_destroy_dumb destroy_arg ;
@ -275,8 +277,20 @@ drm_fb_create_dumb(struct drm_backend *b, unsigned width, unsigned height)
if ( ! fb )
if ( ! fb )
return NULL ;
return NULL ;
switch ( format ) {
case GBM_FORMAT_XRGB8888 :
bpp = 32 ;
depth = 24 ;
break ;
case GBM_FORMAT_RGB565 :
bpp = depth = 16 ;
break ;
default :
return NULL ;
}
memset ( & create_arg , 0 , sizeof create_arg ) ;
memset ( & create_arg , 0 , sizeof create_arg ) ;
create_arg . bpp = 32 ;
create_arg . bpp = bpp ;
create_arg . width = width ;
create_arg . width = width ;
create_arg . height = height ;
create_arg . height = height ;
@ -289,8 +303,29 @@ drm_fb_create_dumb(struct drm_backend *b, unsigned width, unsigned height)
fb - > size = create_arg . size ;
fb - > size = create_arg . size ;
fb - > fd = b - > drm . fd ;
fb - > fd = b - > drm . fd ;
ret = drmModeAddFB ( b - > drm . fd , width , height , 24 , 32 ,
ret = - 1 ;
fb - > stride , fb - > handle , & fb - > fb_id ) ;
if ( ! b - > no_addfb2 ) {
uint32_t handles [ 4 ] , pitches [ 4 ] , offsets [ 4 ] ;
handles [ 0 ] = fb - > handle ;
pitches [ 0 ] = fb - > stride ;
offsets [ 0 ] = 0 ;
ret = drmModeAddFB2 ( b - > drm . fd , width , height ,
format , handles , pitches , offsets ,
& fb - > fb_id , 0 ) ;
if ( ret ) {
weston_log ( " addfb2 failed: %m \n " ) ;
b - > no_addfb2 = 1 ;
}
}
if ( ret ) {
ret = drmModeAddFB ( b - > drm . fd , width , height , depth , bpp ,
fb - > stride , fb - > handle , & fb - > fb_id ) ;
}
if ( ret )
if ( ret )
goto err_bo ;
goto err_bo ;
@ -1879,17 +1914,30 @@ drm_output_init_pixman(struct drm_output *output, struct drm_backend *b)
{
{
int w = output - > base . current_mode - > width ;
int w = output - > base . current_mode - > width ;
int h = output - > base . current_mode - > height ;
int h = output - > base . current_mode - > height ;
uint32_t format = output - > gbm_format ;
uint32_t pixman_format ;
unsigned int i ;
unsigned int i ;
/* FIXME error checking */
switch ( format ) {
case GBM_FORMAT_XRGB8888 :
pixman_format = PIXMAN_x8r8g8b8 ;
break ;
case GBM_FORMAT_RGB565 :
pixman_format = PIXMAN_r5g6b5 ;
break ;
default :
weston_log ( " Unsupported pixman format 0x%x \n " , format ) ;
return - 1 ;
}
/* FIXME error checking */
for ( i = 0 ; i < ARRAY_LENGTH ( output - > dumb ) ; i + + ) {
for ( i = 0 ; i < ARRAY_LENGTH ( output - > dumb ) ; i + + ) {
output - > dumb [ i ] = drm_fb_create_dumb ( b , w , h ) ;
output - > dumb [ i ] = drm_fb_create_dumb ( b , w , h , format ) ;
if ( ! output - > dumb [ i ] )
if ( ! output - > dumb [ i ] )
goto err ;
goto err ;
output - > image [ i ] =
output - > image [ i ] =
pixman_image_create_bits ( PIXMAN_x8r8g8b8 , w , h ,
pixman_image_create_bits ( pixman_format , w , h ,
output - > dumb [ i ] - > map ,
output - > dumb [ i ] - > map ,
output - > dumb [ i ] - > stride ) ;
output - > dumb [ i ] - > stride ) ;
if ( ! output - > image [ i ] )
if ( ! output - > image [ i ] )