summaryrefslogtreecommitdiff
path: root/src/compositor-drm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/compositor-drm.c')
-rw-r--r--src/compositor-drm.c90
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,