1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*
2a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson *  Copyright (c) 2013-14, The Linux Foundation. All rights reserved.
3ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Redistribution and use in source and binary forms, with or without
5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * modification, are permitted provided that the following conditions are
6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * met:
7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *     * Redistributions of source code must retain the above copyright
8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *       notice, this list of conditions and the following disclaimer.
9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *     * Redistributions in binary form must reproduce the above
10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *       copyright notice, this list of conditions and the following
11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *       disclaimer in the documentation and/or other materials provided
12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *       with the distribution.
13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *     * Neither the name of The Linux Foundation nor the names of its
14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *       contributors may be used to endorse or promote products derived
15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *       from this software without specific prior written permission.
16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * SUBSTITUTE GOODS OR CLIENTS; LOSS OF USE, DATA, OR PROFITS; OR
24ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */
29ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
30ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <hwc_qclient.h>
31ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <IQService.h>
32ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <hwc_utils.h>
33a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include <mdp_version.h>
34000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed#include <hwc_mdpcomp.h>
35ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
36ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define QCLIENT_DEBUG 0
37ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
38ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace android;
39ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace qService;
40a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonusing namespace qhwc;
41ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
42ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace qClient {
43ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
44ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// ----------------------------------------------------------------------------
45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon WilsonQClient::QClient(hwc_context_t *ctx) : mHwcContext(ctx),
46ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        mMPDeathNotifier(new MPDeathNotifier(ctx))
47ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
48ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ALOGD_IF(QCLIENT_DEBUG, "QClient Constructor invoked");
49ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
50ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
51ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon WilsonQClient::~QClient()
52ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
53ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ALOGD_IF(QCLIENT_DEBUG,"QClient Destructor invoked");
54ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
55ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
56a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void securing(hwc_context_t *ctx, uint32_t startEnd) {
57a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    Locker::Autolock _sl(ctx->mDrawLock);
58ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    //The only way to make this class in this process subscribe to media
59ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    //player's death.
60ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    IMediaDeathNotifier::getMediaPlayerService();
61ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
62a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    ctx->mSecuring = startEnd;
63ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    //We're done securing
64ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if(startEnd == IQService::END)
65a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        ctx->mSecureMode = true;
66a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    if(ctx->proc)
67a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        ctx->proc->invalidate(ctx->proc);
68ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
69ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
70a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void unsecuring(hwc_context_t *ctx, uint32_t startEnd) {
71a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    Locker::Autolock _sl(ctx->mDrawLock);
72a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    ctx->mSecuring = startEnd;
73ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    //We're done unsecuring
74ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if(startEnd == IQService::END)
75a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        ctx->mSecureMode = false;
76a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    if(ctx->proc)
77a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        ctx->proc->invalidate(ctx->proc);
78ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
79ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
80ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonvoid QClient::MPDeathNotifier::died() {
81ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    Locker::Autolock _sl(mHwcContext->mDrawLock);
82ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    ALOGD_IF(QCLIENT_DEBUG, "Media Player died");
83ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mHwcContext->mSecuring = false;
84ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    mHwcContext->mSecureMode = false;
85ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if(mHwcContext->proc)
86ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        mHwcContext->proc->invalidate(mHwcContext->proc);
87ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
88ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
89a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic android::status_t screenRefresh(hwc_context_t *ctx) {
90ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    status_t result = NO_INIT;
91a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    if(ctx->proc) {
92a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        ctx->proc->invalidate(ctx->proc);
93ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        result = NO_ERROR;
94ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
95ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return result;
96ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
97a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
98a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void setExtOrientation(hwc_context_t *ctx, uint32_t orientation) {
99a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    ctx->mExtOrientation = orientation;
100a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson}
101a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
102a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void isExternalConnected(hwc_context_t* ctx, Parcel* outParcel) {
103a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    int connected;
104a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    connected = ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].connected ? 1 : 0;
105a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    outParcel->writeInt32(connected);
106a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson}
107a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
108a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void getDisplayAttributes(hwc_context_t* ctx, const Parcel* inParcel,
109a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        Parcel* outParcel) {
110a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    int dpy = inParcel->readInt32();
111a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    outParcel->writeInt32(ctx->dpyAttr[dpy].vsync_period);
1122c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi    if (ctx->dpyAttr[dpy].customFBSize) {
1132c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi        outParcel->writeInt32(ctx->dpyAttr[dpy].xres_new);
1142c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi        outParcel->writeInt32(ctx->dpyAttr[dpy].yres_new);
1152c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi    } else {
1162c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi        outParcel->writeInt32(ctx->dpyAttr[dpy].xres);
1172c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi        outParcel->writeInt32(ctx->dpyAttr[dpy].yres);
1182c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi    }
119a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    outParcel->writeFloat(ctx->dpyAttr[dpy].xdpi);
120a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    outParcel->writeFloat(ctx->dpyAttr[dpy].ydpi);
121a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    //XXX: Need to check what to return for HDMI
122a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    outParcel->writeInt32(ctx->mMDP.panel);
123a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson}
124a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void setHSIC(const Parcel* inParcel) {
125a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    int dpy = inParcel->readInt32();
126a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    ALOGD_IF(0, "In %s: dpy = %d", __FUNCTION__, dpy);
127a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    HSICData_t hsic_data;
128a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    hsic_data.hue = inParcel->readInt32();
129a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    hsic_data.saturation = inParcel->readFloat();
130a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    hsic_data.intensity = inParcel->readInt32();
131a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    hsic_data.contrast = inParcel->readFloat();
132a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    //XXX: Actually set the HSIC data through ABL lib
133a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson}
134a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
135a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
136a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void setBufferMirrorMode(hwc_context_t *ctx, uint32_t enable) {
137a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    ctx->mBufferMirrorMode = enable;
138a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson}
139a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
140a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic status_t getDisplayVisibleRegion(hwc_context_t* ctx, int dpy,
141a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                                Parcel* outParcel) {
142a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    // Get the info only if the dpy is valid
143a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    if(dpy >= HWC_DISPLAY_PRIMARY && dpy <= HWC_DISPLAY_VIRTUAL) {
144a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        Locker::Autolock _sl(ctx->mDrawLock);
145a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        if(dpy && (ctx->mExtOrientation || ctx->mBufferMirrorMode)) {
146a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            // Return the destRect on external, if external orienation
147a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            // is enabled
148a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            outParcel->writeInt32(ctx->dpyAttr[dpy].mDstRect.left);
149a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            outParcel->writeInt32(ctx->dpyAttr[dpy].mDstRect.top);
150a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            outParcel->writeInt32(ctx->dpyAttr[dpy].mDstRect.right);
151a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            outParcel->writeInt32(ctx->dpyAttr[dpy].mDstRect.bottom);
152a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        } else {
153a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            outParcel->writeInt32(ctx->mViewFrame[dpy].left);
154a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            outParcel->writeInt32(ctx->mViewFrame[dpy].top);
155a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            outParcel->writeInt32(ctx->mViewFrame[dpy].right);
156a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            outParcel->writeInt32(ctx->mViewFrame[dpy].bottom);
157a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        }
158a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        return NO_ERROR;
159a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    } else {
160a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        ALOGE("In %s: invalid dpy index %d", __FUNCTION__, dpy);
161a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        return BAD_VALUE;
162a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    }
163a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson}
164a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
165a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatic void pauseWFD(hwc_context_t *ctx, uint32_t pause) {
166a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal    /* TODO: Will remove pauseWFD once all the clients start using
167a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal     * setWfdStatus to indicate the status of WFD display
168a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal     */
169a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    int dpy = HWC_DISPLAY_VIRTUAL;
170a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    if(pause) {
171a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        //WFD Pause
172a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        handle_pause(ctx, dpy);
173a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    } else {
174a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        //WFD Resume
175a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        handle_resume(ctx, dpy);
176a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    }
177a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson}
178a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
179a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamalstatic void setWfdStatus(hwc_context_t *ctx, uint32_t wfdStatus) {
180a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal
181a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal    ALOGD_IF(HWC_WFDDISPSYNC_LOG,
182a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal             "%s: Received a binder call that WFD state is %s",
183a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal             __FUNCTION__,getExternalDisplayState(wfdStatus));
184a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal    int dpy = HWC_DISPLAY_VIRTUAL;
185a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal
186a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal    if(wfdStatus == EXTERNAL_OFFLINE) {
187a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal        ctx->mWfdSyncLock.lock();
188a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal        ctx->mWfdSyncLock.signal();
189a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal        ctx->mWfdSyncLock.unlock();
190a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal    } else if(wfdStatus == EXTERNAL_PAUSE) {
191a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal        handle_pause(ctx, dpy);
192a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal    } else if(wfdStatus == EXTERNAL_RESUME) {
193a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal        handle_resume(ctx, dpy);
194a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal    }
195a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal}
196a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal
19733f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan
19833f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnanstatic status_t setViewFrame(hwc_context_t* ctx, const Parcel* inParcel) {
19933f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan    int dpy = inParcel->readInt32();
20033f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan    if(dpy >= HWC_DISPLAY_PRIMARY && dpy <= HWC_DISPLAY_VIRTUAL) {
20133f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan        Locker::Autolock _sl(ctx->mDrawLock);
20233f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan        ctx->mViewFrame[dpy].left   = inParcel->readInt32();
20333f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan        ctx->mViewFrame[dpy].top    = inParcel->readInt32();
20433f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan        ctx->mViewFrame[dpy].right  = inParcel->readInt32();
20533f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan        ctx->mViewFrame[dpy].bottom = inParcel->readInt32();
20633f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan        ALOGD_IF(QCLIENT_DEBUG, "%s: mViewFrame[%d] = [%d %d %d %d]",
20733f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan            __FUNCTION__, dpy,
20833f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan            ctx->mViewFrame[dpy].left, ctx->mViewFrame[dpy].top,
20933f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan            ctx->mViewFrame[dpy].right, ctx->mViewFrame[dpy].bottom);
21033f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan        return NO_ERROR;
21133f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan    } else {
21233f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan        ALOGE("In %s: invalid dpy index %d", __FUNCTION__, dpy);
21333f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan        return BAD_VALUE;
21433f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan    }
21533f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan}
21633f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan
217000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmedstatic void toggleDynamicDebug(hwc_context_t* ctx, const Parcel* inParcel) {
218000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed    int debug_type = inParcel->readInt32();
219000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed    bool enable = !!inParcel->readInt32();
220000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed    ALOGD("%s: debug_type: %d enable:%d",
221000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed            __FUNCTION__, debug_type, enable);
222000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed    Locker::Autolock _sl(ctx->mDrawLock);
223000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed    switch (debug_type) {
224000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed        //break is ignored for DEBUG_ALL to toggle all of them at once
225000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed        case IQService::DEBUG_ALL:
226000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed        case IQService::DEBUG_MDPCOMP:
227000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed            qhwc::MDPComp::dynamicDebug(enable);
228000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed            if (debug_type != IQService::DEBUG_ALL)
229000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed                break;
230000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed        case IQService::DEBUG_VSYNC:
231000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed            ctx->vstate.debug = enable;
232000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed            if (debug_type != IQService::DEBUG_ALL)
233000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed                break;
234000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed    }
235000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed}
236000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed
237a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonstatus_t QClient::notifyCallback(uint32_t command, const Parcel* inParcel,
238a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        Parcel* outParcel) {
239a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    status_t ret = NO_ERROR;
240a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
241a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    switch(command) {
242a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case IQService::SECURING:
243a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            securing(mHwcContext, inParcel->readInt32());
244a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            break;
245a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case IQService::UNSECURING:
246a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            unsecuring(mHwcContext, inParcel->readInt32());
247a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            break;
248a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case IQService::SCREEN_REFRESH:
249a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            return screenRefresh(mHwcContext);
250a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            break;
251a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case IQService::EXTERNAL_ORIENTATION:
252a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            setExtOrientation(mHwcContext, inParcel->readInt32());
253a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            break;
254a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case IQService::BUFFER_MIRRORMODE:
255a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            setBufferMirrorMode(mHwcContext, inParcel->readInt32());
256a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            break;
257a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case IQService::GET_DISPLAY_VISIBLE_REGION:
258a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            ret = getDisplayVisibleRegion(mHwcContext, inParcel->readInt32(),
259a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                                    outParcel);
260a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            break;
261a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case IQService::CHECK_EXTERNAL_STATUS:
262a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            isExternalConnected(mHwcContext, outParcel);
263a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            break;
264a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case IQService::GET_DISPLAY_ATTRIBUTES:
265a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            getDisplayAttributes(mHwcContext, inParcel, outParcel);
266a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            break;
267a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case IQService::SET_HSIC_DATA:
268a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            setHSIC(inParcel);
269a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal            break;
270a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case IQService::PAUSE_WFD:
271a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            pauseWFD(mHwcContext, inParcel->readInt32());
272a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            break;
273a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal        case IQService::SET_WFD_STATUS:
274a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal            setWfdStatus(mHwcContext,inParcel->readInt32());
275a2b25afe2813c793161cc9fad657d9638e88aec4Raj kamal            break;
27633f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan        case IQService::SET_VIEW_FRAME:
27733f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan            setViewFrame(mHwcContext, inParcel);
27833f1ae81779c5b897987245cde0f498fd6192579Ramkumar Radhakrishnan            break;
279000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed        case IQService::DYNAMIC_DEBUG:
280000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed            toggleDynamicDebug(mHwcContext, inParcel);
281000cb84f08ff7034094a16e9514a67c9bc470c0cNaseer Ahmed            break;
282a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        default:
283a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            ret = NO_ERROR;
284a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    }
285a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson    return ret;
286a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson}
287a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
288ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
289