12ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel/*
22ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * Copyright (c) 2016, The Linux Foundation. All rights reserved.
32ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *
42ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * Redistribution and use in source and binary forms, with or without
52ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * modification, are permitted provided that the following conditions are
62ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * met:
72ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *    * Redistributions of source code must retain the above copyright
82ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *      notice, this list of conditions and the following disclaimer.
92ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *    * Redistributions in binary form must reproduce the above
102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *      copyright notice, this list of conditions and the following
112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *      disclaimer in the documentation and/or other materials provided
122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *      with the distribution.
132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *    * Neither the name of The Linux Foundation. nor the names of its
142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *      contributors may be used to endorse or promote products derived
152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *      from this software without specific prior written permission.
162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *
172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel */
292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/constants.h>
302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/debug.h>
312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "hwc_callbacks.h"
322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define __CLASS__ "HWCCallbacks"
342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelnamespace sdm {
362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid HWCCallbacks::Hotplug(hwc2_display_t display, HWC2::Connection state) {
382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (hotplug_) {
392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    hotplug_(hotplug_data_, display, INT32(state));
402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid HWCCallbacks::Refresh(hwc2_display_t display) {
442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (refresh_) {
452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    refresh_(refresh_data_, display);
462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid HWCCallbacks::Vsync(hwc2_display_t display, int64_t timestamp) {
502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  if (vsync_) {
51c22578f608093babf45958630049e03d342fcc58Naseer Ahmed    DTRACE_SCOPED();
522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    vsync_(vsync_data_, display, timestamp);
532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelHWC2::Error HWCCallbacks::Register(HWC2::Callback descriptor, hwc2_callback_data_t callback_data,
572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                   hwc2_function_pointer_t pointer) {
582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  switch (descriptor) {
592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HWC2::Callback::Hotplug:
602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      hotplug_data_ = callback_data;
612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      hotplug_ = reinterpret_cast<HWC2_PFN_HOTPLUG>(pointer);
622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      break;
632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HWC2::Callback::Refresh:
642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      refresh_data_ = callback_data;
652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      refresh_ = reinterpret_cast<HWC2_PFN_REFRESH>(pointer);
662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      break;
672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    case HWC2::Callback::Vsync:
682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      vsync_data_ = callback_data;
692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      vsync_ = reinterpret_cast<HWC2_PFN_VSYNC>(pointer);
702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      break;
712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    default:
722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel      return HWC2::Error::BadParameter;
732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  }
742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  return HWC2::Error::None;
752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}
762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}  // namespace sdm
78