18b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol/*
28b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Copyright (c) 2014 Intel Corporation 
38b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol//
48b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Licensed under the Apache License, Version 2.0 (the "License");
58b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// you may not use this file except in compliance with the License.
68b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// You may obtain a copy of the License at
78b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol//
88b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol//      http://www.apache.org/licenses/LICENSE-2.0
98b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol//
108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Unless required by applicable law or agreed to in writing, software
118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// distributed under the License is distributed on an "AS IS" BASIS,
128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// See the License for the specific language governing permissions and
148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// limitations under the License.
158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol*/
168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <HwcTrace.h>
178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <Drm.h>
188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <Hwcomposer.h>
198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <common/VsyncControl.h>
208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace android {
228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace intel {
238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolVsyncControl::VsyncControl()
258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    : IVsyncControl(),
268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mInitialized(false)
278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolVsyncControl::~VsyncControl()
318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    WARN_IF_NOT_DEINIT();
338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool VsyncControl::initialize()
368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mInitialized = true;
388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    return true;
398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid VsyncControl::deinitialize()
428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mInitialized = false;
448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool VsyncControl::control(int disp, bool enabled)
478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    ATRACE("disp = %d, enabled = %d", disp, enabled);
498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    struct drm_psb_vsync_set_arg arg;
518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    memset(&arg, 0, sizeof(struct drm_psb_vsync_set_arg));
528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // pipe equals to disp
548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    arg.vsync.pipe = disp;
558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (enabled) {
578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        arg.vsync_operation_mask = VSYNC_ENABLE;
588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    } else {
598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        arg.vsync_operation_mask = VSYNC_DISABLE;
608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    Drm *drm = Hwcomposer::getInstance().getDrm();
628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    return drm->writeReadIoctl(DRM_PSB_VSYNC_SET, &arg, sizeof(arg));
638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool VsyncControl::wait(int disp, int64_t& timestamp)
668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    ATRACE("disp = %d", disp);
688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    struct drm_psb_vsync_set_arg arg;
708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    memset(&arg, 0, sizeof(struct drm_psb_vsync_set_arg));
718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    arg.vsync_operation_mask = VSYNC_WAIT;
738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // pipe equals to disp
758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    arg.vsync.pipe = disp;
768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    Drm *drm = Hwcomposer::getInstance().getDrm();
788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool ret = drm->writeReadIoctl(DRM_PSB_VSYNC_SET, &arg, sizeof(arg));
798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    timestamp = (int64_t)arg.vsync.timestamp;
808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    return ret;
818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace intel
848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace android
85