From 44feb832f965ec857c2a45a858c95cefb50bb547 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Tue, 1 Dec 2020 16:24:06 +0100 Subject: backend/headless: remove swapchain Rely on wlr_output's generic swapchain support instead of creating our own. The headless output now simply keeps a reference to the front buffer and does nothing else. --- backend/headless/backend.c | 16 --------- backend/headless/output.c | 81 ++-------------------------------------------- 2 files changed, 3 insertions(+), 94 deletions(-) (limited to 'backend/headless') diff --git a/backend/headless/backend.c b/backend/headless/backend.c index b4166eef..a49a515f 100644 --- a/backend/headless/backend.c +++ b/backend/headless/backend.c @@ -70,8 +70,6 @@ static void backend_destroy(struct wlr_backend *wlr_backend) { wlr_backend_finish(wlr_backend); - free(backend->format); - close(backend->drm_fd); free(backend); } @@ -146,20 +144,6 @@ static bool backend_init(struct wlr_headless_backend *backend, return false; } - const struct wlr_drm_format_set *formats = - wlr_renderer_get_render_formats(renderer); - if (formats == NULL) { - wlr_log(WLR_ERROR, "Failed to get available DMA-BUF formats from renderer"); - return false; - } - const struct wlr_drm_format *format = - wlr_drm_format_set_get(formats, DRM_FORMAT_XRGB8888); - if (format == NULL) { - wlr_log(WLR_ERROR, "Renderer doesn't support XRGB8888"); - return false; - } - backend->format = wlr_drm_format_dup(format); - backend->display_destroy.notify = handle_display_destroy; wl_display_add_destroy_listener(display, &backend->display_destroy); diff --git a/backend/headless/output.c b/backend/headless/output.c index 7f3b4445..2e4dee2d 100644 --- a/backend/headless/output.c +++ b/backend/headless/output.c @@ -4,10 +4,7 @@ #include #include #include -#include "backend/backend.h" #include "backend/headless.h" -#include "render/swapchain.h" -#include "render/wlr_renderer.h" #include "util/signal.h" 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) { struct wlr_headless_output *output = headless_output_from_output(wlr_output); - struct wlr_allocator *allocator = backend_get_allocator(wlr_output->backend); if (refresh <= 0) { 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; wlr_output_update_custom_mode(&output->wlr_output, width, height, refresh); 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) { if (wlr_output->pending.committed & WLR_OUTPUT_STATE_ENABLED) { 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) { struct wlr_headless_output *output = headless_output_from_output(wlr_output); - struct wlr_renderer *renderer = wlr_backend_get_renderer(wlr_output->backend); if (!output_test(wlr_output)) { return false; @@ -93,26 +59,11 @@ static bool output_commit(struct wlr_output *wlr_output) { } if (wlr_output->pending.committed & WLR_OUTPUT_STATE_BUFFER) { - struct wlr_buffer *buffer = NULL; - switch (wlr_output->pending.buffer_type) { - 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); + assert(wlr_output->pending.buffer_type == + WLR_OUTPUT_STATE_BUFFER_SCANOUT); wlr_buffer_unlock(output->front_buffer); - output->front_buffer = buffer; - - wlr_swapchain_set_buffer_submitted(output->swapchain, buffer); + output->front_buffer = wlr_buffer_lock(wlr_output->pending.buffer); wlr_output_send_present(wlr_output, NULL); } @@ -120,17 +71,6 @@ static bool output_commit(struct wlr_output *wlr_output) { 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, struct wlr_dmabuf_attributes *attribs) { struct wlr_headless_output *output = @@ -153,17 +93,13 @@ static void output_destroy(struct wlr_output *wlr_output) { headless_output_from_output(wlr_output); wl_list_remove(&output->link); wl_event_source_remove(output->frame_timer); - wlr_swapchain_destroy(output->swapchain); - wlr_buffer_unlock(output->back_buffer); wlr_buffer_unlock(output->front_buffer); free(output); } static const struct wlr_output_impl output_impl = { .destroy = output_destroy, - .attach_render = output_attach_render, .commit = output_commit, - .rollback_render = output_rollback_render, .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) { struct wlr_headless_backend *backend = headless_backend_from_backend(wlr_backend); - struct wlr_allocator *allocator = backend_get_allocator(wlr_backend); struct wlr_headless_output *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); 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); strncpy(wlr_output->make, "headless", sizeof(wlr_output->make)); 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; - -error: - wlr_output_destroy(&output->wlr_output); - return NULL; } -- cgit v1.2.3