summaryrefslogtreecommitdiffstats
path: root/gralloc_drm_intel.c
diff options
context:
space:
mode:
authorTapani Pälli <tapani.palli@intel.com>2013-01-18 15:01:43 +0200
committerTapani Pälli <tapani.palli@intel.com>2013-01-21 14:39:37 +0200
commita8f0334ef5706875f2c73a2690a2f1fc3e5fee27 (patch)
treed7d822a66b36a702ddf1943fd35549180f7c669f /gralloc_drm_intel.c
parent421d4ec03917d13cc4449832275ac3c25e00acf5 (diff)
downloadexternal_drm_gralloc-a8f0334ef5706875f2c73a2690a2f1fc3e5fee27.zip
external_drm_gralloc-a8f0334ef5706875f2c73a2690a2f1fc3e5fee27.tar.gz
external_drm_gralloc-a8f0334ef5706875f2c73a2690a2f1fc3e5fee27.tar.bz2
gralloc: implement yuv offset query as hw specific function
This patch reverts earlier cca14cfd... and introduces a new hw specific hook to query yuv components offsets which can vary between different hw, decoders, cameras etc. Change-Id: Ib60bc8ee28df7bc9425b6d7934294fe36fc55354 Depends-Change-Id: I1aa5368b21e588d5d711c1005fff2a5296e143a0 Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Diffstat (limited to 'gralloc_drm_intel.c')
-rw-r--r--gralloc_drm_intel.c47
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;
}