1 /*
2 * Copyright (C) 2010 The Android Open Source Project
3 * Copyright (C) 2012, The Linux Foundation. All rights reserved.
4 *
5 * Not a Contribution, Apache license notifications and license are
6 * retained for attribution purposes only.
7 *
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 */
20
21 #define HWC_FB_UPDATE 0
22 #include <gralloc_priv.h>
23 #include <fb_priv.h>
24 #include "hwc_fbupdate.h"
25 #include "external.h"
26
27 namespace qhwc {
28
29 namespace ovutils = overlay::utils;
30
31 //Static Members
32 bool FBUpdate::sModeOn[] = {false};
33 ovutils::eDest FBUpdate::sDest[] = {ovutils::OV_INVALID};
34
reset()35 void FBUpdate::reset() {
36 sModeOn[HWC_DISPLAY_PRIMARY] = false;
37 sModeOn[HWC_DISPLAY_EXTERNAL] = false;
38 sDest[HWC_DISPLAY_PRIMARY] = ovutils::OV_INVALID;
39 sDest[HWC_DISPLAY_EXTERNAL] = ovutils::OV_INVALID;
40 }
41
prepare(hwc_context_t * ctx,hwc_layer_1_t * fblayer,int dpy)42 bool FBUpdate::prepare(hwc_context_t *ctx, hwc_layer_1_t *fblayer, int dpy) {
43 if(!ctx->mMDP.hasOverlay) {
44 ALOGD_IF(HWC_FB_UPDATE, "%s, this hw doesnt support mirroring",
45 __FUNCTION__);
46 return false;
47 }
48
49 return (sModeOn[dpy] = configure(ctx, fblayer, dpy));
50
51 }
52
53 // Configure
configure(hwc_context_t * ctx,hwc_layer_1_t * layer,int dpy)54 bool FBUpdate::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, int dpy)
55 {
56 bool ret = false;
57 if (LIKELY(ctx->mOverlay)) {
58 overlay::Overlay& ov = *(ctx->mOverlay);
59 private_handle_t *hnd = (private_handle_t *)layer->handle;
60 if (!hnd) {
61 ALOGE("%s:NULL private handle for layer!", __FUNCTION__);
62 return false;
63 }
64 ovutils::Whf info(hnd->width, hnd->height, hnd->format, hnd->size);
65
66 //Request an RGB pipe
67 ovutils::eDest dest = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, dpy);
68 if(dest == ovutils::OV_INVALID) { //None available
69 return false;
70 }
71
72 sDest[dpy] = dest;
73
74 ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_FLAGS_NONE;
75 if(ctx->mSecureMode) {
76 ovutils::setMdpFlags(mdpFlags,
77 ovutils::OV_MDP_SECURE_OVERLAY_SESSION);
78 }
79
80 ovutils::PipeArgs parg(mdpFlags,
81 info,
82 ovutils::ZORDER_0,
83 ovutils::IS_FG_SET,
84 ovutils::ROT_FLAG_DISABLED);
85 ov.setSource(parg, dest);
86
87 hwc_rect_t sourceCrop = layer->sourceCrop;
88 // x,y,w,h
89 ovutils::Dim dcrop(sourceCrop.left, sourceCrop.top,
90 sourceCrop.right - sourceCrop.left,
91 sourceCrop.bottom - sourceCrop.top);
92 ov.setCrop(dcrop, dest);
93
94 int transform = layer->transform;
95 ovutils::eTransform orient =
96 static_cast<ovutils::eTransform>(transform);
97 ov.setTransform(orient, dest);
98
99 hwc_rect_t displayFrame = layer->displayFrame;
100 ovutils::Dim dpos(displayFrame.left,
101 displayFrame.top,
102 displayFrame.right - displayFrame.left,
103 displayFrame.bottom - displayFrame.top);
104 ov.setPosition(dpos, dest);
105
106 ret = true;
107 if (!ov.commit(dest)) {
108 ALOGE("%s: commit fails", __FUNCTION__);
109 ret = false;
110 }
111 }
112 return ret;
113 }
114
draw(hwc_context_t * ctx,hwc_layer_1_t * layer,int dpy)115 bool FBUpdate::draw(hwc_context_t *ctx, hwc_layer_1_t *layer, int dpy)
116 {
117 if(!sModeOn[dpy]) {
118 return true;
119 }
120 bool ret = true;
121 overlay::Overlay& ov = *(ctx->mOverlay);
122 ovutils::eDest dest = sDest[dpy];
123 private_handle_t *hnd = (private_handle_t *)layer->handle;
124 if (!ov.queueBuffer(hnd->fd, hnd->offset, dest)) {
125 ALOGE("%s: queueBuffer failed for external", __FUNCTION__);
126 ret = false;
127 }
128 return ret;
129 }
130
131 //---------------------------------------------------------------------
132 }; //namespace qhwc
133