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