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