gl-renderer: Replace window-create args with struct

gl_rendererer's output_window_create has a lot of arguments now. Add a
structure for the options to make it more clear what is what.
This is in preparation for adding bare-integer arguments which are ripe
for confusion when passing positional arguments.

Signed-off-by: Daniel Stone <daniels@collabora.com>
dev
Daniel Stone 5 years ago committed by Pekka Paalanen
parent c890c384c8
commit db6e6e1ec5
  1. 17
      libweston/backend-drm/drm-gbm.c
  2. 12
      libweston/backend-wayland/wayland.c
  3. 26
      libweston/backend-x11/x11.c
  4. 13
      libweston/renderer-gl/gl-renderer.c
  5. 23
      libweston/renderer-gl/gl-renderer.h

@ -185,7 +185,10 @@ drm_output_init_egl(struct drm_output *output, struct drm_backend *b)
output->gbm_format, output->gbm_format,
fallback_format_for(output->gbm_format), fallback_format_for(output->gbm_format),
}; };
unsigned n_formats = 1; struct gl_renderer_output_options options = {
.drm_formats = format,
.drm_formats_count = 1,
};
struct weston_mode *mode = output->base.current_mode; struct weston_mode *mode = output->base.current_mode;
struct drm_plane *plane = output->scanout_plane; struct drm_plane *plane = output->scanout_plane;
unsigned int i; unsigned int i;
@ -231,13 +234,11 @@ drm_output_init_egl(struct drm_output *output, struct drm_backend *b)
return -1; return -1;
} }
if (format[1]) if (options.drm_formats[1])
n_formats = 2; options.drm_formats_count = 2;
if (gl_renderer->output_window_create(&output->base, options.window_for_legacy = (EGLNativeWindowType) output->gbm_surface;
(EGLNativeWindowType)output->gbm_surface, options.window_for_platform = output->gbm_surface;
output->gbm_surface, if (gl_renderer->output_window_create(&output->base, &options) < 0) {
format,
n_formats) < 0) {
weston_log("failed to create gl renderer output state\n"); weston_log("failed to create gl renderer output state\n");
gbm_surface_destroy(output->gbm_surface); gbm_surface_destroy(output->gbm_surface);
output->gbm_surface = NULL; output->gbm_surface = NULL;

@ -762,6 +762,10 @@ static int
wayland_output_init_gl_renderer(struct wayland_output *output) wayland_output_init_gl_renderer(struct wayland_output *output)
{ {
int32_t fwidth = 0, fheight = 0; int32_t fwidth = 0, fheight = 0;
struct gl_renderer_output_options options = {
.drm_formats = wayland_formats,
.drm_formats_count = ARRAY_LENGTH(wayland_formats),
};
if (output->frame) { if (output->frame) {
fwidth = frame_width(output->frame); fwidth = frame_width(output->frame);
@ -778,12 +782,10 @@ wayland_output_init_gl_renderer(struct wayland_output *output)
weston_log("failure to create wl_egl_window\n"); weston_log("failure to create wl_egl_window\n");
return -1; return -1;
} }
options.window_for_legacy = output->gl.egl_window;
options.window_for_platform = output->gl.egl_window;
if (gl_renderer->output_window_create(&output->base, if (gl_renderer->output_window_create(&output->base, &options) < 0)
output->gl.egl_window,
output->gl.egl_window,
wayland_formats,
ARRAY_LENGTH(wayland_formats)) < 0)
goto cleanup_window; goto cleanup_window;
return 0; return 0;

@ -854,14 +854,16 @@ x11_output_switch_mode(struct weston_output *base, struct weston_mode *mode)
} }
} else { } else {
Window xid = (Window) output->window; Window xid = (Window) output->window;
const struct gl_renderer_output_options options = {
.window_for_legacy = (EGLNativeWindowType) output->window,
.window_for_platform = &xid,
.drm_formats = x11_formats,
.drm_formats_count = ARRAY_LENGTH(x11_formats),
};
gl_renderer->output_destroy(&output->base); gl_renderer->output_destroy(&output->base);
ret = gl_renderer->output_window_create(&output->base, ret = gl_renderer->output_window_create(&output->base, &options);
(EGLNativeWindowType) output->window,
&xid,
x11_formats,
ARRAY_LENGTH(x11_formats));
if (ret < 0) if (ret < 0)
return -1; return -1;
} }
@ -1030,13 +1032,15 @@ x11_output_enable(struct weston_output *base)
/* eglCreatePlatformWindowSurfaceEXT takes a Window* /* eglCreatePlatformWindowSurfaceEXT takes a Window*
* but eglCreateWindowSurface takes a Window. */ * but eglCreateWindowSurface takes a Window. */
Window xid = (Window) output->window; Window xid = (Window) output->window;
const struct gl_renderer_output_options options = {
.window_for_legacy = (EGLNativeWindowType) output->window,
.window_for_platform = &xid,
.drm_formats = x11_formats,
.drm_formats_count = ARRAY_LENGTH(x11_formats),
};
ret = gl_renderer->output_window_create( ret = gl_renderer->output_window_create(&output->base,
&output->base, &options);
(EGLNativeWindowType) output->window,
&xid,
x11_formats,
ARRAY_LENGTH(x11_formats));
if (ret < 0) if (ret < 0)
goto err; goto err;

@ -3172,10 +3172,7 @@ gl_renderer_output_create(struct weston_output *output,
static int static int
gl_renderer_output_window_create(struct weston_output *output, gl_renderer_output_window_create(struct weston_output *output,
EGLNativeWindowType window_for_legacy, const struct gl_renderer_output_options *options)
void *window_for_platform,
const uint32_t *drm_formats,
unsigned drm_formats_count)
{ {
struct weston_compositor *ec = output->compositor; struct weston_compositor *ec = output->compositor;
struct gl_renderer *gr = get_renderer(ec); struct gl_renderer *gr = get_renderer(ec);
@ -3183,10 +3180,10 @@ gl_renderer_output_window_create(struct weston_output *output,
int ret = 0; int ret = 0;
egl_surface = gl_renderer_create_window_surface(gr, egl_surface = gl_renderer_create_window_surface(gr,
window_for_legacy, options->window_for_legacy,
window_for_platform, options->window_for_platform,
drm_formats, options->drm_formats,
drm_formats_count); options->drm_formats_count);
if (egl_surface == EGL_NO_SURFACE) { if (egl_surface == EGL_NO_SURFACE) {
weston_log("failed to create egl surface\n"); weston_log("failed to create egl surface\n");
return -1; return -1;

@ -76,6 +76,17 @@ struct gl_renderer_display_options {
unsigned drm_formats_count; unsigned drm_formats_count;
}; };
struct gl_renderer_output_options {
/** Native window handle for \c eglCreateWindowSurface */
EGLNativeWindowType window_for_legacy;
/** Native window handle for \c eglCreatePlatformWindowSurface */
void *window_for_platform;
/** Array of DRM pixel formats acceptable for the window */
const uint32_t *drm_formats;
/** The \c drm_formats array length */
unsigned drm_formats_count;
};
struct gl_renderer_interface { struct gl_renderer_interface {
/** /**
* Initialize GL-renderer with the given EGL platform and native display * Initialize GL-renderer with the given EGL platform and native display
@ -114,12 +125,7 @@ struct gl_renderer_interface {
* Attach GL-renderer to the output with a native window * Attach GL-renderer to the output with a native window
* *
* \param output The output to create a rendering surface for. * \param output The output to create a rendering surface for.
* \param window_for_legacy Native window handle for * \param options The options struct describing output configuration
* eglCreateWindowSurface().
* \param window_for_platform Native window handle for
* eglCreatePlatformWindowSurface().
* \param drm_formats Array of DRM pixel formats that are acceptable.
* \param drm_formats_count The drm_formats array length.
* \return 0 on success, -1 on failure. * \return 0 on success, -1 on failure.
* *
* This function creates the renderer data structures needed to repaint * This function creates the renderer data structures needed to repaint
@ -138,10 +144,7 @@ struct gl_renderer_interface {
* with \c EGL_WINDOW_BIT in \c egl_surface_type. * with \c EGL_WINDOW_BIT in \c egl_surface_type.
*/ */
int (*output_window_create)(struct weston_output *output, int (*output_window_create)(struct weston_output *output,
EGLNativeWindowType window_for_legacy, const struct gl_renderer_output_options *options);
void *window_for_platform,
const uint32_t *drm_formats,
unsigned drm_formats_count);
/** /**
* Attach GL-renderer to the output with internal pixel storage * Attach GL-renderer to the output with internal pixel storage

Loading…
Cancel
Save