| /* |
| * drm_display.h - drm display |
| * |
| * Copyright (c) 2015 Intel Corporation |
| * |
| * 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. |
| * |
| * Author: John Ye <[email protected]> |
| */ |
| |
| #ifndef XCAM_DRM_DISPLAY_H |
| #define XCAM_DRM_DISPLAY_H |
| |
| #include <xcam_std.h> |
| #include <xcam_mutex.h> |
| #include <v4l2_buffer_proxy.h> |
| |
| extern "C" { |
| #include <drm.h> |
| #include <drm_mode.h> |
| #include <intel_bufmgr.h> |
| #include <linux/videodev2.h> |
| } |
| |
| #include <errno.h> |
| #include <unistd.h> |
| #include <xf86drm.h> |
| #include <xf86drmMode.h> |
| |
| #include <list> |
| #include <vector> |
| #include <map> |
| |
| namespace XCam { |
| |
| class DrmBoData; |
| class DrmBoBufferPool; |
| class DrmBoBuffer; |
| |
| enum DrmDisplayMode { |
| DRM_DISPLAY_MODE_NONE = 0, |
| DRM_DISPLAY_MODE_PRIMARY, |
| DRM_DISPLAY_MODE_OVERLAY, |
| }; |
| |
| class DrmDisplay { |
| friend class DrmBoBufferPool; |
| friend class CLBoBufferPool; |
| |
| struct FB { |
| uint32_t fb_handle; |
| uint32_t index; |
| |
| FB () : fb_handle (0), index (0) {} |
| }; |
| |
| public: |
| // if need local preview, please call set_preview() before instance() |
| static SmartPtr<DrmDisplay> instance (); |
| static uint32_t to_drm_fourcc (uint32_t fourcc_of_v4l2); |
| |
| virtual ~DrmDisplay(); |
| const char *get_module_name () const { |
| return _module; |
| } |
| |
| bool is_render_inited () const { |
| return _is_render_inited; |
| } |
| XCamReturn render_init ( |
| uint32_t con_id, |
| uint32_t crtc_id, |
| uint32_t width, |
| uint32_t height, |
| uint32_t format, |
| const struct v4l2_rect* compose); |
| |
| bool has_frame_buffer (SmartPtr<VideoBuffer> &buf) { |
| return _buf_fb_handles.find (buf.ptr ()) != _buf_fb_handles.end (); |
| }; |
| XCamReturn render_setup_frame_buffer (SmartPtr<VideoBuffer> &buf); |
| XCamReturn render_buffer (SmartPtr<VideoBuffer> &buf); |
| |
| int get_drm_handle() const { |
| return _fd; |
| }; |
| |
| SmartPtr<V4l2Buffer> create_drm_buf ( |
| const struct v4l2_format &format, |
| const uint32_t index, |
| const enum v4l2_buf_type buf_type); |
| SmartPtr<DrmBoBuffer> convert_to_drm_bo_buf (SmartPtr<DrmDisplay> &self, SmartPtr<VideoBuffer> &buf_in); |
| |
| static bool set_preview (bool flag); |
| bool can_preview () { |
| return _preview_flag; |
| } |
| bool set_display_mode (DrmDisplayMode mode) { |
| _display_mode = mode; |
| return true; |
| }; |
| |
| private: |
| DrmDisplay (const char *module = NULL); |
| |
| SmartPtr<DrmBoData> create_drm_bo (SmartPtr<DrmDisplay> &self, const VideoBufferInfo& info); |
| drm_intel_bo *create_drm_bo_from_fd (int32_t fd, uint32_t size); |
| |
| bool is_authenticated (int fd, const char *msg); |
| int open_driver (const char *dev_path); |
| int open_drivers (const char *base_path, int base_id); |
| |
| XCamReturn get_crtc(drmModeRes *res); |
| XCamReturn get_connector(drmModeRes *res); |
| XCamReturn get_plane(); |
| XCamReturn set_plane(const FB &fb); |
| XCamReturn set_crtc(const FB &fb); |
| XCamReturn page_flip(const FB &fb); |
| |
| private: |
| typedef std::map<const VideoBuffer *, FB> FBMap; |
| |
| static bool _preview_flag; |
| |
| char *_module; |
| int _fd; |
| drm_intel_bufmgr *_buf_manager; |
| DrmDisplayMode _display_mode; |
| int _crtc_index; |
| unsigned int _crtc_id; |
| unsigned int _con_id; |
| unsigned int _encoder_id; |
| unsigned int _plane_id; |
| drmModeModeInfo _mode; |
| drmModeConnector *_connector; |
| bool _is_render_inited; |
| |
| unsigned int _format; |
| unsigned int _width; |
| unsigned int _height; |
| |
| struct v4l2_rect _compose; |
| |
| FBMap _buf_fb_handles; |
| SmartPtr<VideoBuffer> _display_buf; |
| |
| private: |
| XCAM_DEAD_COPY (DrmDisplay); |
| |
| private: |
| static SmartPtr<DrmDisplay> _instance; |
| static Mutex _mutex; |
| }; |
| |
| }; |
| #endif // XCAM_DRM_DISPLAY_H |
| |