diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2013-11-16 15:27:23 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2013-11-16 15:27:23 -0800 |
commit | 8bad3f9144400e94df2eca23db09c51a7d24eca5 (patch) | |
tree | bcb2c40918d35913f3dd4a41e010d6be311ce7ae /libcopybit | |
parent | 5b3c7130ed6cd6fe6a19a3b0816ef335ed0aad9e (diff) | |
parent | 943797c3615e978c5875723b134192092ef1f60b (diff) | |
download | display-8bad3f9144400e94df2eca23db09c51a7d24eca5.tar.gz |
Merge "hwc/copybit: Add Color layer support in MDP Copybit composition."
Diffstat (limited to 'libcopybit')
-rw-r--r-- | libcopybit/copybit.cpp | 46 | ||||
-rw-r--r-- | libcopybit/copybit.h | 15 | ||||
-rw-r--r-- | libcopybit/copybit_c2d.cpp | 11 |
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; |