@ -51,11 +51,13 @@
# include "xdg-shell-client-protocol.h"
# include "xdg-shell-client-protocol.h"
# include "fullscreen-shell-unstable-v1-client-protocol.h"
# include "fullscreen-shell-unstable-v1-client-protocol.h"
# include "linux-dmabuf-unstable-v1-client-protocol.h"
# include "linux-dmabuf-unstable-v1-client-protocol.h"
# include "weston-direct-display-client-protocol.h"
# include "shared/helpers.h"
# include "shared/helpers.h"
# define CLEAR(x) memset(&(x), 0, sizeof(x))
# define CLEAR(x) memset(&(x), 0, sizeof(x))
# define OPT_FLAG_INVERT (1 << 0)
# define OPT_FLAG_INVERT (1 << 0)
# define OPT_FLAG_DIRECT_DISPLAY (1 << 1)
static void
static void
redraw ( void * data , struct wl_callback * callback , uint32_t time ) ;
redraw ( void * data , struct wl_callback * callback , uint32_t time ) ;
@ -107,6 +109,7 @@ struct display {
struct xdg_wm_base * wm_base ;
struct xdg_wm_base * wm_base ;
struct zwp_fullscreen_shell_v1 * fshell ;
struct zwp_fullscreen_shell_v1 * fshell ;
struct zwp_linux_dmabuf_v1 * dmabuf ;
struct zwp_linux_dmabuf_v1 * dmabuf ;
struct weston_direct_display_v1 * direct_display ;
bool requested_format_found ;
bool requested_format_found ;
uint32_t opts ;
uint32_t opts ;
@ -386,6 +389,17 @@ create_dmabuf_buffer(struct display *display, struct buffer *buffer)
flags | = ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT ;
flags | = ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT ;
params = zwp_linux_dmabuf_v1_create_params ( display - > dmabuf ) ;
params = zwp_linux_dmabuf_v1_create_params ( display - > dmabuf ) ;
if ( ( display - > opts & OPT_FLAG_DIRECT_DISPLAY ) & & display - > direct_display ) {
weston_direct_display_v1_enable ( display - > direct_display , params ) ;
if ( display - > opts & OPT_FLAG_INVERT ) {
flags & = ~ ZWP_LINUX_BUFFER_PARAMS_V1_FLAGS_Y_INVERT ;
fprintf ( stdout , " dmabuf y-inverted attribute flag was removed "
" , as display-direct flag was set \n " ) ;
}
}
for ( i = 0 ; i < display - > format . num_planes ; + + i )
for ( i = 0 ; i < display - > format . num_planes ; + + i )
zwp_linux_buffer_params_v1_add ( params ,
zwp_linux_buffer_params_v1_add ( params ,
buffer - > dmabuf_fds [ i ] ,
buffer - > dmabuf_fds [ i ] ,
@ -841,6 +855,9 @@ registry_handle_global(void *data, struct wl_registry *registry,
id , & zwp_linux_dmabuf_v1_interface , 3 ) ;
id , & zwp_linux_dmabuf_v1_interface , 3 ) ;
zwp_linux_dmabuf_v1_add_listener ( d - > dmabuf , & dmabuf_listener ,
zwp_linux_dmabuf_v1_add_listener ( d - > dmabuf , & dmabuf_listener ,
d ) ;
d ) ;
} else if ( strcmp ( interface , " weston_direct_display_v1 " ) = = 0 ) {
d - > direct_display = wl_registry_bind ( registry ,
id , & weston_direct_display_v1_interface , 1 ) ;
}
}
}
}
@ -916,7 +933,7 @@ destroy_display(struct display *display)
static void
static void
usage ( const char * argv0 )
usage ( const char * argv0 )
{
{
printf ( " Usage: %s [-v v4l2_device] [-f v4l2_format] [-d drm_format] [-i|--y-invert] \n "
printf ( " Usage: %s [-v v4l2_device] [-f v4l2_format] [-d drm_format] [-i|--y-invert] [-g|--d-display] \n "
" \n "
" \n "
" The default V4L2 device is /dev/video0 \n "
" The default V4L2 device is /dev/video0 \n "
" \n "
" \n "
@ -929,7 +946,10 @@ usage(const char *argv0)
" Flags: \n "
" Flags: \n "
" - y-invert force the image to be y-flipped; \n note will be "
" - y-invert force the image to be y-flipped; \n note will be "
" automatically added if we detect if the camera sensor is "
" automatically added if we detect if the camera sensor is "
" y-flipped \n " , argv0 ) ;
" y-flipped \n "
" - d-display skip importing dmabuf-based buffer into the GPU \n "
" and attempt pass the buffer straight to the display controller \n " ,
argv0 ) ;
printf ( " \n "
printf ( " \n "
" How to set up Vivid the virtual video driver for testing: \n "
" How to set up Vivid the virtual video driver for testing: \n "
@ -973,11 +993,12 @@ main(int argc, char **argv)
{ " v4l2-format " , required_argument , NULL , ' f ' } ,
{ " v4l2-format " , required_argument , NULL , ' f ' } ,
{ " drm-format " , required_argument , NULL , ' d ' } ,
{ " drm-format " , required_argument , NULL , ' d ' } ,
{ " y-invert " , no_argument , NULL , ' i ' } ,
{ " y-invert " , no_argument , NULL , ' i ' } ,
{ " d-display " , no_argument , NULL , ' g ' } ,
{ " help " , no_argument , NULL , ' h ' } ,
{ " help " , no_argument , NULL , ' h ' } ,
{ 0 , 0 , NULL , 0 }
{ 0 , 0 , NULL , 0 }
} ;
} ;
while ( ( c = getopt_long ( argc , argv , " hiv:d:f: " , long_options ,
while ( ( c = getopt_long ( argc , argv , " hiv:d:f:g " , long_options ,
& opt_index ) ) ! = - 1 ) {
& opt_index ) ) ! = - 1 ) {
switch ( c ) {
switch ( c ) {
case ' v ' :
case ' v ' :
@ -992,6 +1013,9 @@ main(int argc, char **argv)
case ' i ' :
case ' i ' :
opts_flags | = OPT_FLAG_INVERT ;
opts_flags | = OPT_FLAG_INVERT ;
break ;
break ;
case ' g ' :
opts_flags | = OPT_FLAG_DIRECT_DISPLAY ;
break ;
default :
default :
case ' h ' :
case ' h ' :
usage ( argv [ 0 ] ) ;
usage ( argv [ 0 ] ) ;