mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-22 12:55:58 +01:00
backend/x11: use common renderer and allocator
Instead of managing our own renderer and allocator, let the common code do it.
This commit is contained in:
parent
c82f37542d
commit
fd2b1f018e
3 changed files with 31 additions and 44 deletions
|
@ -30,6 +30,7 @@
|
||||||
#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/x11.h"
|
#include "backend/x11.h"
|
||||||
#include "render/drm_format_set.h"
|
#include "render/drm_format_set.h"
|
||||||
#include "render/gbm_allocator.h"
|
#include "render/gbm_allocator.h"
|
||||||
|
@ -198,8 +199,6 @@ static void backend_destroy(struct wlr_backend *backend) {
|
||||||
}
|
}
|
||||||
wl_list_remove(&x11->display_destroy.link);
|
wl_list_remove(&x11->display_destroy.link);
|
||||||
|
|
||||||
wlr_renderer_destroy(x11->renderer);
|
|
||||||
wlr_allocator_destroy(x11->allocator);
|
|
||||||
wlr_drm_format_set_finish(&x11->dri3_formats);
|
wlr_drm_format_set_finish(&x11->dri3_formats);
|
||||||
wlr_drm_format_set_finish(&x11->shm_formats);
|
wlr_drm_format_set_finish(&x11->shm_formats);
|
||||||
free(x11->drm_format);
|
free(x11->drm_format);
|
||||||
|
@ -213,18 +212,12 @@ static void backend_destroy(struct wlr_backend *backend) {
|
||||||
free(x11);
|
free(x11);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct wlr_renderer *backend_get_renderer(
|
|
||||||
struct wlr_backend *backend) {
|
|
||||||
struct wlr_x11_backend *x11 = get_x11_backend_from_backend(backend);
|
|
||||||
return x11->renderer;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int backend_get_drm_fd(struct wlr_backend *backend) {
|
static int backend_get_drm_fd(struct wlr_backend *backend) {
|
||||||
struct wlr_x11_backend *x11 = get_x11_backend_from_backend(backend);
|
struct wlr_x11_backend *x11 = get_x11_backend_from_backend(backend);
|
||||||
return x11->drm_fd;
|
return x11->drm_fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t backend_get_buffer_caps(struct wlr_backend *backend) {
|
static uint32_t get_buffer_caps(struct wlr_backend *backend) {
|
||||||
struct wlr_x11_backend *x11 = get_x11_backend_from_backend(backend);
|
struct wlr_x11_backend *x11 = get_x11_backend_from_backend(backend);
|
||||||
return (x11->have_dri3 ? WLR_BUFFER_CAP_DMABUF : 0)
|
return (x11->have_dri3 ? WLR_BUFFER_CAP_DMABUF : 0)
|
||||||
| (x11->have_shm ? WLR_BUFFER_CAP_SHM : 0);
|
| (x11->have_shm ? WLR_BUFFER_CAP_SHM : 0);
|
||||||
|
@ -233,9 +226,8 @@ static uint32_t backend_get_buffer_caps(struct wlr_backend *backend) {
|
||||||
static const struct wlr_backend_impl backend_impl = {
|
static const struct wlr_backend_impl backend_impl = {
|
||||||
.start = backend_start,
|
.start = backend_start,
|
||||||
.destroy = backend_destroy,
|
.destroy = backend_destroy,
|
||||||
.get_renderer = backend_get_renderer,
|
|
||||||
.get_drm_fd = backend_get_drm_fd,
|
.get_drm_fd = backend_get_drm_fd,
|
||||||
.get_buffer_caps = backend_get_buffer_caps,
|
.get_buffer_caps = get_buffer_caps,
|
||||||
};
|
};
|
||||||
|
|
||||||
bool wlr_backend_is_x11(struct wlr_backend *backend) {
|
bool wlr_backend_is_x11(struct wlr_backend *backend) {
|
||||||
|
@ -621,14 +613,13 @@ struct wlr_backend *wlr_x11_backend_create(struct wl_display *display,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
x11->renderer = wlr_renderer_autocreate(&x11->backend);
|
struct wlr_renderer *renderer = wlr_backend_get_renderer(&x11->backend);
|
||||||
if (x11->renderer == NULL) {
|
struct wlr_allocator *allocator = backend_get_allocator(&x11->backend);
|
||||||
wlr_log(WLR_ERROR, "Failed to create renderer");
|
if (renderer == NULL || allocator == NULL) {
|
||||||
goto error_event;
|
goto error_event;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t caps = renderer_get_render_buffer_caps(x11->renderer);
|
uint32_t caps = renderer_get_render_buffer_caps(renderer);
|
||||||
|
|
||||||
const struct wlr_drm_format_set *pixmap_formats;
|
const struct wlr_drm_format_set *pixmap_formats;
|
||||||
if (x11->have_dri3 && (caps & WLR_BUFFER_CAP_DMABUF)) {
|
if (x11->have_dri3 && (caps & WLR_BUFFER_CAP_DMABUF)) {
|
||||||
pixmap_formats = &x11->dri3_formats;
|
pixmap_formats = &x11->dri3_formats;
|
||||||
|
@ -640,14 +631,8 @@ struct wlr_backend *wlr_x11_backend_create(struct wl_display *display,
|
||||||
goto error_event;
|
goto error_event;
|
||||||
}
|
}
|
||||||
|
|
||||||
x11->allocator = wlr_allocator_autocreate(&x11->backend, x11->renderer);
|
|
||||||
if (x11->allocator == NULL) {
|
|
||||||
wlr_log(WLR_ERROR, "Failed to create allocator");
|
|
||||||
goto error_event;
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct wlr_drm_format_set *render_formats =
|
const struct wlr_drm_format_set *render_formats =
|
||||||
wlr_renderer_get_render_formats(x11->renderer);
|
wlr_renderer_get_render_formats(renderer);
|
||||||
if (render_formats == NULL) {
|
if (render_formats == NULL) {
|
||||||
wlr_log(WLR_ERROR, "Failed to get available DRM formats from renderer");
|
wlr_log(WLR_ERROR, "Failed to get available DRM formats from renderer");
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <wlr/types/wlr_matrix.h>
|
#include <wlr/types/wlr_matrix.h>
|
||||||
#include <wlr/util/log.h>
|
#include <wlr/util/log.h>
|
||||||
|
|
||||||
|
#include "backend/backend.h"
|
||||||
#include "backend/x11.h"
|
#include "backend/x11.h"
|
||||||
#include "render/swapchain.h"
|
#include "render/swapchain.h"
|
||||||
#include "render/wlr_renderer.h"
|
#include "render/wlr_renderer.h"
|
||||||
|
@ -98,7 +99,7 @@ static void output_destroy(struct wlr_output *wlr_output) {
|
||||||
static bool output_attach_render(struct wlr_output *wlr_output,
|
static bool output_attach_render(struct wlr_output *wlr_output,
|
||||||
int *buffer_age) {
|
int *buffer_age) {
|
||||||
struct wlr_x11_output *output = get_x11_output_from_output(wlr_output);
|
struct wlr_x11_output *output = get_x11_output_from_output(wlr_output);
|
||||||
struct wlr_x11_backend *x11 = output->x11;
|
struct wlr_renderer *renderer = wlr_backend_get_renderer(wlr_output->backend);
|
||||||
|
|
||||||
wlr_buffer_unlock(output->back_buffer);
|
wlr_buffer_unlock(output->back_buffer);
|
||||||
output->back_buffer = wlr_swapchain_acquire(output->swapchain, buffer_age);
|
output->back_buffer = wlr_swapchain_acquire(output->swapchain, buffer_age);
|
||||||
|
@ -107,7 +108,7 @@ static bool output_attach_render(struct wlr_output *wlr_output,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wlr_renderer_bind_buffer(x11->renderer, output->back_buffer)) {
|
if (!wlr_renderer_bind_buffer(renderer, output->back_buffer)) {
|
||||||
wlr_log(WLR_ERROR, "Failed to bind buffer to renderer");
|
wlr_log(WLR_ERROR, "Failed to bind buffer to renderer");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -271,13 +272,14 @@ static struct wlr_x11_buffer *get_or_create_x11_buffer(
|
||||||
|
|
||||||
static bool output_commit_buffer(struct wlr_x11_output *output) {
|
static bool output_commit_buffer(struct wlr_x11_output *output) {
|
||||||
struct wlr_x11_backend *x11 = output->x11;
|
struct wlr_x11_backend *x11 = output->x11;
|
||||||
|
struct wlr_renderer *renderer = wlr_backend_get_renderer(&x11->backend);
|
||||||
|
|
||||||
struct wlr_buffer *buffer = NULL;
|
struct wlr_buffer *buffer = NULL;
|
||||||
switch (output->wlr_output.pending.buffer_type) {
|
switch (output->wlr_output.pending.buffer_type) {
|
||||||
case WLR_OUTPUT_STATE_BUFFER_RENDER:
|
case WLR_OUTPUT_STATE_BUFFER_RENDER:
|
||||||
assert(output->back_buffer != NULL);
|
assert(output->back_buffer != NULL);
|
||||||
|
|
||||||
wlr_renderer_bind_buffer(x11->renderer, NULL);
|
wlr_renderer_bind_buffer(renderer, NULL);
|
||||||
|
|
||||||
buffer = output->back_buffer;
|
buffer = output->back_buffer;
|
||||||
output->back_buffer = NULL;
|
output->back_buffer = NULL;
|
||||||
|
@ -391,10 +393,8 @@ static bool output_commit(struct wlr_output *wlr_output) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void output_rollback_render(struct wlr_output *wlr_output) {
|
static void output_rollback_render(struct wlr_output *wlr_output) {
|
||||||
struct wlr_x11_output *output = get_x11_output_from_output(wlr_output);
|
struct wlr_renderer *renderer = wlr_backend_get_renderer(wlr_output->backend);
|
||||||
struct wlr_x11_backend *x11 = output->x11;
|
wlr_renderer_bind_buffer(renderer, NULL);
|
||||||
|
|
||||||
wlr_renderer_bind_buffer(x11->renderer, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_x11_output_cursor(struct wlr_x11_output *output,
|
static void update_x11_output_cursor(struct wlr_x11_output *output,
|
||||||
|
@ -423,6 +423,8 @@ static bool output_cursor_to_picture(struct wlr_x11_output *output,
|
||||||
struct wlr_texture *texture, enum wl_output_transform transform,
|
struct wlr_texture *texture, enum wl_output_transform transform,
|
||||||
int width, int height) {
|
int width, int height) {
|
||||||
struct wlr_x11_backend *x11 = output->x11;
|
struct wlr_x11_backend *x11 = output->x11;
|
||||||
|
struct wlr_allocator *allocator = backend_get_allocator(&x11->backend);
|
||||||
|
struct wlr_renderer *renderer = wlr_backend_get_renderer(&x11->backend);
|
||||||
int depth = 32;
|
int depth = 32;
|
||||||
int stride = width * 4;
|
int stride = width * 4;
|
||||||
|
|
||||||
|
@ -439,9 +441,8 @@ static bool output_cursor_to_picture(struct wlr_x11_output *output,
|
||||||
output->cursor.swapchain->width != width ||
|
output->cursor.swapchain->width != width ||
|
||||||
output->cursor.swapchain->height != height) {
|
output->cursor.swapchain->height != height) {
|
||||||
wlr_swapchain_destroy(output->cursor.swapchain);
|
wlr_swapchain_destroy(output->cursor.swapchain);
|
||||||
output->cursor.swapchain = wlr_swapchain_create(
|
output->cursor.swapchain = wlr_swapchain_create(allocator,
|
||||||
x11->allocator, width, height,
|
width, height, x11->drm_format);
|
||||||
x11->drm_format);
|
|
||||||
if (output->cursor.swapchain == NULL) {
|
if (output->cursor.swapchain == NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -453,7 +454,7 @@ static bool output_cursor_to_picture(struct wlr_x11_output *output,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!wlr_renderer_bind_buffer(x11->renderer, wlr_buffer)) {
|
if (!wlr_renderer_bind_buffer(renderer, wlr_buffer)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -482,17 +483,17 @@ static bool output_cursor_to_picture(struct wlr_x11_output *output,
|
||||||
float matrix[9];
|
float matrix[9];
|
||||||
wlr_matrix_project_box(matrix, &cursor_box, transform, 0, output_matrix);
|
wlr_matrix_project_box(matrix, &cursor_box, transform, 0, output_matrix);
|
||||||
|
|
||||||
wlr_renderer_begin(x11->renderer, width, height);
|
wlr_renderer_begin(renderer, width, height);
|
||||||
wlr_renderer_clear(x11->renderer, (float[]){ 0.0, 0.0, 0.0, 0.0 });
|
wlr_renderer_clear(renderer, (float[]){ 0.0, 0.0, 0.0, 0.0 });
|
||||||
wlr_render_texture_with_matrix(x11->renderer, texture, matrix, 1.0);
|
wlr_render_texture_with_matrix(renderer, texture, matrix, 1.0);
|
||||||
wlr_renderer_end(x11->renderer);
|
wlr_renderer_end(renderer);
|
||||||
|
|
||||||
bool result = wlr_renderer_read_pixels(
|
bool result = wlr_renderer_read_pixels(
|
||||||
x11->renderer, DRM_FORMAT_ARGB8888, NULL,
|
renderer, DRM_FORMAT_ARGB8888, NULL,
|
||||||
width * 4, width, height, 0, 0, 0, 0,
|
width * 4, width, height, 0, 0, 0, 0,
|
||||||
data);
|
data);
|
||||||
|
|
||||||
wlr_renderer_bind_buffer(x11->renderer, NULL);
|
wlr_renderer_bind_buffer(renderer, NULL);
|
||||||
|
|
||||||
wlr_buffer_unlock(wlr_buffer);
|
wlr_buffer_unlock(wlr_buffer);
|
||||||
|
|
||||||
|
@ -594,6 +595,7 @@ static const struct wlr_output_impl output_impl = {
|
||||||
|
|
||||||
struct wlr_output *wlr_x11_output_create(struct wlr_backend *backend) {
|
struct wlr_output *wlr_x11_output_create(struct wlr_backend *backend) {
|
||||||
struct wlr_x11_backend *x11 = get_x11_backend_from_backend(backend);
|
struct wlr_x11_backend *x11 = get_x11_backend_from_backend(backend);
|
||||||
|
struct wlr_allocator *allocator = backend_get_allocator(backend);
|
||||||
|
|
||||||
if (!x11->started) {
|
if (!x11->started) {
|
||||||
++x11->requested_outputs;
|
++x11->requested_outputs;
|
||||||
|
@ -613,7 +615,7 @@ struct wlr_output *wlr_x11_output_create(struct wlr_backend *backend) {
|
||||||
|
|
||||||
wlr_output_update_custom_mode(wlr_output, 1024, 768, 0);
|
wlr_output_update_custom_mode(wlr_output, 1024, 768, 0);
|
||||||
|
|
||||||
output->swapchain = wlr_swapchain_create(x11->allocator,
|
output->swapchain = wlr_swapchain_create(allocator,
|
||||||
wlr_output->width, wlr_output->height, x11->drm_format);
|
wlr_output->width, wlr_output->height, x11->drm_format);
|
||||||
if (!output->swapchain) {
|
if (!output->swapchain) {
|
||||||
wlr_log(WLR_ERROR, "Failed to create swapchain");
|
wlr_log(WLR_ERROR, "Failed to create swapchain");
|
||||||
|
@ -705,6 +707,8 @@ struct wlr_output *wlr_x11_output_create(struct wlr_backend *backend) {
|
||||||
|
|
||||||
void handle_x11_configure_notify(struct wlr_x11_output *output,
|
void handle_x11_configure_notify(struct wlr_x11_output *output,
|
||||||
xcb_configure_notify_event_t *ev) {
|
xcb_configure_notify_event_t *ev) {
|
||||||
|
struct wlr_allocator *allocator = backend_get_allocator(&output->x11->backend);
|
||||||
|
|
||||||
// ignore events that set an invalid size:
|
// ignore events that set an invalid size:
|
||||||
if (ev->width == 0 || ev->height == 0) {
|
if (ev->width == 0 || ev->height == 0) {
|
||||||
wlr_log(WLR_DEBUG,
|
wlr_log(WLR_DEBUG,
|
||||||
|
@ -716,7 +720,7 @@ void handle_x11_configure_notify(struct wlr_x11_output *output,
|
||||||
if (output->swapchain->width != ev->width ||
|
if (output->swapchain->width != ev->width ||
|
||||||
output->swapchain->height != ev->height) {
|
output->swapchain->height != ev->height) {
|
||||||
struct wlr_swapchain *swapchain = wlr_swapchain_create(
|
struct wlr_swapchain *swapchain = wlr_swapchain_create(
|
||||||
output->x11->allocator, ev->width, ev->height,
|
allocator, ev->width, ev->height,
|
||||||
output->x11->drm_format);
|
output->x11->drm_format);
|
||||||
if (!swapchain) {
|
if (!swapchain) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -88,12 +88,10 @@ struct wlr_x11_backend {
|
||||||
struct wlr_input_device keyboard_dev;
|
struct wlr_input_device keyboard_dev;
|
||||||
|
|
||||||
int drm_fd;
|
int drm_fd;
|
||||||
struct wlr_renderer *renderer;
|
|
||||||
struct wlr_drm_format_set dri3_formats;
|
struct wlr_drm_format_set dri3_formats;
|
||||||
struct wlr_drm_format_set shm_formats;
|
struct wlr_drm_format_set shm_formats;
|
||||||
const struct wlr_x11_format *x11_format;
|
const struct wlr_x11_format *x11_format;
|
||||||
struct wlr_drm_format *drm_format;
|
struct wlr_drm_format *drm_format;
|
||||||
struct wlr_allocator *allocator;
|
|
||||||
struct wl_event_source *event_source;
|
struct wl_event_source *event_source;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
|
Loading…
Reference in a new issue