blob: c22dd39ac914d3b04b4d93322373c9c3fbb31e18 [file] [log] [blame]
/*
* Copyright (c) 2015, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
//#include "overlay.h"
#include "overlayCursor.h"
#include "mdpWrapper.h"
namespace overlay {
HWCursor* HWCursor::sHwCursor = 0;
//=========== class HWCursor =================================================
HWCursor* HWCursor::getInstance() {
if (sHwCursor == NULL) {
sHwCursor = new HWCursor();
}
return sHwCursor;
}
bool HWCursor::config(const int fd, void* base, PipeArgs& pargs,
Dim& crop, Dim& dest) {
bool ret = true;
fb_cursor *cursor = &mfbCursor;
fb_image cursorImage;
cursor->set = FB_CUR_SETIMAGE | FB_CUR_SETPOS;
cursor->enable = (uint16_t)1;
cursor->rop = 0,
cursor->mask = NULL;
cursor->hot.x = (uint16_t)crop.x;
cursor->hot.y = (uint16_t)crop.y;
cursorImage.dx = dest.x;
cursorImage.dy = dest.y;
cursorImage.width = pargs.whf.w;
cursorImage.height = pargs.whf.h;
cursorImage.fg_color = pargs.planeAlpha; // Hint for PMA
cursorImage.bg_color = 0xffffff00; // RGBA
cursorImage.depth = 32;
cursorImage.data = (char*)base;
cursor->image = cursorImage;
if (!setCursor(fd)) {
ALOGE("%s: Failed to setup HW cursor", __FUNCTION__);
ret = false;
memset(cursor, 0, sizeof(fb_cursor));
}
return ret;
}
bool HWCursor::setPositionAsync(const int fd, int x, int y) {
bool ret = true;
if (isCursorSet()) {
fb_cursor *cursor = &mfbCursor;
cursor->set = FB_CUR_SETPOS;
cursor->image.dx = x;
cursor->image.dy = y;
if (!setCursor(fd)) {
ALOGE("%s: Failed to set position x = %d y = %d", __FUNCTION__, x, y);
ret = false;
}
}
return ret;
}
bool HWCursor::free(const int fd) {
fb_cursor *cursor = &mfbCursor;
fb_image cursorImage;
bool ret = true;
if(!cursor->enable) {
return ret;
}
cursor->enable = (uint16_t)0;
if (!setCursor(fd)) {
ALOGE("%s: Failed to free cursor hw", __FUNCTION__);
ret = false;
}
memset(cursor, 0, sizeof(fb_cursor));
return ret;
}
bool HWCursor::setCursor(const int fd) {
bool ret = true;
ATRACE_CALL();
fb_cursor *cursor = &mfbCursor;
if(fd <= 0) {
ALOGE("%s: Invalid fd", fd);
return false;
}
if (ioctl(fd, MSMFB_CURSOR, cursor) < 0) {
ALOGE("%s: Failed to call ioctl MSMFB_CURSOR err=%s\n", __FUNCTION__,
strerror(errno));
ret = false;
}
return ret;
}
void HWCursor::getDump(char* buf, size_t len) {
char cursordump[len];
fb_cursor* cursor = &mfbCursor;
if (cursor->enable) {
snprintf(cursordump, sizeof(cursordump),
"HWCursor on Primary: src w=%d h=%d\n"
"\tsrc_rect x=%d y=%d w=%d h=%d\n"
"\tdst_rect x=%d y=%d w=%d h=%d\n\n", cursor->image.width,
cursor->image.height, cursor->hot.x, cursor->hot.y,
cursor->image.width, cursor->image.height,
cursor->image.dx, cursor->image.dy, cursor->image.width,
cursor->image.height);
strlcat(buf, cursordump, len);
}
}
} //namespace overlay