summaryrefslogtreecommitdiff
path: root/libcopybit
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2013-11-16 15:27:23 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2013-11-16 15:27:23 -0800
commit8bad3f9144400e94df2eca23db09c51a7d24eca5 (patch)
treebcb2c40918d35913f3dd4a41e010d6be311ce7ae /libcopybit
parent5b3c7130ed6cd6fe6a19a3b0816ef335ed0aad9e (diff)
parent943797c3615e978c5875723b134192092ef1f60b (diff)
downloaddisplay-8bad3f9144400e94df2eca23db09c51a7d24eca5.tar.gz
Merge "hwc/copybit: Add Color layer support in MDP Copybit composition."
Diffstat (limited to 'libcopybit')
-rw-r--r--libcopybit/copybit.cpp46
-rw-r--r--libcopybit/copybit.h15
-rw-r--r--libcopybit/copybit_c2d.cpp11
3 files changed, 72 insertions, 0 deletions
diff --git a/libcopybit/copybit.cpp b/libcopybit/copybit.cpp
index ff7dc4e7..b37eee08 100644
--- a/libcopybit/copybit.cpp
+++ b/libcopybit/copybit.cpp
@@ -556,6 +556,51 @@ static int finish_copybit(struct copybit_device_t *dev)
return 0;
}
+/** Fill the rect on dst with RGBA color **/
+static int fill_color(struct copybit_device_t *dev,
+ struct copybit_image_t const *dst,
+ struct copybit_rect_t const *rect,
+ uint32_t color)
+{
+ struct copybit_context_t* ctx = (struct copybit_context_t*)dev;
+ if (!ctx) {
+ ALOGE("%s: Invalid copybit context", __FUNCTION__);
+ return -EINVAL;
+ }
+
+ if (dst->w > MAX_DIMENSION || dst->h > MAX_DIMENSION) {
+ ALOGE("%s: Invalid DST w=%d h=%d", __FUNCTION__, dst->w, dst->h);
+ return -EINVAL;
+ }
+
+ if (rect->l < 0 || (uint32_t)(rect->r - rect->l) > dst->w ||
+ rect->t < 0 || (uint32_t)(rect->b - rect->t) > dst->h) {
+ ALOGE("%s: Invalid destination rect: l=%d t=%d r=%d b=%d",
+ __FUNCTION__, rect->l, rect->t, rect->r, rect->b);
+ return -EINVAL;
+ }
+
+ struct blitReq* list = &ctx->list;
+ mdp_blit_req* req = &list->req[list->count++];
+ set_infos(ctx, req, MDP_SOLID_FILL);
+ set_image(&req->src, dst);
+ set_image(&req->dst, dst);
+
+ req->dst_rect.x = rect->l;
+ req->dst_rect.y = rect->t;
+ req->dst_rect.w = rect->r - rect->l;
+ req->dst_rect.h = rect->b - rect->t;
+ req->src_rect = req->dst_rect;
+
+ req->const_color.r = (uint32_t)((color >> 0) & 0xff);
+ req->const_color.g = (uint32_t)((color >> 8) & 0xff);
+ req->const_color.b = (uint32_t)((color >> 16) & 0xff);
+ req->const_color.alpha = (uint32_t)((color >> 24) & 0xff);
+
+ int status = msm_copybit(ctx, list);
+ return status;
+}
+
/*****************************************************************************/
/** Close the copybit device */
@@ -606,6 +651,7 @@ static int open_copybit(const struct hw_module_t* module, const char* name,
ctx->device.set_sync = set_sync_copybit;
ctx->device.stretch = stretch_copybit;
ctx->device.finish = finish_copybit;
+ ctx->device.fill_color = fill_color;
ctx->device.flush_get_fence = flush_get_fence;
ctx->mAlpha = MDP_ALPHA_NOP;
ctx->mFlags = 0;
diff --git a/libcopybit/copybit.h b/libcopybit/copybit.h
index 13d78b5e..dbb89f0b 100644
--- a/libcopybit/copybit.h
+++ b/libcopybit/copybit.h
@@ -242,6 +242,21 @@ struct copybit_device_t {
struct copybit_rect_t const *src_rect,
struct copybit_region_t const *region);
+ /**
+ * Fill the rect on dst with RGBA color
+ *
+ * @param dev from open
+ * @param dst is destination image
+ * @param rect is destination rectangle
+ * @param color is RGBA color to fill
+ *
+ * @return 0 if successful
+ */
+ int (*fill_color)(struct copybit_device_t *dev,
+ struct copybit_image_t const *dst,
+ struct copybit_rect_t const *rect,
+ uint32_t color);
+
/**
* Execute the completion of the copybit draw operation.
*
diff --git a/libcopybit/copybit_c2d.cpp b/libcopybit/copybit_c2d.cpp
index 914bed7c..231bb2d3 100644
--- a/libcopybit/copybit_c2d.cpp
+++ b/libcopybit/copybit_c2d.cpp
@@ -1428,6 +1428,16 @@ static int blit_copybit(
return status;
}
+/** Fill the rect on dst with RGBA color **/
+static int fill_color(struct copybit_device_t *dev,
+ struct copybit_image_t const *dst,
+ struct copybit_rect_t const *rect,
+ uint32_t color)
+{
+ // TODO: Implement once c2d driver supports color fill
+ return -EINVAL;
+}
+
/*****************************************************************************/
static void clean_up(copybit_context_t* ctx)
@@ -1561,6 +1571,7 @@ static int open_copybit(const struct hw_module_t* module, const char* name,
ctx->device.finish = finish_copybit;
ctx->device.flush_get_fence = flush_get_fence_copybit;
ctx->device.clear = clear_copybit;
+ ctx->device.fill_color = fill_color;
/* Create RGB Surface */
surfDefinition.buffer = (void*)0xdddddddd;