Jetson Linux API 参考文档

32.7.4 版本
NvDrmRenderer.h
前往此文件的文档。
1 /*
2  * 版权所有 (c) 2016-2017, NVIDIA CORPORATION。保留所有权利。
3  * NVIDIA CORPORATION 及其许可方保留本软件及其相关文档中的所有知识产权
4  * 和专有权利,以及对其所做的任何修改。未经 NVIDIA CORPORATION 明确的
5  * 许可协议,严禁使用、复制、披露或
6  * 分发本软件和相关文档。
7  * 来自 NVIDIA CORPORATION 的许可协议。
8  */
9 
17 #ifndef __NV_DRM_RENDERER_H__
18 #define __NV_DRM_RENDERER_H__
19 
20 #include "NvElement.h"
21 #include <stdint.h>
22 #include <pthread.h>
23 #include <queue>
24 #include <unordered_map>
25 
35 typedef struct _NvDrmBO {
36  uint32_t bo_handle;
37  int width;
38  int height;
39  int pitch;
40  uint8_t* data;
41 } NvDrmBO;
42 
44 typedef struct _NvDrmFB {
45  uint32_t fb_id;
46  int width;
47  int height;
48  int format;
51  NvDrmBO bo[4];
54 } NvDrmFB;
55 
56 
68 {
69 public
86  static NvDrmRenderer *createDrmRenderer(const char *name, uint32_t width,
87  uint32_t height, uint32_t w_x, uint32_t w_y,
88  uint32_t connector, uint32_t crtc,
89  struct drm_tegra_hdr_metadata_smpte_2086 metadata,
90  bool streamHDR);
92 
104  int enqueBuffer(int fd);
105 
116  int dequeBuffer();
117 
126  int setFPS(float fps);
127 
135  bool enableUniversalPlanes(int enable);
136 
152  uint32_t createDumbFB(uint32_t width, uint32_t height, uint32_t drm_format, NvDrmFB *fb);
153 
161  int removeFB(uint32_t fb_id);
162 
163 
172  int drmUtilCloseGemBo(int fd, uint32_t bo_handle);
173 
202  int setPlane(uint32_t pl_index,
203  uint32_t fb_id,
204  uint32_t crtc_x,
205  uint32_t crtc_y,
206  uint32_t crtc_w,
207  uint32_t crtc_h,
208  uint32_t src_x,
209  uint32_t src_y,
210  uint32_t src_w,
211  uint32_t src_h);
212 
224  int getPlaneCount();
225 
239  int getPlaneIndex(uint32_t crtc_index,
240  int32_t* plane_index);
241 
247  int getCrtcCount();
248 
254  int getEncoderCount();
255 
261  bool hdrSupported();
262 
268  int setHDRMetadataSmpte2086(struct drm_tegra_hdr_metadata_smpte_2086);
269 
270 private
271 
272  struct timespec last_render_time;
274  int drm_fd;
275  int conn, crtc;
276  uint32_t width, height;
277  uint32_t drm_conn_id;
278  uint32_t drm_enc_id;
279  uint32_t drm_crtc_id;
280  uint32_t last_fb;
281  int activeFd;
282  int flippedFd;
283  bool flipPending;
284  bool renderingStarted;
285  bool is_nvidia_drm;
286 
287  uint32_t hdrBlobId;
288  bool hdrBlobCreated;
289 
290  std::queue<int> freeBuffers;
291  std::queue<int> pendingBuffers;
292  std::unordered_map <int, int> map_list;
293 
294  bool stop_thread;
296  pthread_t render_thread;
298  pthread_mutex_t render_lock;
299  pthread_cond_t render_cond;
300  pthread_mutex_t enqueue_lock;
301  pthread_cond_t enqueue_cond;
302  pthread_mutex_t dequeue_lock;
303  pthread_cond_t dequeue_cond;
305  float fps;
306  uint64_t render_time_sec;
308  uint64_t render_time_nsec;
327  NvDrmRenderer(const char *name, uint32_t width, uint32_t height,
328  uint32_t w_x, uint32_t w_y, uint32_t connector, uint32_t crtc,
329  struct drm_tegra_hdr_metadata_smpte_2086 metadata, bool streamHDR);
330 
340  static void * renderThread(void *arg);
341  static void * renderThreadOrin(void *arg);
342 
347  static void page_flip_handler(int fd, unsigned int frame,
348  unsigned int sec, unsigned int usec, void *data);
349 
356  int renderInternal(int fd);
357 
358  /*
359  * 返回 DRM buffer_object 句柄。
360  *
361  * \param[in] w 窗口宽度,单位为像素。
362  * \param[in] h 窗口高度,单位为像素。
363  * \param[in] bpp 窗口中每像素位数。
364  * \param[in] bo 指向 buffer object 句柄的指针。
365  * \return 已分配的尺寸为 (w,h) 的 DRM buffer_object 句柄
366  */
367  int createDumbBO(int w, int h, int bpp, NvDrmBO *bo);
368 
369  static const NvElementProfiler::ProfilerField valid_fields =
373 };
374 
376 #endif
_NvDrmBO::width
int width
保存 DRM 缓冲区的宽度,以像素为单位。
Definition: NvDrmRenderer.h:37
NvElementProfiler::PROFILER_FIELD_LATE_UNITS
static const ProfilerField PROFILER_FIELD_LATE_UNITS
Definition: NvElementProfiler.h:82
NvDrmRenderer::hdrSupported
bool hdrSupported()
检查 DRM 渲染器是否支持 HDR 模式。
_NvDrmBO::pitch
int pitch
保存 DRM 缓冲区的步幅/pitch。
Definition: NvDrmRenderer.h:39
NvElementProfiler::ProfilerField
int ProfilerField
Definition: NvElementProfiler.h:79
NvDrmRenderer::dequeBuffer
int dequeBuffer()
出队先前渲染的缓冲区。
_NvDrmFB::num_buffers
int num_buffers
保存 DRM 缓冲区的数量,这取决于缓冲区格式。
Definition: NvDrmRenderer.h:52
_NvDrmFB::height
int height
保存帧的高度,以像素为单位。
Definition: NvDrmRenderer.h:47
_NvDrmBO::data
uint8_t * data
保存映射的 CPU 可访问地址。
Definition: NvDrmRenderer.h:40
_NvDrmFB::width
int width
保存帧的宽度,以像素为单位。
Definition: NvDrmRenderer.h:46
NvDrmRenderer::enableUniversalPlanes
bool enableUniversalPlanes(int enable)
启用/禁用 DRM 通用平面客户端功能,例如 DRM_CLIENT_CAP_UNIVERSAL_PLANES。
_NvDrmBO::height
int height
保存 DRM 缓冲区的高度,以像素为单位。
Definition: NvDrmRenderer.h:38
NvDrmFB
struct _NvDrmFB NvDrmFB
保存有关帧的信息。
_NvDrmFB::bo
NvDrmBO bo[4]
保存 DRM 缓冲区句柄。
Definition: NvDrmRenderer.h:51
NvDrmRenderer::setFPS
int setFPS(float fps)
设置渲染速率,以帧/秒为单位。
NvDrmRenderer::createDumbFB
uint32_t createDumbFB(uint32_t width, uint32_t height, uint32_t drm_format, NvDrmFB *fb)
分配尺寸为 (w, h) 的帧缓冲区。
_NvDrmFB::format
int format
保存帧格式,例如 DRM_FORMAT_RGB332。
Definition: NvDrmRenderer.h:48
NvDrmRenderer::getPlaneCount
int getPlaneCount()
获取可用的平面总数。
NvDrmRenderer::getEncoderCount
int getEncoderCount()
获取可用编码器的计数。
NvDrmRenderer::drmUtilCloseGemBo
int drmUtilCloseGemBo(int fd, uint32_t bo_handle)
关闭 GEM (图形执行管理器) 句柄。
NvDrmRenderer::createDrmRenderer
static NvDrmRenderer * createDrmRenderer(const char *name, uint32_t width, uint32_t height, uint32_t w_x, uint32_t w_y, uint32_t connector, uint32_t crtc, struct drm_tegra_hdr_metadata_smpte_2086 metadata, bool streamHDR)
创建新的名为 name 的基于 DRM 的渲染器。
_NvDrmFB
保存有关帧的信息。
Definition: NvDrmRenderer.h:44
_NvDrmBO
保存 buffer object 句柄。
Definition: NvDrmRenderer.h:35
NvDrmRenderer::setHDRMetadataSmpte2086
int setHDRMetadataSmpte2086(struct drm_tegra_hdr_metadata_smpte_2086)
设置从解码器检索的 HDR 元数据。
NvElementProfiler::PROFILER_FIELD_FPS
static const ProfilerField PROFILER_FIELD_FPS
Definition: NvElementProfiler.h:84
NvDrmRenderer::setPlane
int setPlane(uint32_t pl_index, uint32_t fb_id, uint32_t crtc_x, uint32_t crtc_y, uint32_t crtc_w, uint32_t crtc_h, uint32_t src_x, uint32_t src_y, uint32_t src_w, uint32_t src_h)
更改平面的帧缓冲区和位置。
NvElement
每个元素都有一个唯一的名称,可用于在调试日志中标识元素。
Definition: NvElement.h:63
NvDrmRenderer::~NvDrmRenderer
~NvDrmRenderer()
_NvDrmBO::bo_handle
uint32_t bo_handle
保存 DRM 缓冲区索引。
Definition: NvDrmRenderer.h:36
NvElementProfiler::PROFILER_FIELD_TOTAL_UNITS
static const ProfilerField PROFILER_FIELD_TOTAL_UNITS
Definition: NvElementProfiler.h:81
NvDrmBO
struct _NvDrmBO NvDrmBO
保存 buffer object 句柄。
NvDrmRenderer::removeFB
int removeFB(uint32_t fb_id)
销毁(释放)先前由 createDumbFB() 分配的帧缓冲区。
NvElement.h
NvDrmRenderer::getPlaneIndex
int getPlaneIndex(uint32_t crtc_index, int32_t *plane_index)
获取给定 crtc 索引支持的平面索引。
NvDrmRenderer
用于使用 LibDRM 进行渲染的辅助类。
Definition: NvDrmRenderer.h:67
_NvDrmFB::fb_id
uint32_t fb_id
保存帧 ID。
Definition: NvDrmRenderer.h:45
NvDrmRenderer::enqueBuffer
int enqueBuffer(int fd)
入队缓冲区文件描述符以进行渲染。
NvDrmRenderer::getCrtcCount
int getCrtcCount()
获取可用 CRTC 的计数。
. All rights reserved.