1 /* 2 * drm_display.h - drm display 3 * 4 * Copyright (c) 2015 Intel Corporation 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 * 18 * Author: John Ye <john.ye@intel.com> 19 */ 20 21 #ifndef XCAM_DRM_DISPLAY_H 22 #define XCAM_DRM_DISPLAY_H 23 24 #include <xcam_std.h> 25 #include <xcam_mutex.h> 26 #include <v4l2_buffer_proxy.h> 27 28 extern "C" { 29 #include <drm.h> 30 #include <drm_mode.h> 31 #include <intel_bufmgr.h> 32 #include <linux/videodev2.h> 33 } 34 35 #include <errno.h> 36 #include <unistd.h> 37 #include <xf86drm.h> 38 #include <xf86drmMode.h> 39 40 #include <list> 41 #include <vector> 42 #include <map> 43 44 namespace XCam { 45 46 class DrmBoData; 47 class DrmBoBufferPool; 48 class DrmBoBuffer; 49 50 enum DrmDisplayMode { 51 DRM_DISPLAY_MODE_NONE = 0, 52 DRM_DISPLAY_MODE_PRIMARY, 53 DRM_DISPLAY_MODE_OVERLAY, 54 }; 55 56 class DrmDisplay { 57 friend class DrmBoBufferPool; 58 friend class CLBoBufferPool; 59 60 struct FB { 61 uint32_t fb_handle; 62 uint32_t index; 63 FBFB64 FB () : fb_handle (0), index (0) {} 65 }; 66 67 public: 68 // if need local preview, please call set_preview() before instance() 69 static SmartPtr<DrmDisplay> instance (); 70 static uint32_t to_drm_fourcc (uint32_t fourcc_of_v4l2); 71 72 virtual ~DrmDisplay(); get_module_name()73 const char *get_module_name () const { 74 return _module; 75 } 76 is_render_inited()77 bool is_render_inited () const { 78 return _is_render_inited; 79 } 80 XCamReturn render_init ( 81 uint32_t con_id, 82 uint32_t crtc_id, 83 uint32_t width, 84 uint32_t height, 85 uint32_t format, 86 const struct v4l2_rect* compose); 87 has_frame_buffer(SmartPtr<VideoBuffer> & buf)88 bool has_frame_buffer (SmartPtr<VideoBuffer> &buf) { 89 return _buf_fb_handles.find (buf.ptr ()) != _buf_fb_handles.end (); 90 }; 91 XCamReturn render_setup_frame_buffer (SmartPtr<VideoBuffer> &buf); 92 XCamReturn render_buffer (SmartPtr<VideoBuffer> &buf); 93 get_drm_handle()94 int get_drm_handle() const { 95 return _fd; 96 }; 97 98 SmartPtr<V4l2Buffer> create_drm_buf ( 99 const struct v4l2_format &format, 100 const uint32_t index, 101 const enum v4l2_buf_type buf_type); 102 SmartPtr<DrmBoBuffer> convert_to_drm_bo_buf (SmartPtr<DrmDisplay> &self, SmartPtr<VideoBuffer> &buf_in); 103 104 static bool set_preview (bool flag); can_preview()105 bool can_preview () { 106 return _preview_flag; 107 } set_display_mode(DrmDisplayMode mode)108 bool set_display_mode (DrmDisplayMode mode) { 109 _display_mode = mode; 110 return true; 111 }; 112 113 private: 114 DrmDisplay (const char *module = NULL); 115 116 SmartPtr<DrmBoData> create_drm_bo (SmartPtr<DrmDisplay> &self, const VideoBufferInfo& info); 117 drm_intel_bo *create_drm_bo_from_fd (int32_t fd, uint32_t size); 118 119 bool is_authenticated (int fd, const char *msg); 120 int open_driver (const char *dev_path); 121 int open_drivers (const char *base_path, int base_id); 122 123 XCamReturn get_crtc(drmModeRes *res); 124 XCamReturn get_connector(drmModeRes *res); 125 XCamReturn get_plane(); 126 XCamReturn set_plane(const FB &fb); 127 XCamReturn set_crtc(const FB &fb); 128 XCamReturn page_flip(const FB &fb); 129 130 private: 131 typedef std::map<const VideoBuffer *, FB> FBMap; 132 133 static bool _preview_flag; 134 135 char *_module; 136 int _fd; 137 drm_intel_bufmgr *_buf_manager; 138 DrmDisplayMode _display_mode; 139 int _crtc_index; 140 unsigned int _crtc_id; 141 unsigned int _con_id; 142 unsigned int _encoder_id; 143 unsigned int _plane_id; 144 drmModeModeInfo _mode; 145 drmModeConnector *_connector; 146 bool _is_render_inited; 147 148 unsigned int _format; 149 unsigned int _width; 150 unsigned int _height; 151 152 struct v4l2_rect _compose; 153 154 FBMap _buf_fb_handles; 155 SmartPtr<VideoBuffer> _display_buf; 156 157 private: 158 XCAM_DEAD_COPY (DrmDisplay); 159 160 private: 161 static SmartPtr<DrmDisplay> _instance; 162 static Mutex _mutex; 163 }; 164 165 }; 166 #endif // XCAM_DRM_DISPLAY_H 167 168