181 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
|  * Copyright (C) 2021 The Android Open Source Project
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  *      http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <android-base/logging.h>
 | |
| // hwc2 types
 | |
| #include <hardware/hwcomposer2.h>
 | |
| // new hwc3 types used by exynosdisplay
 | |
| #include "ExynosHwc3Types.h"
 | |
| // aidl types
 | |
| #include "include/IComposerHal.h"
 | |
| 
 | |
| namespace aidl::android::hardware::graphics::composer3::impl {
 | |
| 
 | |
| // hwc2 to aidl conversion
 | |
| namespace h2a {
 | |
| 
 | |
| template <typename T, typename U>
 | |
| inline void translate(const T& in, U& out) {
 | |
|     out = static_cast<U>(in);
 | |
| }
 | |
| 
 | |
| template <typename T, typename U>
 | |
| inline void translate(const std::vector<T>& in, std::vector<U>& out) {
 | |
|     out.clear();
 | |
|     for (auto const &t : in) {
 | |
|         U u;
 | |
|         translate(t, u);
 | |
|         out.emplace_back(std::move(u));
 | |
|     }
 | |
| }
 | |
| 
 | |
| template<>
 | |
| inline void translate(const hwc_vsync_period_change_timeline_t& in,
 | |
|                       VsyncPeriodChangeTimeline& out) {
 | |
|     out.newVsyncAppliedTimeNanos = in.newVsyncAppliedTimeNanos;
 | |
|     out.refreshRequired = in.refreshRequired;
 | |
|     out.refreshTimeNanos = in.refreshTimeNanos;
 | |
| }
 | |
| 
 | |
| template<>
 | |
| inline void translate(const int32_t& fd, ndk::ScopedFileDescriptor& sfd) {
 | |
|     // ownership of fd is transferred to sfd
 | |
|     sfd = ndk::ScopedFileDescriptor(fd);
 | |
| }
 | |
| 
 | |
| template<>
 | |
| inline void translate(const hwc_client_target_property& in, ClientTargetProperty& out) {
 | |
|     translate(in.pixelFormat, out.pixelFormat);
 | |
|     translate(in.dataspace, out.dataspace);
 | |
| }
 | |
| 
 | |
| template<>
 | |
| inline void translate(const HwcMountOrientation& in, common::Transform& out) {
 | |
|     switch (in) {
 | |
|     case HwcMountOrientation::ROT_0:
 | |
|         out = common::Transform::NONE;
 | |
|         break;
 | |
| 
 | |
|     case HwcMountOrientation::ROT_90:
 | |
|         out = common::Transform::ROT_90;
 | |
|         break;
 | |
| 
 | |
|     case HwcMountOrientation::ROT_180:
 | |
|         out = common::Transform::ROT_180;
 | |
|         break;
 | |
| 
 | |
|     case HwcMountOrientation::ROT_270:
 | |
|         out = common::Transform::ROT_270;
 | |
|         break;
 | |
| 
 | |
|     default:
 | |
|         LOG(WARNING) << "unrecoganized display orientation: " << static_cast<uint32_t>(in);
 | |
|         out = common::Transform::NONE;
 | |
|         break;
 | |
|     }
 | |
| }
 | |
| 
 | |
| } // namespace h2a
 | |
| 
 | |
| // aidl to hwc2 conversion
 | |
| namespace a2h {
 | |
| 
 | |
| template <typename T, typename U>
 | |
| inline void translate(const T& in, U& out) {
 | |
|     out = static_cast<U>(in);
 | |
| }
 | |
| 
 | |
| template <typename T, typename U>
 | |
| inline void translate(const std::vector<std::optional<T>>& in, std::vector<U>& out) {
 | |
|     out.clear();
 | |
|     for (auto const &t : in) {
 | |
|         U u;
 | |
|         if (t) {
 | |
|             translate(*t, u);
 | |
|             out.emplace_back(std::move(u));
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| template <typename T, typename U>
 | |
| inline void translate(const std::vector<T>& in, std::vector<U>& out) {
 | |
|     out.clear();
 | |
|     for (auto const &t : in) {
 | |
|         U u;
 | |
|         translate(t, u);
 | |
|         out.emplace_back(std::move(u));
 | |
|     }
 | |
| }
 | |
| 
 | |
| template<>
 | |
| inline void translate(const common::Rect& in, hwc_rect_t& out) {
 | |
|      out.left = in.left;
 | |
|      out.top = in.top;
 | |
|      out.right =in.right;
 | |
|      out.bottom =in.bottom;
 | |
| }
 | |
| 
 | |
| template<>
 | |
| inline void translate(const common::FRect& in, hwc_frect_t& out) {
 | |
|      out.left = in.left;
 | |
|      out.top = in.top;
 | |
|      out.right =in.right;
 | |
|      out.bottom =in.bottom;
 | |
| }
 | |
| 
 | |
| template <>
 | |
| inline void translate(const VsyncPeriodChangeConstraints& in,
 | |
|                       hwc_vsync_period_change_constraints_t& out) {
 | |
|     out.desiredTimeNanos = in.desiredTimeNanos;
 | |
|     out.seamlessRequired = in.seamlessRequired;
 | |
| }
 | |
| 
 | |
| template<>
 | |
| inline void translate(const ndk::ScopedFileDescriptor& in, int32_t& out) {
 | |
|     // it's not defined as const. drop the const to avoid dup
 | |
|     auto& sfd = const_cast<ndk::ScopedFileDescriptor&>(in);
 | |
|     // take the ownership
 | |
|     out = sfd.get();
 | |
|     *sfd.getR() = -1;
 | |
| }
 | |
| 
 | |
| template<>
 | |
| inline void translate(const bool& in, hwc2_vsync_t& out) {
 | |
|     // HWC_VSYNC_DISABLE is 2
 | |
|     out = in ? HWC2_VSYNC_ENABLE : HWC2_VSYNC_DISABLE;
 | |
| }
 | |
| 
 | |
| template<>
 | |
| inline void translate(const Color& in, hwc_color_t& out) {
 | |
|     const auto floatColorToUint8Clamped = [](float val) -> uint8_t {
 | |
|         const auto intVal = static_cast<uint64_t>(std::round(255.0f * val));
 | |
|         const auto minVal = static_cast<uint64_t>(0);
 | |
|         const auto maxVal = static_cast<uint64_t>(255);
 | |
|         return std::clamp(intVal, minVal, maxVal);
 | |
|     };
 | |
| 
 | |
|     out.r = floatColorToUint8Clamped(in.r);
 | |
|     out.g = floatColorToUint8Clamped(in.g);
 | |
|     out.b = floatColorToUint8Clamped(in.b);
 | |
|     out.a = floatColorToUint8Clamped(in.a);
 | |
| }
 | |
| 
 | |
| } // namespace a2h
 | |
| 
 | |
| } // namespace aidl::android::hardware::graphics::composer3::impl
 |