1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef _LIBADFHWC_ADFHWC_H_ 18 #define _LIBADFHWC_ADFHWC_H_ 19 20 #include <stdbool.h> 21 #include <stdint.h> 22 #include <sys/cdefs.h> 23 #include <video/adf.h> 24 25 #include <hardware/hwcomposer.h> 26 27 struct adf_hwc_helper; 28 29 struct adf_hwc_event_callbacks { 30 /** 31 * Called on vsync (required) 32 */ 33 void (*vsync)(void *data, int disp, uint64_t timestamp); 34 /** 35 * Called on hotplug (required) 36 */ 37 void (*hotplug)(void *data, int disp, bool connected); 38 /** 39 * Called on hardware-custom ADF events (optional) 40 */ 41 void (*custom_event)(void *data, int disp, struct adf_event *event); 42 }; 43 44 /** 45 * Converts HAL pixel formats to equivalent ADF/DRM format FourCCs. 46 */ 47 static inline uint32_t adf_fourcc_for_hal_pixel_format(int format) 48 { 49 switch (format) { 50 case HAL_PIXEL_FORMAT_RGBA_8888: 51 return DRM_FORMAT_RGBA8888; 52 case HAL_PIXEL_FORMAT_RGBX_8888: 53 return DRM_FORMAT_RGBX8888; 54 case HAL_PIXEL_FORMAT_RGB_888: 55 return DRM_FORMAT_RGB888; 56 case HAL_PIXEL_FORMAT_RGB_565: 57 return DRM_FORMAT_RGB565; 58 case HAL_PIXEL_FORMAT_BGRA_8888: 59 return DRM_FORMAT_BGRA8888; 60 case HAL_PIXEL_FORMAT_YV12: 61 return DRM_FORMAT_YVU420; 62 case HAL_PIXEL_FORMAT_YCbCr_422_SP: 63 return DRM_FORMAT_NV16; 64 case HAL_PIXEL_FORMAT_YCrCb_420_SP: 65 return DRM_FORMAT_NV21; 66 case HAL_PIXEL_FORMAT_YCbCr_422_I: 67 return DRM_FORMAT_YUYV; 68 default: 69 return 0; 70 } 71 } 72 73 /** 74 * Converts HAL display types to equivalent ADF interface flags. 75 */ 76 static inline uint32_t adf_hwc_interface_flag_for_disp(int disp) 77 { 78 switch (disp) { 79 case HWC_DISPLAY_PRIMARY: 80 return ADF_INTF_FLAG_PRIMARY; 81 case HWC_DISPLAY_EXTERNAL: 82 return ADF_INTF_FLAG_EXTERNAL; 83 default: 84 return 0; 85 } 86 } 87 88 __BEGIN_DECLS 89 90 /** 91 * Create a HWC helper for the specified ADF interfaces. 92 * 93 * intf_fds must be indexed by HWC display type: e.g., 94 * intf_fds[HWC_DISPLAY_PRIMARY] is the fd for the primary display 95 * interface. n_intfs must be >= 1. 96 * 97 * The caller retains ownership of the fds in intf_fds and must close() 98 * them when they are no longer needed. 99 * 100 * On error, returns -errno. 101 */ 102 int adf_hwc_open(int *intf_fds, size_t n_intfs, 103 const struct adf_hwc_event_callbacks *event_cb, void *event_cb_data, 104 struct adf_hwc_helper **dev); 105 106 /** 107 * Destroys a HWC helper. 108 */ 109 void adf_hwc_close(struct adf_hwc_helper *dev); 110 111 /** 112 * Generic implementations of common HWC ops. 113 * 114 * The HWC should not point its ops directly at these helpers. Instead, the HWC 115 * should provide stub ops which call these helpers after converting the 116 * hwc_composer_device_1* to a struct adf_hwc_helper*. 117 */ 118 int adf_eventControl(struct adf_hwc_helper *dev, int disp, int event, 119 int enabled); 120 int adf_blank(struct adf_hwc_helper *dev, int disp, int blank); 121 int adf_query_display_types_supported(struct adf_hwc_helper *dev, int *value); 122 int adf_getDisplayConfigs(struct adf_hwc_helper *dev, int disp, 123 uint32_t *configs, size_t *numConfigs); 124 int adf_getDisplayAttributes(struct adf_hwc_helper *dev, int disp, 125 uint32_t config, const uint32_t *attributes, int32_t *values); 126 127 __END_DECLS 128 129 #endif /* _LIBADFHWC_ADFHWC_H_ */ 130