/*
* 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 <john.ye@intel.com>
*/
#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