diff options
Diffstat (limited to 'gralloc_drm_intel.c')
-rw-r--r-- | gralloc_drm_intel.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/gralloc_drm_intel.c b/gralloc_drm_intel.c index 649c6ff..725334e 100644 --- a/gralloc_drm_intel.c +++ b/gralloc_drm_intel.c @@ -190,6 +190,52 @@ batch_init(struct intel_info *info) return ret; } +static void intel_resolve_format(struct gralloc_drm_drv_t *drv, + struct gralloc_drm_bo_t *bo, + uint32_t *pitches, uint32_t *offsets, uint32_t *handles) +{ + /* + * TODO - should take account hw specific padding, alignment + * for camera, video decoder etc. + */ + + struct intel_buffer *ib = (struct intel_buffer *) bo; + + memset(pitches, 0, 4 * sizeof(uint32_t)); + memset(offsets, 0, 4 * sizeof(uint32_t)); + memset(handles, 0, 4 * sizeof(uint32_t)); + + pitches[0] = ib->base.handle->stride; + handles[0] = ib->base.fb_handle; + + switch(ib->base.handle->format) { + case HAL_PIXEL_FORMAT_YV12: + + // U and V stride are half of Y plane + pitches[2] = pitches[0]/2; + pitches[1] = pitches[0]/2; + + // like I420 but U and V are in reverse order + offsets[2] = offsets[0] + + pitches[0] * ib->base.handle->height; + offsets[1] = offsets[2] + + pitches[2] * ib->base.handle->height/2; + + handles[1] = handles[2] = handles[0]; + break; + + case HAL_PIXEL_FORMAT_DRM_NV12: + + // U and V are interleaved in 2nd plane + pitches[1] = pitches[0]; + offsets[1] = offsets[0] + + pitches[0] * ib->base.handle->height; + + handles[1] = handles[0]; + break; + } +} + static void intel_copy(struct gralloc_drm_drv_t *drv, struct gralloc_drm_bo_t *dst, struct gralloc_drm_bo_t *src, @@ -593,6 +639,7 @@ struct gralloc_drm_drv_t *gralloc_drm_drv_create_for_intel(int fd) info->base.map = intel_map; info->base.unmap = intel_unmap; info->base.copy = intel_copy; + info->base.resolve_format = intel_resolve_format; return &info->base; } |