[systemd-devel] [RFC 07/12] gfx: add graphics layer
Lennart Poettering
lennart at poettering.net
Wed Nov 27 14:24:29 PST 2013
On Wed, 27.11.13 19:48, David Herrmann (dh.herrmann at gmail.com) wrote:
> +typedef struct gfx_config_pipe gfx_config_pipe;
> +typedef struct gfx_connector gfx_connector;
> +typedef struct gfx_encoder gfx_encoder;
> +
> +/* clock-wise framebuffer rotation */
> +enum {
> + GFX_ROTATE_0,
> + GFX_ROTATE_90,
> + GFX_ROTATE_180,
> + GFX_ROTATE_270,
> +};
> +
> +struct gfx_config_pipe {
> + unsigned int config_id;
> + char **connectors;
> + char *mode;
> + unsigned int rotate;
> +
> + unsigned int disable : 1;
C99 bool plz! (here and everywhere else...)
> + memset(handles, 0, sizeof(handles));
> + memset(strides, 0, sizeof(strides));
> + memset(offsets, 0, sizeof(offsets));
zero(handles) is so much nicer... (here and everywhere...)
> +static int gfx_pipe_new(sd_gfx_pipe **out, sd_gfx_card *card, drmModeCrtc *crtc, unsigned int connector_count) {
> + sd_gfx_pipe *pipe;
> + int r;
> +
> + pipe = calloc(1, sizeof(*pipe));
> + if (!pipe)
> + return log_oom();
> +
> + pipe->ref = 1;
> + pipe->card = card;
> + pipe->id = card->pipe_ids;
> + pipe->crtc_id = crtc->crtc_id;
> + pipe->page_flip_cnt = 1;
> +
> + pipe->connectors = calloc(connector_count, sizeof(*pipe->connectors));
> + if (!pipe->connectors) {
> + r = log_oom();
> + goto err_pipe;
> + }
> +
> + pipe->want_connectors = calloc(connector_count, sizeof(*pipe->want_connectors));
> + if (!pipe->want_connectors) {
> + r = log_oom();
> + goto err_connectors;
> + }
> +
> + pipe->connector_ids = calloc(connector_count, sizeof(*pipe->connector_ids));
> + if (!pipe->connector_ids) {
> + r = log_oom();
> + goto err_want_connectors;
> + }
> +
> + pipe->want_connector_ids = calloc(connector_count, sizeof(*pipe->want_connector_ids));
> + if (!pipe->want_connector_ids) {
> + r = log_oom();
> + goto err_connector_ids;
> + }
> +
> + r = gfx_plane_new_primary(&pipe->primary, pipe);
> + if (r < 0)
> + goto err_want_connector_ids;
> +
> + gfx_pipe_refresh(pipe, crtc);
> +
> + *out = pipe;
> + return 0;
> +
> +err_want_connector_ids:
> + free(pipe->want_connector_ids);
> +err_connector_ids:
> + free(pipe->connector_ids);
> +err_want_connectors:
> + free(pipe->want_connectors);
> +err_connectors:
> + free(pipe->connectors);
> +err_pipe:
> + free(pipe);
> + return r;
> +}
> +
For clean-up code like this I usually find it nicer to simply have a
destructor function that is robust to destruct half-initialized objects
and then just invoke this here.
> +/* framebuffer */
> +
> +typedef void (*sd_gfx_fb_unlink_fn) (sd_gfx_fb *fb, void *fn_data);
> +typedef void (*sd_gfx_fb_unpin_fn) (sd_gfx_fb *fb, void *fn_data);
For the types that actually feel like primitive types (in contrast to
objects), we usually appended a libc style _t to our names.
I can't really say much about the actual drm stuff going on here, just
my usualy whining about logging from lib code, C99 bools, zero()...
Lennart
--
Lennart Poettering, Red Hat
More information about the systemd-devel
mailing list