@ -4,10 +4,7 @@
# include <wlr/interfaces/wlr_output.h>
# include <wlr/interfaces/wlr_output.h>
# include <wlr/render/wlr_renderer.h>
# include <wlr/render/wlr_renderer.h>
# include <wlr/util/log.h>
# include <wlr/util/log.h>
# include "backend/backend.h"
# include "backend/headless.h"
# include "backend/headless.h"
# include "render/swapchain.h"
# include "render/wlr_renderer.h"
# include "util/signal.h"
# include "util/signal.h"
static struct wlr_headless_output * headless_output_from_output (
static struct wlr_headless_output * headless_output_from_output (
@ -20,47 +17,17 @@ static bool output_set_custom_mode(struct wlr_output *wlr_output, int32_t width,
int32_t height , int32_t refresh ) {
int32_t height , int32_t refresh ) {
struct wlr_headless_output * output =
struct wlr_headless_output * output =
headless_output_from_output ( wlr_output ) ;
headless_output_from_output ( wlr_output ) ;
struct wlr_allocator * allocator = backend_get_allocator ( wlr_output - > backend ) ;
if ( refresh < = 0 ) {
if ( refresh < = 0 ) {
refresh = HEADLESS_DEFAULT_REFRESH ;
refresh = HEADLESS_DEFAULT_REFRESH ;
}
}
wlr_swapchain_destroy ( output - > swapchain ) ;
output - > swapchain = wlr_swapchain_create ( allocator ,
width , height , output - > backend - > format ) ;
if ( ! output - > swapchain ) {
wlr_output_destroy ( wlr_output ) ;
return false ;
}
output - > frame_delay = 1000000 / refresh ;
output - > frame_delay = 1000000 / refresh ;
wlr_output_update_custom_mode ( & output - > wlr_output , width , height , refresh ) ;
wlr_output_update_custom_mode ( & output - > wlr_output , width , height , refresh ) ;
return true ;
return true ;
}
}
static bool output_attach_render ( struct wlr_output * wlr_output ,
int * buffer_age ) {
struct wlr_headless_output * output =
headless_output_from_output ( wlr_output ) ;
struct wlr_renderer * renderer = wlr_backend_get_renderer ( wlr_output - > backend ) ;
wlr_buffer_unlock ( output - > back_buffer ) ;
output - > back_buffer = wlr_swapchain_acquire ( output - > swapchain , buffer_age ) ;
if ( ! output - > back_buffer ) {
wlr_log ( WLR_ERROR , " Failed to acquire swapchain buffer " ) ;
return false ;
}
if ( ! wlr_renderer_bind_buffer ( renderer , output - > back_buffer ) ) {
wlr_log ( WLR_ERROR , " Failed to bind buffer to renderer " ) ;
return false ;
}
return true ;
}
static bool output_test ( struct wlr_output * wlr_output ) {
static bool output_test ( struct wlr_output * wlr_output ) {
if ( wlr_output - > pending . committed & WLR_OUTPUT_STATE_ENABLED ) {
if ( wlr_output - > pending . committed & WLR_OUTPUT_STATE_ENABLED ) {
wlr_log ( WLR_DEBUG , " Cannot disable a headless output " ) ;
wlr_log ( WLR_DEBUG , " Cannot disable a headless output " ) ;
@ -77,7 +44,6 @@ static bool output_test(struct wlr_output *wlr_output) {
static bool output_commit ( struct wlr_output * wlr_output ) {
static bool output_commit ( struct wlr_output * wlr_output ) {
struct wlr_headless_output * output =
struct wlr_headless_output * output =
headless_output_from_output ( wlr_output ) ;
headless_output_from_output ( wlr_output ) ;
struct wlr_renderer * renderer = wlr_backend_get_renderer ( wlr_output - > backend ) ;
if ( ! output_test ( wlr_output ) ) {
if ( ! output_test ( wlr_output ) ) {
return false ;
return false ;
@ -93,26 +59,11 @@ static bool output_commit(struct wlr_output *wlr_output) {
}
}
if ( wlr_output - > pending . committed & WLR_OUTPUT_STATE_BUFFER ) {
if ( wlr_output - > pending . committed & WLR_OUTPUT_STATE_BUFFER ) {
struct wlr_buffer * buffer = NULL ;
assert ( wlr_output - > pending . buffer_type = =
switch ( wlr_output - > pending . buffer_type ) {
WLR_OUTPUT_STATE_BUFFER_SCANOUT ) ;
case WLR_OUTPUT_STATE_BUFFER_RENDER :
assert ( output - > back_buffer ! = NULL ) ;
wlr_renderer_bind_buffer ( renderer , NULL ) ;
buffer = output - > back_buffer ;
output - > back_buffer = NULL ;
break ;
case WLR_OUTPUT_STATE_BUFFER_SCANOUT :
buffer = wlr_buffer_lock ( wlr_output - > pending . buffer ) ;
break ;
}
assert ( buffer ! = NULL ) ;
wlr_buffer_unlock ( output - > front_buffer ) ;
wlr_buffer_unlock ( output - > front_buffer ) ;
output - > front_buffer = buffer ;
output - > front_buffer = wlr_buffer_lock ( wlr_output - > pending . buffer ) ;
wlr_swapchain_set_buffer_submitted ( output - > swapchain , buffer ) ;
wlr_output_send_present ( wlr_output , NULL ) ;
wlr_output_send_present ( wlr_output , NULL ) ;
}
}
@ -120,17 +71,6 @@ static bool output_commit(struct wlr_output *wlr_output) {
return true ;
return true ;
}
}
static void output_rollback_render ( struct wlr_output * wlr_output ) {
struct wlr_headless_output * output =
headless_output_from_output ( wlr_output ) ;
struct wlr_renderer * renderer = wlr_backend_get_renderer ( wlr_output - > backend ) ;
wlr_renderer_bind_buffer ( renderer , NULL ) ;
wlr_buffer_unlock ( output - > back_buffer ) ;
output - > back_buffer = NULL ;
}
static bool output_export_dmabuf ( struct wlr_output * wlr_output ,
static bool output_export_dmabuf ( struct wlr_output * wlr_output ,
struct wlr_dmabuf_attributes * attribs ) {
struct wlr_dmabuf_attributes * attribs ) {
struct wlr_headless_output * output =
struct wlr_headless_output * output =
@ -153,17 +93,13 @@ static void output_destroy(struct wlr_output *wlr_output) {
headless_output_from_output ( wlr_output ) ;
headless_output_from_output ( wlr_output ) ;
wl_list_remove ( & output - > link ) ;
wl_list_remove ( & output - > link ) ;
wl_event_source_remove ( output - > frame_timer ) ;
wl_event_source_remove ( output - > frame_timer ) ;
wlr_swapchain_destroy ( output - > swapchain ) ;
wlr_buffer_unlock ( output - > back_buffer ) ;
wlr_buffer_unlock ( output - > front_buffer ) ;
wlr_buffer_unlock ( output - > front_buffer ) ;
free ( output ) ;
free ( output ) ;
}
}
static const struct wlr_output_impl output_impl = {
static const struct wlr_output_impl output_impl = {
. destroy = output_destroy ,
. destroy = output_destroy ,
. attach_render = output_attach_render ,
. commit = output_commit ,
. commit = output_commit ,
. rollback_render = output_rollback_render ,
. export_dmabuf = output_export_dmabuf ,
. export_dmabuf = output_export_dmabuf ,
} ;
} ;
@ -182,7 +118,6 @@ struct wlr_output *wlr_headless_add_output(struct wlr_backend *wlr_backend,
unsigned int width , unsigned int height ) {
unsigned int width , unsigned int height ) {
struct wlr_headless_backend * backend =
struct wlr_headless_backend * backend =
headless_backend_from_backend ( wlr_backend ) ;
headless_backend_from_backend ( wlr_backend ) ;
struct wlr_allocator * allocator = backend_get_allocator ( wlr_backend ) ;
struct wlr_headless_output * output =
struct wlr_headless_output * output =
calloc ( 1 , sizeof ( struct wlr_headless_output ) ) ;
calloc ( 1 , sizeof ( struct wlr_headless_output ) ) ;
@ -195,12 +130,6 @@ struct wlr_output *wlr_headless_add_output(struct wlr_backend *wlr_backend,
backend - > display ) ;
backend - > display ) ;
struct wlr_output * wlr_output = & output - > wlr_output ;
struct wlr_output * wlr_output = & output - > wlr_output ;
output - > swapchain = wlr_swapchain_create ( allocator ,
width , height , backend - > format ) ;
if ( ! output - > swapchain ) {
goto error ;
}
output_set_custom_mode ( wlr_output , width , height , 0 ) ;
output_set_custom_mode ( wlr_output , width , height , 0 ) ;
strncpy ( wlr_output - > make , " headless " , sizeof ( wlr_output - > make ) ) ;
strncpy ( wlr_output - > make , " headless " , sizeof ( wlr_output - > make ) ) ;
strncpy ( wlr_output - > model , " headless " , sizeof ( wlr_output - > model ) ) ;
strncpy ( wlr_output - > model , " headless " , sizeof ( wlr_output - > model ) ) ;
@ -224,8 +153,4 @@ struct wlr_output *wlr_headless_add_output(struct wlr_backend *wlr_backend,
}
}
return wlr_output ;
return wlr_output ;
error :
wlr_output_destroy ( & output - > wlr_output ) ;
return NULL ;
}
}