[PATCH 21/72] drm: typecasting helpers
"Enrico Weigelt, metux IT consult" <[email protected]>
| Newsgroups | gmane.comp.lib.cairo |
|---|---|
| Message-ID | <[email protected]> |
Signed-off-by: Enrico Weigelt, metux IT consult <[email protected]> --- src/drm/cairo-drm-i915-glyphs.c | 4 +- src/drm/cairo-drm-i915-private.h | 39 +++++++++++++++- src/drm/cairo-drm-i915-shader.c | 25 +++++----- src/drm/cairo-drm-i915-surface.c | 40 ++++++++-------- src/drm/cairo-drm-i965-glyphs.c | 2 +- src/drm/cairo-drm-i965-private.h | 27 +++++++++++ src/drm/cairo-drm-i965-shader.c | 44 ++++++++--------- src/drm/cairo-drm-i965-surface.c | 12 ++--- src/drm/cairo-drm-intel-private.h | 57 ++++++++++++++++++++-- src/drm/cairo-drm-intel-surface.c | 34 ++++++++------ src/drm/cairo-drm-intel.c | 4 +- src/drm/cairo-drm-private.h | 46 ++++++++++++++++++ src/drm/cairo-drm-radeon-private.h | 96 ++++++++++++++++++++++++++++++++++++++ src/drm/cairo-drm-radeon-surface.c | 33 ++++--------- src/drm/cairo-drm-radeon.c | 8 ++-- src/drm/cairo-drm-surface.c | 4 +- src/drm/cairo-drm.c | 10 ++-- 17 files changed, 363 insertions(+), 122 deletions(-) diff --git a/src/drm/cairo-drm-i915-glyphs.c b/src/drm/cairo-drm-i915-glyphs.c index 9944f15..c648030 100644 --- a/src/drm/cairo-drm-i915-glyphs.c +++ b/src/drm/cairo-drm-i915-glyphs.c @@ -217,7 +217,7 @@ i915_surface_mask_internal (i915_surface_t *dst, 1. / mask->intel.drm.width, 1. / mask->intel.drm.height); - shader.mask.base.bo = intel_bo_reference (to_intel_bo (mask->intel.drm.bo)); + shader.mask.base.bo = i915_surface_get_bo_ref (mask); shader.mask.base.offset[0] = 0; shader.mask.base.map[0] = mask->map0; shader.mask.base.map[1] = mask->map1; @@ -282,7 +282,7 @@ i915_surface_glyphs (void *abstract_surface, cairo_clip_t *clip, int *num_remaining) { - i915_surface_t *surface = abstract_surface; + i915_surface_t *surface = _cairo_abstract_surface_cast_i915 (abstract_surface); i915_surface_t *mask = NULL; i915_device_t *device; i915_shader_t shader; diff --git a/src/drm/cairo-drm-i915-private.h b/src/drm/cairo-drm-i915-private.h index c750cf4..ddde512 100644 --- a/src/drm/cairo-drm-i915-private.h +++ b/src/drm/cairo-drm-i915-private.h @@ -764,6 +764,39 @@ struct i915_surface { uint32_t stencil_offset; }; +static inline i915_surface_t * +_cairo_abstract_surface_cast_i915 (cairo_surface_t* surface) +{ + return cairo_container_of ( + cairo_abstract_surface_cast_intel (surface), + i915_surface_t, + intel); +} + +static inline i915_device_t * +_cairo_intel_device_cast_i915 (intel_device_t *device) +{ + return cairo_container_of (device, i915_device_t, intel); +} + +static inline i915_device_t * +_cairo_device_cast_i915 (void *device) +{ + return _cairo_intel_device_cast_i915 (_cairo_device_cast_intel (device) ); +} + +static inline intel_bo_t * +i915_surface_get_bo (const i915_surface_t *surface) +{ + return _cairo_intel_surface_get_bo (&(surface->intel)); +} + +static inline intel_bo_t * +i915_surface_get_bo_ref (const i915_surface_t *surface) +{ + return intel_bo_reference (i915_surface_get_bo (surface)); +} + typedef enum { NONE = 0, YUV_I420, @@ -1031,8 +1064,10 @@ BUF_tiling (uint32_t tiling) } #define OUT_DWORD(dword) i915_batch_emit_dword (device, dword) -#define OUT_RELOC(surface, read, write) i915_batch_emit_reloc (device, to_intel_bo (surface->intel.drm.bo), surface->offset, read, write, FALSE) -#define OUT_RELOC_FENCED(surface, read, write) i915_batch_emit_reloc (device, to_intel_bo (surface->intel.drm.bo), surface->offset, read, write, TRUE) +#define OUT_RELOC(surface, read, write) \ + i915_batch_emit_reloc (device, i915_surface_get_bo (surface), surface->offset, read, write, FALSE) +#define OUT_RELOC_FENCED(surface, read, write) \ + i915_batch_emit_reloc (device, i915_surface_get_bo (surface), surface->offset, read, write, TRUE) #define FS_LOCALS \ uint32_t *_shader_start diff --git a/src/drm/cairo-drm-i915-shader.c b/src/drm/cairo-drm-i915-shader.c index 85aa984..e2dba9b 100644 --- a/src/drm/cairo-drm-i915-shader.c +++ b/src/drm/cairo-drm-i915-shader.c @@ -43,7 +43,7 @@ static cairo_status_t i915_packed_pixel_surface_finish (void *abstract_surface) { - i915_packed_pixel_surface_t *surface = abstract_surface; + i915_packed_pixel_surface_t *surface = _cairo_abstract_surface_cast_i915 (abstract_surface); i915_device_t *device; device = i915_device_acquire (&surface->device->intel.base); @@ -1305,7 +1305,7 @@ i915_surface_clone (i915_device_t *device, return clone->intel.drm.base.status; status = intel_bo_put_image (&device->intel, - to_intel_bo (clone->intel.drm.bo), + i915_surface_get_bo (clone), image, 0, 0, image->width, image->height, @@ -1344,7 +1344,7 @@ i915_surface_clone_subimage (i915_device_t *device, return clone->intel.drm.base.status; status = intel_bo_put_image (&device->intel, - to_intel_bo (clone->intel.drm.bo), + i915_surface_get_bo (clone), image, extents->x, extents->y, extents->width, extents->height, @@ -1379,7 +1379,8 @@ i915_surface_render_pattern (i915_device_t *device, return clone->intel.drm.base.status; ptr = intel_bo_map (&device->intel, - to_intel_bo (clone->intel.drm.bo)); + i915_surface_get_bo (clone)); + if (unlikely (ptr == NULL)) { cairo_surface_destroy (&clone->intel.drm.base); return _cairo_error (CAIRO_STATUS_NO_MEMORY); @@ -1515,7 +1516,7 @@ i915_shader_acquire_surface (i915_shader_t *shader, /* XXX blt subimage and cache snapshot */ - if (to_intel_bo (s->intel.drm.bo)->batch_write_domain) { + if (i915_surface_get_bo (s)->batch_write_domain) { /* XXX pipelined flush of RENDER/TEXTURE cache */ } @@ -1524,7 +1525,7 @@ i915_shader_acquire_surface (i915_shader_t *shader, surface_width = sub->extents.width; surface_height = sub->extents.height; - src->base.bo = intel_bo_reference (to_intel_bo (s->intel.drm.bo)); + src->base.bo = i915_surface_get_bo_ref (s); src->base.n_samplers = 1; x = sub->extents.x; @@ -1562,7 +1563,7 @@ i915_shader_acquire_surface (i915_shader_t *shader, surface_width = s->intel.drm.width; surface_height = s->intel.drm.height; - src->base.bo = intel_bo_reference (to_intel_bo (s->intel.drm.bo)); + src->base.bo = i915_surface_get_bo_ref (s); src->base.n_samplers = 1; src->base.offset[0] = s->offset; src->base.map[0] = s->map0; @@ -1652,7 +1653,7 @@ i915_shader_acquire_surface (i915_shader_t *shader, src->type.fragment = FS_TEXTURE; src->surface.pixel = NONE; - src->base.bo = intel_bo_reference (to_intel_bo (s->intel.drm.bo)); + src->base.bo = i915_surface_get_bo_ref (s); src->base.n_samplers = 1; src->base.offset[0] = s->offset; src->base.map[0] = s->map0; @@ -2399,7 +2400,7 @@ i915_set_dst (i915_device_t *device, i915_surface_t *dst) if (device->current_target != dst) { intel_bo_t *bo; - bo = to_intel_bo (dst->intel.drm.bo); + bo = i915_surface_get_bo (dst); assert (bo != NULL); OUT_DWORD (_3DSTATE_BUF_INFO_CMD); @@ -2519,7 +2520,7 @@ i915_shader_set_clip (i915_shader_t *shader, channel->surface.pixel = NONE; s = (i915_surface_t *) clip_surface; - channel->base.bo = to_intel_bo (s->intel.drm.bo); + channel->base.bo = i915_surface_get_bo (s); channel->base.n_samplers = 1; channel->base.offset[0] = s->offset; channel->base.map[0] = s->map0; @@ -2548,7 +2549,7 @@ i915_shader_check_aperture (i915_shader_t *shader, uint32_t n = 0; if (shader->target != device->current_target) - bo_array[n++] = to_intel_bo (shader->target->intel.drm.bo); + bo_array[n++] = i915_surface_get_bo (shader->target); if (shader->source.base.bo != NULL) bo_array[n++] = shader->source.base.bo; @@ -2637,7 +2638,7 @@ i915_shader_setup_dst (i915_shader_t *shader) channel->surface.pixel = NONE; s = shader->target; - channel->base.bo = to_intel_bo (s->intel.drm.bo); + channel->base.bo = i915_surface_get_bo (s); channel->base.n_samplers = 1; channel->base.offset[0] = s->offset; channel->base.map[0] = s->map0; diff --git a/src/drm/cairo-drm-i915-surface.c b/src/drm/cairo-drm-i915-surface.c index 2de9762..92016dd 100644 --- a/src/drm/cairo-drm-i915-surface.c +++ b/src/drm/cairo-drm-i915-surface.c @@ -651,7 +651,7 @@ i915_surface_create_similar (void *abstract_other, static cairo_status_t i915_surface_finish (void *abstract_surface) { - i915_surface_t *surface = abstract_surface; + i915_surface_t *surface = _cairo_abstract_surface_cast_i915 (abstract_surface); i915_device_t *device = i915_device (surface); if (surface->stencil != NULL) { @@ -700,7 +700,7 @@ i915_surface_batch_flush (i915_surface_t *surface) assert (surface->intel.drm.fallback == NULL); - bo = to_intel_bo (surface->intel.drm.bo); + bo = i915_surface_get_bo (surface); if (bo == NULL || bo->batch_write_domain == 0) return CAIRO_STATUS_SUCCESS; @@ -718,7 +718,7 @@ static cairo_status_t i915_surface_flush (void *abstract_surface, unsigned flags) { - i915_surface_t *surface = abstract_surface; + i915_surface_t *surface = _cairo_abstract_surface_cast_i915 (abstract_surface); cairo_status_t status; if (flags) @@ -1041,8 +1041,8 @@ i915_blt (i915_surface_t *src, cairo_status_t status; int br13, cmd; - bo_array[0] = to_intel_bo (dst->intel.drm.bo); - bo_array[1] = to_intel_bo (src->intel.drm.bo); + bo_array[0] = i915_surface_get_bo (dst); + bo_array[1] = i915_surface_get_bo (src); status = i915_surface_fallback_flush (src); if (unlikely (status)) @@ -1138,7 +1138,7 @@ i915_clear_boxes (i915_surface_t *dst, i915_device_t *device = i915_device (dst); const struct _cairo_boxes_chunk *chunk; cairo_status_t status; - intel_bo_t *bo_array[1] = { to_intel_bo (dst->intel.drm.bo) }; + intel_bo_t *bo_array[1] = { i915_surface_get_bo (dst) }; int cmd, br13, clear = 0, i; cmd = XY_COLOR_BLT_CMD; @@ -1307,7 +1307,7 @@ i915_blt_boxes (i915_surface_t *dst, ty = _cairo_lround (pattern->matrix.y0); device = i915_device (dst); - if (to_intel_bo (src->intel.drm.bo)->tiling == I915_TILING_Y) { + if (i915_surface_get_bo (src)->tiling == I915_TILING_Y) { cairo_rectangle_int_t extents; _cairo_boxes_extents (boxes, &extents); @@ -1323,8 +1323,8 @@ i915_blt_boxes (i915_surface_t *dst, ty = -extents.y; } - bo_array[0] = to_intel_bo (dst->intel.drm.bo); - bo_array[1] = to_intel_bo (src->intel.drm.bo); + bo_array[0] = i915_surface_get_bo (dst); + bo_array[1] = i915_surface_get_bo (src); status = cairo_device_acquire (&device->intel.base.base); if (unlikely (status)) @@ -1436,7 +1436,7 @@ _upload_image_inplace (i915_surface_t *surface, } device = i915_device (surface); - bo = to_intel_bo (surface->intel.drm.bo); + bo = i915_surface_get_bo (surface); if (bo->exec != NULL || ! intel_bo_is_inactive (&device->intel, bo)) { intel_bo_t *new_bo; cairo_bool_t need_clear = FALSE; @@ -1658,7 +1658,7 @@ i915_surface_clear (i915_surface_t *dst) { i915_device_t *device; cairo_status_t status; - intel_bo_t *bo_array[1] = { to_intel_bo (dst->intel.drm.bo) }; + intel_bo_t *bo_array[1] = { i915_surface_get_bo (dst) }; device = i915_device (dst); status = cairo_device_acquire (&device->intel.base.base); @@ -1876,7 +1876,7 @@ i915_surface_fill_with_alpha (void *abstract_dst, cairo_clip_t *clip, double opacity) { - i915_surface_t *dst = abstract_dst; + i915_surface_t *dst = _cairo_abstract_surface_cast_i915 (abstract_dst); cairo_composite_rectangles_t extents; composite_polygon_info_t info; cairo_box_t boxes_stack[32], *clip_boxes = boxes_stack; @@ -2472,7 +2472,7 @@ i915_surface_create_internal (cairo_drm_device_t *base_dev, } size = stride * height; - bo = intel_bo_create (to_intel_device (&base_dev->base), + bo = intel_bo_create (_cairo_drm_device_cast_intel (base_dev), i915_tiling_size (tiling, size), size, gpu_target, tiling, stride); if (bo == NULL) { @@ -2552,15 +2552,15 @@ i915_surface_create_for_name (cairo_drm_device_t *base_dev, surface->map1 = (surface->intel.drm.stride/4 - 1) << MS4_PITCH_SHIFT; surface->intel.drm.bo = - &intel_bo_create_for_name (to_intel_device (&base_dev->base), + &intel_bo_create_for_name (_cairo_drm_device_cast_intel (base_dev), name)->base; if (unlikely (surface->intel.drm.bo == NULL)) { free (surface); return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } - to_intel_bo (surface->intel.drm.bo)->stride = stride; + i915_surface_get_bo (surface)->stride = stride; - surface->map0 |= MS3_tiling (to_intel_bo (surface->intel.drm.bo)->tiling); + surface->map0 |= MS3_tiling (i915_surface_get_bo (surface)->tiling); } return &surface->intel.drm.base; @@ -2646,7 +2646,7 @@ i915_surface_create_from_cacheable_image_internal (i915_device_t *device, return surface; status = intel_bo_put_image (&device->intel, - to_intel_bo (surface->intel.drm.bo), + i915_surface_get_bo (surface), image, 0, 0, width, height, @@ -2794,14 +2794,14 @@ i915_surface_create_from_cacheable_image (cairo_drm_device_t *device, static cairo_status_t i915_surface_enable_scan_out (void *abstract_surface) { - i915_surface_t *surface = abstract_surface; + i915_surface_t *surface = _cairo_abstract_surface_cast_i915 (abstract_surface); intel_bo_t *bo; cairo_status_t status; if (unlikely (surface->intel.drm.bo == NULL)) return _cairo_error (CAIRO_STATUS_INVALID_SIZE); - bo = to_intel_bo (surface->intel.drm.bo); + bo = i915_surface_get_bo (surface); if (bo->tiling == I915_TILING_Y) { status = i915_surface_batch_flush (surface); if (unlikely (status)) @@ -2853,7 +2853,7 @@ i915_device_throttle (cairo_drm_device_t *device) static void i915_device_destroy (void *data) { - i915_device_t *device = data; + i915_device_t *device = _cairo_device_cast_i915 (data); if (device->last_vbo) intel_bo_destroy (&device->intel, device->last_vbo); diff --git a/src/drm/cairo-drm-i965-glyphs.c b/src/drm/cairo-drm-i965-glyphs.c index c66a63d..0ae52c7 100644 --- a/src/drm/cairo-drm-i965-glyphs.c +++ b/src/drm/cairo-drm-i965-glyphs.c @@ -157,7 +157,7 @@ i965_surface_mask_internal (i965_surface_t *dst, 1. / mask->intel.drm.width, 1. / mask->intel.drm.height); - shader.mask.base.bo = to_intel_bo (mask->intel.drm.bo); + shader.mask.base.bo = i965_surface_get_bo (mask); shader.mask.base.format = mask->intel.drm.format; shader.mask.base.width = mask->intel.drm.width; shader.mask.base.height = mask->intel.drm.height; diff --git a/src/drm/cairo-drm-i965-private.h b/src/drm/cairo-drm-i965-private.h index 79568a6..e4cf28a 100644 --- a/src/drm/cairo-drm-i965-private.h +++ b/src/drm/cairo-drm-i965-private.h @@ -315,6 +315,33 @@ struct i965_surface { uint32_t offset; }; +static inline i965_surface_t* +cairo_abstract_surface_cast_i965 (cairo_surface_t *surface) +{ + return cairo_container_of ( + cairo_abstract_surface_cast_intel (surface), + i965_surface_t, + intel); +} + +static inline i965_device_t * +_cairo_intel_device_cast_i965 (intel_device_t *device) +{ + return container_of (device, intel_device_t, intel); +} + +static inline i965_device_t * +_cairo_device_cast_i965 (void *device) +{ + return _cairo_intel_device_cast_i965 (_cairo_device_cast_intel (device) ); +} + +static inline intel_bo_t * +i965_surface_get_bo (const i965_surface_t *surface) +{ + return _cairo_intel_surface_get_bo (&(surface->intel)); +} + struct i965_pending_relocation { uint32_t offset; uint32_t read_domains; diff --git a/src/drm/cairo-drm-i965-shader.c b/src/drm/cairo-drm-i965-shader.c index eed5f5f..eb8ea00 100644 --- a/src/drm/cairo-drm-i965-shader.c +++ b/src/drm/cairo-drm-i965-shader.c @@ -264,7 +264,7 @@ i965_surface_clone (i965_device_t *device, return clone->intel.drm.base.status; status = intel_bo_put_image (&device->intel, - to_intel_bo (clone->intel.drm.bo), + _cairo_intel_surface_get_bo (&(clone->intel)), image, 0, 0, image->width, image->height, @@ -308,8 +308,8 @@ i965_surface_clone_subimage (i965_device_t *device, if (unlikely (clone->intel.drm.base.status)) return clone->intel.drm.base.status; - status = intel_bo_put_image (to_intel_device (clone->intel.drm.base.device), - to_intel_bo (clone->intel.drm.bo), + status = intel_bo_put_image (_cairo_intel_surface_get_device (&(clone->intel)), + _cairo_intel_surface_get_bo (&(clone->intel.drm.bo)), image, extents->x, extents->y, extents->width, extents->height, @@ -420,12 +420,12 @@ i965_shader_acquire_surface (i965_shader_t *shader, return status; } - if (to_intel_bo (s->intel.drm.bo)->batch_write_domain) + if (_cairo_intel_surface_get_bo (&(s->intel))->batch_write_domain) i965_pipelined_flush (i965_device (s)); src->type.fragment = FS_SURFACE; - src->base.bo = to_intel_bo (s->intel.drm.bo); + src->base.bo = i965_surface_get_bo (s); src->base.format = s->intel.drm.format; src->base.content = s->intel.drm.base.content; src->base.width = sub->extents.width; @@ -472,7 +472,7 @@ i965_shader_acquire_surface (i965_shader_t *shader, i965_pipelined_flush (i965_device (s)); src->type.fragment = FS_SURFACE; - src->base.bo = to_intel_bo (clone->intel.drm.bo); + src->base.bo = i965_surface_get_bo (clone); src->base.format = clone->intel.drm.format; src->base.content = clone->intel.drm.base.content; src->base.width = clone->intel.drm.width; @@ -494,12 +494,12 @@ i965_shader_acquire_surface (i965_shader_t *shader, return status; } - if (to_intel_bo (s->intel.drm.bo)->batch_write_domain) + if (i965_surface_get_bo (s)->batch_write_domain) i965_pipelined_flush (i965_device (s)); src->type.fragment = FS_SURFACE; - src->base.bo = to_intel_bo (s->intel.drm.bo); + src->base.bo = i965_surface_get_bo (s); src->base.format = s->intel.drm.format; src->base.content = s->intel.drm.base.content; src->base.width = s->intel.drm.width; @@ -536,7 +536,7 @@ i965_shader_acquire_surface (i965_shader_t *shader, i965_pipelined_flush (i965_device (s)); src->type.fragment = FS_SURFACE; - src->base.bo = to_intel_bo (clone->intel.drm.bo); + src->base.bo = i965_surface_get_bo (clone); src->base.format = clone->intel.drm.format; src->base.content = clone->intel.drm.base.content; src->base.width = clone->intel.drm.width; @@ -562,7 +562,7 @@ i965_shader_acquire_surface (i965_shader_t *shader, shader->target->intel.drm.base.backend); if (s != NULL) { i965_device_t *device = i965_device (shader->target); - intel_bo_t *bo = to_intel_bo (s->intel.drm.bo); + intel_bo_t *bo = i965_surface_get_bo (s); if (bo->purgeable && ! intel_bo_madvise (&device->intel, bo, I915_MADV_WILLNEED)) @@ -599,12 +599,12 @@ i965_shader_acquire_surface (i965_shader_t *shader, return status; /* XXX? */ - //intel_bo_mark_purgeable (to_intel_bo (s->intel.drm.bo), TRUE); + //intel_bo_mark_purgeable (i965_surface_get_bo (s), TRUE); } src->type.fragment = FS_SURFACE; - src->base.bo = to_intel_bo (s->intel.drm.bo); + src->base.bo = i965_surface_get_bo (s); src->base.content = s->intel.drm.base.content; src->base.format = s->intel.drm.format; src->base.width = s->intel.drm.width; @@ -741,7 +741,7 @@ i965_shader_set_clip (i965_shader_t *shader, assert (clip_surface->type == CAIRO_SURFACE_TYPE_DRM); s = (i965_surface_t *) clip_surface; - if (to_intel_bo (s->intel.drm.bo)->batch_write_domain) + if (i965_surface_get_bo (s-)->batch_write_domain) i965_pipelined_flush (i965_device (s)); channel = &shader->clip; @@ -749,7 +749,7 @@ i965_shader_set_clip (i965_shader_t *shader, channel->type.vertex = VS_NONE; channel->type.fragment = FS_SURFACE; - channel->base.bo = to_intel_bo (s->intel.drm.bo); + channel->base.bo = i965_surface_get_bo (s); channel->base.content = CAIRO_CONTENT_ALPHA; channel->base.format = CAIRO_FORMAT_A8; channel->base.width = s->intel.drm.width; @@ -774,25 +774,25 @@ i965_shader_check_aperture (i965_shader_t *shader, uint32_t size = device->exec.gtt_size; if (shader->target != device->target) { - const intel_bo_t *bo = to_intel_bo (shader->target->intel.drm.bo); + const intel_bo_t *bo = i965_surface_get_bo (shader->target); if (bo->exec == NULL) size += bo->base.size; } if (shader->source.base.bo != NULL && shader->source.base.bo != device->source) { - const intel_bo_t *bo = to_intel_bo (shader->target->intel.drm.bo); + const intel_bo_t *bo = i965_surface_get_bo (shader->target); if (bo->exec == NULL) size += bo->base.size; } if (shader->mask.base.bo != NULL && shader->mask.base.bo != device->mask) { - const intel_bo_t *bo = to_intel_bo (shader->target->intel.drm.bo); + const intel_bo_t *bo = i965_surface_get_bo (shader->target); if (bo->exec == NULL) size += bo->base.size; } if (shader->clip.base.bo != NULL && shader->clip.base.bo != device->clip) { - const intel_bo_t *bo = to_intel_bo (shader->target->intel.drm.bo); + const intel_bo_t *bo = i965_surface_get_bo (shader->target); if (bo->exec == NULL) size += bo->base.size; } @@ -832,7 +832,7 @@ i965_shader_setup_dst (i965_shader_t *shader) if (unlikely (clone->intel.drm.base.status)) return clone->intel.drm.base.status; - if (to_intel_bo (s->intel.drm.bo)->batch_write_domain) + if (i965_surface_get_bo (s)->batch_write_domain) i965_pipelined_flush (i965_device (s)); channel = &shader->dst; @@ -842,7 +842,7 @@ i965_shader_setup_dst (i965_shader_t *shader) channel->type.pattern = PATTERN_SURFACE; /* swap buffer objects */ - channel->base.bo = to_intel_bo (s->intel.drm.bo); + channel->base.bo = i965_surface_get_bo (s); s->intel.drm.bo = ((cairo_drm_surface_t *) clone)->bo; ((cairo_drm_surface_t *) clone)->bo = &channel->base.bo->base; @@ -1426,7 +1426,7 @@ create_wm_kernel (i965_device_t *device, brw_compile_init (&compile, device->is_g4x); if (key.entry.hash == FS_CONSTANT && - to_intel_bo (shader->target->intel.drm.bo)->tiling) + i965_surface_get_bo (shader->target)->tiling) { struct brw_instruction *insn; @@ -2207,7 +2207,7 @@ emit_binding_table (i965_device_t *device, shader->target->stream = device->surface.serial; shader->target->offset = emit_surface_state (device, TRUE, - to_intel_bo (shader->target->intel.drm.bo), + i965_surface_get_bo (shader->target), shader->target->intel.drm.format, shader->target->intel.drm.width, shader->target->intel.drm.height, diff --git a/src/drm/cairo-drm-i965-surface.c b/src/drm/cairo-drm-i965-surface.c index 04050ef..e6ce1f1 100644 --- a/src/drm/cairo-drm-i965-surface.c +++ b/src/drm/cairo-drm-i965-surface.c @@ -707,7 +707,7 @@ i965_surface_flush (void *abstract_surface, unsigned flags) /* Forgo flushing on finish as the user cannot access the surface directly. */ if (! surface->intel.drm.base.finished && - to_intel_bo (surface->intel.drm.bo)->exec != NULL) + i965_surface_get_bo (surface)->exec != NULL) { status = cairo_device_acquire (surface->intel.drm.base.device); if (likely (status == CAIRO_STATUS_SUCCESS)) { @@ -1094,7 +1094,7 @@ i965_surface_paint (void *abstract_dst, const cairo_pattern_t *source, cairo_clip_t *clip) { - i965_surface_t *dst = abstract_dst; + i965_surface_t *dst = cairo_abstract_surface_cast_i965(abstract_dst); cairo_composite_rectangles_t extents; cairo_boxes_t boxes; cairo_box_t *clip_boxes = boxes.boxes_embedded; @@ -1588,7 +1588,7 @@ i965_surface_create_internal (cairo_drm_device_t *base_dev, assert (height <= I965_MAX_SIZE); size = stride * height; - bo = intel_bo_create (to_intel_device (&base_dev->base), + bo = intel_bo_create (_cairo_drm_device_cast_intel (base_dev), size, size, gpu_target, tiling, stride); if (bo == NULL) { @@ -1685,7 +1685,7 @@ i965_surface_enable_scan_out (void *abstract_surface) if (unlikely (surface->intel.drm.bo == NULL)) return _cairo_error (CAIRO_STATUS_INVALID_SIZE); - bo = to_intel_bo (surface->intel.drm.bo); + bo = i965_surface_get_bo (surface); if (bo->tiling != I915_TILING_X) { i965_device_t *device = i965_device (surface); cairo_surface_pattern_t pattern; @@ -1720,7 +1720,7 @@ i965_surface_enable_scan_out (void *abstract_surface) /* swap buffer objects */ surface->intel.drm.bo = ((cairo_drm_surface_t *) clone)->bo; ((cairo_drm_surface_t *) clone)->bo = &bo->base; - bo = to_intel_bo (surface->intel.drm.bo); + bo = i965_surface_get_bo (surface); cairo_surface_destroy (clone); } @@ -1768,7 +1768,7 @@ _i965_device_throttle (cairo_drm_device_t *device) static void _i965_device_destroy (void *base) { - i965_device_t *device = base; + i965_device_t *device = _cairo_device_cast_i965 (base); i965_device_reset (device); i965_general_state_reset (device); diff --git a/src/drm/cairo-drm-intel-private.h b/src/drm/cairo-drm-intel-private.h index f9aed37..1bb30c6 100644 --- a/src/drm/cairo-drm-intel-private.h +++ b/src/drm/cairo-drm-intel-private.h @@ -182,6 +182,15 @@ typedef struct _intel_surface { cairo_cache_entry_t snapshot_cache_entry; } intel_surface_t; +static inline intel_surface_t* +cairo_abstract_surface_cast_intel(cairo_surface_t* surface) +{ + return cairo_container_of( + _cairo_abstract_surface_cast_drm(surface), + intel_surface_t, + drm); +} + typedef void (*intel_reset_context_func_t) (void *device); typedef struct _intel_device { @@ -213,21 +222,59 @@ typedef struct _intel_device { } intel_device_t; static inline intel_device_t * -to_intel_device (cairo_device_t *base) +_cairo_drm_device_cast_intel (cairo_drm_device_t *device) +{ + return cairo_container_of ( + device, + intel_device_t, + base); +} + +static inline const intel_device_t * +_cairo_drm_device_cast_intel_const (const cairo_drm_device_t *device) +{ + return cairo_container_of ( + device, + const intel_device_t, + base); +} + +static inline intel_device_t * +_cairo_device_cast_intel (cairo_device_t *device) +{ + return _cairo_drm_device_cast_intel ( + _cairo_device_cast_drm (device)); +} + +static inline const intel_device_t * +_cairo_device_cast_intel_const (const cairo_device_t *device) +{ + return _cairo_drm_device_cast_intel_const ( + _cairo_device_cast_drm_const (device)); +} + +static inline intel_bo_t * +_cairo_drm_bo_cast_intel (cairo_drm_bo_t *bo) +{ + return cairo_container_of (bo, intel_bo_t, base); +} + +static inline intel_device_t * +_cairo_intel_surface_get_device (intel_surface_t *surface) { - return (intel_device_t *) base; + return _cairo_device_cast_intel (surface->drm.base.device); } static inline intel_bo_t * -to_intel_bo (cairo_drm_bo_t *base) +_cairo_intel_surface_get_bo (const intel_surface_t *surface) { - return (intel_bo_t *) base; + return _cairo_drm_bo_cast_intel (surface->drm.bo); } static inline intel_bo_t * intel_bo_reference (intel_bo_t *bo) { - return to_intel_bo (cairo_drm_bo_reference (&bo->base)); + return _cairo_drm_bo_cast_intel (cairo_drm_bo_reference (&bo->base)); } cairo_private cairo_bool_t diff --git a/src/drm/cairo-drm-intel-surface.c b/src/drm/cairo-drm-intel-surface.c index 88f5b8f..f69ae46 100644 --- a/src/drm/cairo-drm-intel-surface.c +++ b/src/drm/cairo-drm-intel-surface.c @@ -52,10 +52,11 @@ intel_surface_create_similar (void *abstract_surface, cairo_status_t intel_surface_finish (void *abstract_surface) { - intel_surface_t *surface = abstract_surface; + intel_surface_t *surface = cairo_abstract_surface_cast_intel(abstract_surface); + + intel_bo_in_flight_add (_cairo_intel_surface_get_device (surface), + _cairo_intel_surface_get_bo (surface)); - intel_bo_in_flight_add (to_intel_device (surface->drm.base.device), - to_intel_bo (surface->drm.bo)); return _cairo_drm_surface_finish (&surface->drm); } @@ -71,7 +72,7 @@ intel_surface_acquire_source_image (void *abstract_surface, cairo_image_surface_t **image_out, void **image_extra) { - intel_surface_t *surface = abstract_surface; + intel_surface_t *surface = cairo_abstract_surface_cast_intel(abstract_surface); cairo_surface_t *image; cairo_status_t status; void *ptr; @@ -92,8 +93,9 @@ intel_surface_acquire_source_image (void *abstract_surface, return status; } - ptr = intel_bo_map (to_intel_device (surface->drm.base.device), - to_intel_bo (surface->drm.bo)); + ptr = intel_bo_map (_cairo_intel_surface_get_device (surface), + _cairo_intel_surface_get_bo (surface)); + if (unlikely (ptr == NULL)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); @@ -124,7 +126,7 @@ intel_surface_release_source_image (void *abstract_surface, cairo_surface_t * intel_surface_map_to_image (void *abstract_surface) { - intel_surface_t *surface = abstract_surface; + intel_surface_t *surface = cairo_abstract_surface_cast_intel(abstract_surface); if (surface->drm.fallback == NULL) { cairo_surface_t *image; @@ -137,8 +139,9 @@ intel_surface_map_to_image (void *abstract_surface) return _cairo_surface_create_in_error (status); } - ptr = intel_bo_map (to_intel_device (surface->drm.base.device), - to_intel_bo (surface->drm.bo)); + ptr = intel_bo_map (_cairo_intel_surface_get_device (surface), + _cairo_intel_surface_get_bo (surface)); + if (unlikely (ptr == NULL)) return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); @@ -159,7 +162,7 @@ intel_surface_map_to_image (void *abstract_surface) cairo_status_t intel_surface_flush (void *abstract_surface, unsigned flags) { - intel_surface_t *surface = abstract_surface; + intel_surface_t *surface = cairo_abstract_surface_cast_intel(abstract_surface); cairo_status_t status; if (flags) @@ -322,7 +325,7 @@ intel_surface_create (cairo_drm_device_t *device, height = (height + 1) & -2; surface->drm.stride = cairo_format_stride_for_width (surface->drm.format, width); - surface->drm.bo = &intel_bo_create (to_intel_device (&device->base), + surface->drm.bo = &intel_bo_create (_cairo_drm_device_cast_intel (device), surface->drm.stride * height, surface->drm.stride * height, TRUE, I915_TILING_NONE, surface->drm.stride)->base; @@ -370,8 +373,9 @@ intel_surface_create_for_name (cairo_drm_device_t *device, if (width && height) { surface->drm.stride = stride; - surface->drm.bo = &intel_bo_create_for_name (to_intel_device (&device->base), + surface->drm.bo = &intel_bo_create_for_name (_cairo_drm_device_cast_intel (device), name)->base; + if (unlikely (surface->drm.bo == NULL)) { status = _cairo_drm_surface_finish (&surface->drm); free (surface); @@ -386,12 +390,12 @@ intel_surface_create_for_name (cairo_drm_device_t *device, static cairo_status_t intel_surface_enable_scan_out (void *abstract_surface) { - intel_surface_t *surface = abstract_surface; + intel_surface_t *surface = cairo_abstract_surface_cast_intel(abstract_surface); if (unlikely (surface->drm.bo == NULL)) return _cairo_error (CAIRO_STATUS_INVALID_SIZE); - to_intel_bo (surface->drm.bo)->tiling = I915_TILING_X; + _cairo_intel_surface_get_bo (surface)->tiling = I915_TILING_X; return CAIRO_STATUS_SUCCESS; } @@ -399,7 +403,7 @@ intel_surface_enable_scan_out (void *abstract_surface) static cairo_int_status_t intel_device_throttle (cairo_drm_device_t *device) { - intel_throttle (to_intel_device (&device->base)); + intel_throttle (_cairo_drm_device_cast_intel (device)); return CAIRO_STATUS_SUCCESS; } diff --git a/src/drm/cairo-drm-intel.c b/src/drm/cairo-drm-intel.c index 1dfd998..1bde957 100644 --- a/src/drm/cairo-drm-intel.c +++ b/src/drm/cairo-drm-intel.c @@ -491,8 +491,8 @@ FAIL: static void intel_bo_release (void *_dev, void *_bo) { - intel_device_t *device = _dev; - intel_bo_t *bo = _bo; + intel_device_t *device = _cairo_drm_device_cast_intel(_dev); + intel_bo_t *bo = _cairo_drm_bo_cast_intel(_bo); if (bo->virtual != NULL) intel_bo_unmap (bo); diff --git a/src/drm/cairo-drm-private.h b/src/drm/cairo-drm-private.h index 4ba8f5b..e2d2cea 100644 --- a/src/drm/cairo-drm-private.h +++ b/src/drm/cairo-drm-private.h @@ -142,6 +142,46 @@ typedef struct _cairo_drm_surface { uint32_t map_count; } cairo_drm_surface_t; +/* cast from abstract void* pointer */ +static inline cairo_drm_device_t* +_cairo_abstract_device_cast_drm(cairo_device_t* dev) +{ + return cairo_container_of( + dev, + cairo_drm_device_t, + base); +} + +static inline cairo_drm_surface_t* +_cairo_abstract_surface_cast_drm(cairo_surface_t* surface) +{ + return cairo_container_of(surface, cairo_drm_surface_t, base); +} + +static inline cairo_drm_surface_t* +_cairo_surface_cast_drm (cairo_surface_t* surface) +{ + return cairo_container_of (surface, cairo_drm_surface_t, base); +} + +static inline const cairo_drm_surface_t* +_cairo_surface_cast_drm_const (const cairo_surface_t* surface) +{ + return cairo_container_of (surface, const cairo_drm_surface_t, base); +} + +static inline cairo_drm_device_t* +_cairo_device_cast_drm(cairo_device_t *device) +{ + return cairo_container_of (device, cairo_drm_device_t, base); +} + +static inline const cairo_drm_device_t* +_cairo_device_cast_drm_const(const cairo_device_t *device) +{ + return cairo_container_of (device, const cairo_drm_device_t, base); +} + static inline cairo_drm_bo_t * cairo_drm_bo_reference (cairo_drm_bo_t *bo) { @@ -149,6 +189,12 @@ cairo_drm_bo_reference (cairo_drm_bo_t *bo) return bo; } +static inline cairo_drm_device_t * +_cairo_drm_surface_get_device (cairo_drm_surface_t *surface) +{ + return _cairo_device_cast_drm(surface->base.device); +} + static cairo_always_inline void cairo_drm_bo_destroy (cairo_device_t *abstract_device, cairo_drm_bo_t *bo) diff --git a/src/drm/cairo-drm-radeon-private.h b/src/drm/cairo-drm-radeon-private.h index 0768528..107f55b 100644 --- a/src/drm/cairo-drm-radeon-private.h +++ b/src/drm/cairo-drm-radeon-private.h @@ -53,6 +53,102 @@ typedef struct _radeon_device { uint64_t gart_limit; } radeon_device_t; +typedef struct _radeon_surface { + cairo_drm_surface_t base; +} radeon_surface_t; + +/* cast void* to radeon_device_t* */ +static inline radeon_surface_t * +_cairo_abstract_surface_cast_radeon (cairo_surface_t *surface) +{ + return cairo_container_of ( + _cairo_abstract_surface_cast_drm (surface), + radeon_surface_t, + base); +} + +/* cast cairo_drm_device_t* to radeon_device_t* */ +static inline radeon_surface_t * +_cairo_drm_surface_cast_radeon (cairo_drm_surface_t *surface) +{ + return cairo_container_of (surface, radeon_surface_t, base); +} + +/* cast const cairo_drm_device_t* to const radeon_device_t* */ +static inline const radeon_surface_t * +_cairo_drm_surface_cast_radeon_const (const cairo_drm_surface_t *surface) +{ + return cairo_container_of (surface, const radeon_surface_t, base); +} + +/* cast cairo_device_t to radeon_device_t */ +static inline radeon_surface_t * +_cairo_surface_cast_radeon (cairo_surface_t *surface) +{ + return _cairo_drm_surface_cast_radeon ( + _cairo_surface_cast_drm (surface)); +} + +/* cast const cairo_device_t* to const radeon_device_t* */ +static inline const radeon_surface_t * +_cairo_surface_cast_radeon_cast (const cairo_surface_t *surface) +{ + return _cairo_drm_surface_cast_radeon_const ( + _cairo_surface_cast_drm_const (surface)); +} + +static inline radeon_device_t * +_cairo_drm_device_cast_radeon (cairo_drm_device_t *device) +{ + return cairo_container_of (device, radeon_device_t, base); +} + +static inline const radeon_device_t * +_cairo_drm_device_cast_radeon_const (const cairo_drm_device_t *device) +{ + return cairo_container_of (device, const radeon_device_t, base); +} + +static inline radeon_device_t * +_cairo_device_cast_radeon (cairo_device_t *device) +{ + return _cairo_drm_device_cast_radeon ( + _cairo_device_cast_drm (device)); +} + +static inline const radeon_device_t * +_cairo_device_cast_radeon_const (const cairo_device_t *device) +{ + return _cairo_drm_device_cast_radeon_const ( + _cairo_device_cast_drm_const (device)); +} + +static inline radeon_bo_t * +_cairo_drm_bo_cast_radeon (cairo_drm_bo_t *bo) +{ + return cairo_container_of (bo, radeon_bo_t, base); +} + +static inline const radeon_bo_t * +_cairo_drm_bo_cast_radeon_const (const cairo_drm_bo_t *bo) +{ + return cairo_container_of (bo, const radeon_bo_t, base); +} + +/* get radeon device from radeon surface */ +static inline radeon_device_t * +_cairo_radeon_surface_get_device (const radeon_surface_t *surface) +{ + return _cairo_device_cast_radeon (surface->base.base.device); +} + +/* get radeon bo from radeon surface */ +static inline radeon_bo_t * +_cairo_radeon_surface_get_bo (const radeon_surface_t *surface) +{ + return _cairo_drm_bo_cast_radeon (surface->base.bo); +} + cairo_private cairo_status_t radeon_device_init (radeon_device_t *device, int fd); diff --git a/src/drm/cairo-drm-radeon-surface.c b/src/drm/cairo-drm-radeon-surface.c index 4f21962..f01922f 100644 --- a/src/drm/cairo-drm-radeon-surface.c +++ b/src/drm/cairo-drm-radeon-surface.c @@ -43,22 +43,6 @@ #define MAX_SIZE 2048 -typedef struct _radeon_surface { - cairo_drm_surface_t base; -} radeon_surface_t; - -static inline radeon_device_t * -to_radeon_device (cairo_device_t *device) -{ - return (radeon_device_t *) device; -} - -static inline radeon_bo_t * -to_radeon_bo (cairo_drm_bo_t *bo) -{ - return (radeon_bo_t *) bo; -} - static cairo_surface_t * radeon_surface_create_similar (void *abstract_surface, cairo_content_t content, @@ -104,8 +88,8 @@ radeon_surface_acquire_source_image (void *abstract_surface, return status; } - image = radeon_bo_get_image (to_radeon_device (surface->base.base.device), - to_radeon_bo (surface->base.bo), + image = radeon_bo_get_image (_cairo_radeon_surface_get_device (surface), + _cairo_radeon_surface_get_bo (surface), &surface->base); status = image->status; if (unlikely (status)) @@ -141,8 +125,9 @@ radeon_surface_map_to_image (radeon_surface_t *surface) return _cairo_surface_create_in_error (status); } - ptr = radeon_bo_map (to_radeon_device (surface->base.base.device), - to_radeon_bo (surface->base.bo)); + ptr = radeon_bo_map (_cairo_radeon_surface_get_device (surface), + _cairo_radeon_surface_get_bo (surface)); + if (unlikely (ptr == NULL)) return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY); @@ -166,7 +151,7 @@ static cairo_status_t radeon_surface_flush (void *abstract_surface, unsigned flags) { - radeon_surface_t *surface = abstract_surface; + radeon_surface_t *surface = _cairo_surface_cast_radeon(abstract_surface); cairo_status_t status; if (flags) @@ -325,7 +310,7 @@ radeon_surface_create_internal (cairo_drm_device_t *device, surface->base.stride = cairo_format_stride_for_width (surface->base.format, width); - surface->base.bo = radeon_bo_create (to_radeon_device (&device->base), + surface->base.bo = radeon_bo_create (_cairo_drm_device_cast_radeon (device), surface->base.stride * height, RADEON_GEM_DOMAIN_GTT); @@ -392,7 +377,7 @@ radeon_surface_create_for_name (cairo_drm_device_t *device, if (width && height) { surface->base.stride = stride; - surface->base.bo = radeon_bo_create_for_name (to_radeon_device (&device->base), + surface->base.bo = radeon_bo_create_for_name (_cairo_drm_device_cast_radeon(device), name); if (unlikely (surface->base.bo == NULL)) { @@ -408,7 +393,7 @@ radeon_surface_create_for_name (cairo_drm_device_t *device, static void radeon_device_destroy (void *data) { - radeon_device_t *device = data; + radeon_device_t *device = _cairo_device_cast_radeon (data); radeon_device_fini (device); diff --git a/src/drm/cairo-drm-radeon.c b/src/drm/cairo-drm-radeon.c index babe826..37601c3 100644 --- a/src/drm/cairo-drm-radeon.c +++ b/src/drm/cairo-drm-radeon.c @@ -254,8 +254,8 @@ radeon_bo_create_for_name (radeon_device_t *device, static void radeon_bo_release (void *_dev, void *_bo) { - radeon_device_t *device = _dev; - radeon_bo_t *bo = _bo; + radeon_device_t *device = _cairo_device_cast_radeon(_dev); + radeon_bo_t *bo = _cairo_drm_bo_cast_radeon(_bo); _cairo_drm_bo_close (&device->base, &bo->base); _cairo_freepool_free (&device->bo_pool, bo); @@ -270,10 +270,10 @@ radeon_bo_get_image (const radeon_device_t *device, uint8_t *dst; int size, row; - image = (cairo_image_surface_t *) + image = _cairo_surface_cast_image ( cairo_image_surface_create (surface->format, surface->width, - surface->height); + surface->height)); if (unlikely (image->base.status)) return &image->base; diff --git a/src/drm/cairo-drm-surface.c b/src/drm/cairo-drm-surface.c index 8c4dd0e..ee514dd 100644 --- a/src/drm/cairo-drm-surface.c +++ b/src/drm/cairo-drm-surface.c @@ -76,7 +76,7 @@ cairo_bool_t _cairo_drm_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { - cairo_drm_surface_t *surface = abstract_surface; + cairo_drm_surface_t *surface = _cairo_abstract_surface_cast_drm(abstract_surface); rectangle->x = 0; rectangle->y = 0; @@ -233,7 +233,7 @@ cairo_drm_surface_get_handle (cairo_surface_t *abstract_surface) cairo_int_status_t _cairo_drm_surface_flink (void *abstract_surface) { - cairo_drm_surface_t *surface = abstract_surface; + cairo_drm_surface_t *surface = _cairo_abstract_surface_cast_drm(abstract_surface); return _cairo_drm_bo_flink ((cairo_drm_device_t *) surface->base.device, surface->bo); diff --git a/src/drm/cairo-drm.c b/src/drm/cairo-drm.c index ad8c827..3f79d35 100644 --- a/src/drm/cairo-drm.c +++ b/src/drm/cairo-drm.c @@ -63,7 +63,7 @@ get_udev_property(struct udev_device *device, const char *name) static void _device_flush (void *abstract_device) { - cairo_drm_device_t *device = abstract_device; + cairo_drm_device_t *device = _cairo_abstract_device_cast_drm(abstract_device); device->device.flush (device); } @@ -71,7 +71,7 @@ _device_flush (void *abstract_device) static void _device_finish (void *abstract_device) { - cairo_drm_device_t *device = abstract_device; + cairo_drm_device_t *device = _cairo_abstract_device_cast_drm(abstract_device); CAIRO_MUTEX_LOCK (_cairo_drm_device_mutex); if (device->prev != NULL) @@ -93,7 +93,7 @@ _device_finish (void *abstract_device) static void _device_destroy (void *abstract_device) { - cairo_drm_device_t *device = abstract_device; + cairo_drm_device_t *device = _cairo_abstract_device_cast_drm(abstract_device); device->device.destroy (device); } @@ -344,7 +344,7 @@ _cairo_drm_device_reset_static_data (void) int cairo_drm_device_get_fd (cairo_device_t *abstract_device) { - cairo_drm_device_t *device = (cairo_drm_device_t *) abstract_device; + cairo_drm_device_t *device = _cairo_abstract_device_cast_drm(abstract_device); if (device->base.status) return -1; @@ -362,7 +362,7 @@ _cairo_drm_device_fini (cairo_drm_device_t *device) void cairo_drm_device_throttle (cairo_device_t *abstract_device) { - cairo_drm_device_t *device = (cairo_drm_device_t *) abstract_device; + cairo_drm_device_t *device = _cairo_abstract_device_cast_drm(abstract_device); cairo_status_t status; if (unlikely (device->base.status)) -- 2.6.4.442.g545299f -- cairo mailing list [email protected] http://lists.cairographics.org/mailman/listinfo/cairo