diff options
Diffstat (limited to 'src/compositor-drm.c')
-rw-r--r-- | src/compositor-drm.c | 90 |
1 files changed, 61 insertions, 29 deletions
diff --git a/src/compositor-drm.c b/src/compositor-drm.c index 154e15e4..3c15ec30 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -41,13 +41,13 @@ #include <drm_fourcc.h> #include <gbm.h> -#include <libbacklight.h> #include <libudev.h> +#include "libbacklight.h" #include "compositor.h" #include "gl-renderer.h" #include "pixman-renderer.h" -#include "udev-seat.h" +#include "udev-input.h" #include "launcher-util.h" #include "vaapi-recorder.h" @@ -147,6 +147,7 @@ struct drm_output { drmModeCrtcPtr original_crtc; struct drm_edid edid; drmModePropertyPtr dpms_prop; + uint32_t format; int vblank_pending; int page_flip_pending; @@ -420,8 +421,6 @@ static uint32_t drm_output_check_scanout_format(struct drm_output *output, struct weston_surface *es, struct gbm_bo *bo) { - struct drm_compositor *c = - (struct drm_compositor *) output->base.compositor; uint32_t format; pixman_region32_t r; @@ -442,7 +441,7 @@ drm_output_check_scanout_format(struct drm_output *output, pixman_region32_fini(&r); } - if (c->format == format) + if (output->format == format) return format; return 0; @@ -456,6 +455,7 @@ drm_output_prepare_scanout_view(struct weston_output *_output, struct drm_compositor *c = (struct drm_compositor *) output->base.compositor; struct weston_buffer *buffer = ev->surface->buffer_ref.buffer; + struct weston_buffer_viewport *viewport = &ev->surface->buffer_viewport; struct gbm_bo *bo; uint32_t format; @@ -464,7 +464,7 @@ drm_output_prepare_scanout_view(struct weston_output *_output, buffer == NULL || c->gbm == NULL || buffer->width != output->base.current_mode->width || buffer->height != output->base.current_mode->height || - output->base.transform != ev->surface->buffer_viewport.transform || + output->base.transform != viewport->buffer.transform || ev->transform.enabled) return NULL; @@ -507,7 +507,7 @@ drm_output_render_gl(struct drm_output *output, pixman_region32_t *damage) return; } - output->next = drm_fb_get_from_bo(bo, c, c->format); + output->next = drm_fb_get_from_bo(bo, c, output->format); if (!output->next) { weston_log("failed to get drm_fb for bo\n"); gbm_surface_release_buffer(output->surface, bo); @@ -809,6 +809,7 @@ drm_output_prepare_overlay_view(struct weston_output *output_base, { struct weston_compositor *ec = output_base->compositor; struct drm_compositor *c =(struct drm_compositor *) ec; + struct weston_buffer_viewport *viewport = &ev->surface->buffer_viewport; struct drm_sprite *s; int found = 0; struct gbm_bo *bo; @@ -820,10 +821,10 @@ drm_output_prepare_overlay_view(struct weston_output *output_base, if (c->gbm == NULL) return NULL; - if (ev->surface->buffer_viewport.transform != output_base->transform) + if (viewport->buffer.transform != output_base->transform) return NULL; - if (ev->surface->buffer_viewport.scale != output_base->current_scale) + if (viewport->buffer.scale != output_base->current_scale) return NULL; if (c->sprites_are_broken) @@ -933,8 +934,8 @@ drm_output_prepare_overlay_view(struct weston_output *output_base, tbox = weston_transformed_rect(wl_fixed_from_int(ev->surface->width), wl_fixed_from_int(ev->surface->height), - ev->surface->buffer_viewport.transform, - ev->surface->buffer_viewport.scale, + viewport->buffer.transform, + viewport->buffer.scale, tbox); s->src_x = tbox.x1 << 8; @@ -1528,12 +1529,13 @@ find_crtc_for_connector(struct drm_compositor *ec, static int drm_output_init_egl(struct drm_output *output, struct drm_compositor *ec) { + EGLint format = output->format; int i, flags; output->surface = gbm_surface_create(ec->gbm, output->base.current_mode->width, output->base.current_mode->height, - ec->format, + format, GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING); if (!output->surface) { @@ -1541,7 +1543,9 @@ drm_output_init_egl(struct drm_output *output, struct drm_compositor *ec) return -1; } - if (gl_renderer->output_create(&output->base, output->surface) < 0) { + if (gl_renderer->output_create(&output->base, output->surface, + gl_renderer->opaque_attribs, + &format) < 0) { weston_log("failed to create gl renderer output state\n"); gbm_surface_destroy(output->surface); return -1; @@ -1841,7 +1845,7 @@ setup_output_seat_constraint(struct drm_compositor *ec, if (strcmp(s, "") != 0) { struct udev_seat *seat; - seat = udev_seat_get_named(&ec->base, s); + seat = udev_seat_get_named(&ec->input, s); if (seat) seat->base.output = output; @@ -1853,6 +1857,35 @@ setup_output_seat_constraint(struct drm_compositor *ec, } static int +get_gbm_format_from_section(struct weston_config_section *section, + uint32_t default_value, + uint32_t *format) +{ + char *s; + int ret = 0; + + weston_config_section_get_string(section, + "gbm-format", &s, NULL); + + if (s == NULL) + *format = default_value; + else if (strcmp(s, "xrgb8888") == 0) + *format = GBM_FORMAT_XRGB8888; + else if (strcmp(s, "rgb565") == 0) + *format = GBM_FORMAT_RGB565; + else if (strcmp(s, "xrgb2101010") == 0) + *format = GBM_FORMAT_XRGB2101010; + else { + weston_log("fatal: unrecognized pixel format: %s\n", s); + ret = -1; + } + + free(s); + + return ret; +} + +static int create_output_for_connector(struct drm_compositor *ec, drmModeRes *resources, drmModeConnector *connector, @@ -1919,6 +1952,11 @@ create_output_for_connector(struct drm_compositor *ec, transform = parse_transform(s, output->base.name); free(s); + if (get_gbm_format_from_section(section, + ec->format, + &output->format) == -1) + output->format = ec->format; + weston_config_section_get_string(section, "seat", &s, ""); setup_output_seat_constraint(ec, &output->base, s); free(s); @@ -2399,7 +2437,7 @@ session_notify(struct wl_listener *listener, void *data) compositor->state = ec->prev_state; drm_compositor_set_modes(ec); weston_compositor_damage_all(compositor); - udev_input_enable(&ec->input, ec->udev); + udev_input_enable(&ec->input); } else { weston_log("deactivating session\n"); udev_input_disable(&ec->input); @@ -2663,7 +2701,6 @@ drm_compositor_create(struct wl_display *display, struct udev_device *drm_device; struct wl_event_loop *loop; const char *path; - char *s; uint32_t key; weston_log("initializing drm backend\n"); @@ -2677,20 +2714,10 @@ drm_compositor_create(struct wl_display *display, ec->sprites_are_broken = 1; section = weston_config_get_section(config, "core", NULL, NULL); - weston_config_section_get_string(section, - "gbm-format", &s, "xrgb8888"); - if (strcmp(s, "xrgb8888") == 0) - ec->format = GBM_FORMAT_XRGB8888; - else if (strcmp(s, "rgb565") == 0) - ec->format = GBM_FORMAT_RGB565; - else if (strcmp(s, "xrgb2101010") == 0) - ec->format = GBM_FORMAT_XRGB2101010; - else { - weston_log("fatal: unrecognized pixel format: %s\n", s); - free(s); + if (get_gbm_format_from_section(section, + GBM_FORMAT_XRGB8888, + &ec->format) == -1) goto err_base; - } - free(s); ec->use_pixman = param->use_pixman; @@ -2761,6 +2788,11 @@ drm_compositor_create(struct wl_display *display, goto err_sprite; } + /* A this point we have some idea of whether or not we have a working + * cursor plane. */ + if (!ec->cursors_are_broken) + ec->base.capabilities |= WESTON_CAP_CURSOR_PLANE; + path = NULL; if (udev_input_init(&ec->input, |