VsyncControl.cpp revision e6ecdadd57e79c2218b3e6ae407f12599f33bd22
16a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu/* 26a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * Copyright © 2012 Intel Corporation 36a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * All rights reserved. 46a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * 56a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * Permission is hereby granted, free of charge, to any person obtaining a 66a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * copy of this software and associated documentation files (the "Software"), 76a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * to deal in the Software without restriction, including without limitation 86a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 96a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * and/or sell copies of the Software, and to permit persons to whom the 106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * Software is furnished to do so, subject to the following conditions: 116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * 126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * The above copyright notice and this permission notice (including the next 136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * paragraph) shall be included in all copies or substantial portions of the 146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * Software. 156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * 166a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 176a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * IN THE SOFTWARE. 236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * 246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * Authors: 256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * Jackie Li <yaodong.li@intel.com> 266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu * 276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu */ 28e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li#include <cutils/log.h> 296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <Drm.h> 316a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <Hwcomposer.h> 32e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li#include <common/VsyncControl.h> 336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace android { 356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace intel { 366a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 37e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie LiVsyncControl::VsyncControl() 38e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li : IVsyncControl() 396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 43e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Libool VsyncControl::control(int disp, int enabled) 446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 45e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li Drm *drm = Hwcomposer::getInstance().getDrm(); 466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu struct drm_psb_vsync_set_arg arg; 476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu bool ret; 486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 49e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li LOGV("VsyncControl::control: disp %d, enabled %d", disp, enabled); 50e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 51e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li if (!drm) { 52e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li LOGE("VsyncControl::control: failed to get drm"); 53e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li return false; 54e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu memset(&arg, 0, sizeof(struct drm_psb_vsync_set_arg)); 576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // pipe equals to disp 596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu arg.vsync.pipe = disp; 606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (enabled) 626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu arg.vsync_operation_mask = VSYNC_ENABLE; 636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu else 646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu arg.vsync_operation_mask = VSYNC_DISABLE; 656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 66e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li return drm->writeReadIoctl(DRM_PSB_VSYNC_SET, &arg, sizeof(arg)); 676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 69e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Libool VsyncControl::wait(int disp, int64_t& timestamp) 706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 71e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li Drm *drm = Hwcomposer::getInstance().getDrm(); 726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu struct drm_psb_vsync_set_arg arg; 736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu bool ret; 746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 75e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li LOGV("VsyncControl::wait: disp %d", disp); 76e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 77e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li if (!drm) { 78e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li LOGE("VsyncControl::wait: failed to get drm"); 79e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li return false; 80e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu memset(&arg, 0, sizeof(struct drm_psb_vsync_set_arg)); 836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu arg.vsync_operation_mask = VSYNC_WAIT; 856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // pipe equals to disp 876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu arg.vsync.pipe = disp; 886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 89e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li ret = drm->writeReadIoctl(DRM_PSB_VSYNC_SET, &arg, sizeof(arg)); 906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu timestamp = (int64_t)arg.vsync.timestamp; 916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return ret; 926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel 956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android 96