Skip to content

Commit

Permalink
va:Add PRIME3 defination
Browse files Browse the repository at this point in the history
Add PRIME3 memory type defination to support create surface with extra flags.
  • Loading branch information
lixin5x committed Dec 8, 2023
1 parent 633746e commit bb45577
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 1 deletion.
55 changes: 55 additions & 0 deletions va/va_drmcommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#define VA_DRM_COMMON_H

#include <stdint.h>
#include <va/va.h>


/** \brief DRM authentication type. */
Expand Down Expand Up @@ -86,6 +87,11 @@ struct drm_state {
* Used with VADRMPRIMESurfaceDescriptor.
*/
#define VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2 0x40000000
/** \brief DRM PRIME3 memory type
*
* Used with VADRMPRIME3SurfaceDescriptor.
*/
#define VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_3 0x80000000

/**
* \brief External buffer descriptor for a DRM PRIME surface.
Expand Down Expand Up @@ -158,6 +164,55 @@ typedef struct _VADRMPRIMESurfaceDescriptor {
} layers[4];
} VADRMPRIMESurfaceDescriptor;

/**
* \brief External buffer descriptor for a DRM PRIME surface with flags
*
* This structure is an extention for VADRMPRIMESurfaceDescriptor,
* it has the same behavior as if used with VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2.
*
* The field "flags" is added, see "Surface external buffer descriptor flags".
* To use this structure, use VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_3 instead.
*/
typedef struct _VADRMPRIME3SurfaceDescriptor {
/** Pixel format fourcc of the whole surface (VA_FOURCC_*). */
uint32_t fourcc;
/** Width of the surface in pixels. */
uint32_t width;
/** Height of the surface in pixels. */
uint32_t height;
/** Number of distinct DRM objects making up the surface. */
uint32_t num_objects;
/** Description of each object. */
struct {
/** DRM PRIME file descriptor for this object. */
int fd;
/** Total size of this object (may include regions which are
* not part of the surface). */
uint32_t size;
/** Format modifier applied to this object. */
uint64_t drm_format_modifier;
} objects[4];
/** Number of layers making up the surface. */
uint32_t num_layers;
/** Description of each layer in the surface. */
struct {
/** DRM format fourcc of this layer (DRM_FOURCC_*). */
uint32_t drm_format;
/** Number of planes in this layer. */
uint32_t num_planes;
/** Index in the objects array of the object containing each
* plane. */
uint32_t object_index[4];
/** Offset within the object of each plane. */
uint32_t offset[4];
/** Pitch of each plane. */
uint32_t pitch[4];
} layers[4];
/** \brief flags. See "Surface external buffer descriptor flags". */
uint32_t flags;
/** reserved bytes, must be zero */
uint32_t reserved[VA_PADDING_MEDIUM + 1];
} VADRMPRIME3SurfaceDescriptor;
/**
* \brief List of DRM format modifiers.
*
Expand Down
27 changes: 26 additions & 1 deletion va/va_trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -1255,6 +1255,31 @@ static void va_TraceSurfaceAttributes(
va_TraceMsg(trace_ctx, "\t\t\t\tlayers[%d].pitch[%d]=0x%d\n", j, k, tmp->layers[j].pitch[k]);
}
}
} else if (memtype == VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_3) {
VADRMPRIME3SurfaceDescriptor *tmp = (VADRMPRIME3SurfaceDescriptor *) p->value.value.p;
uint32_t j, k;

va_TraceMsg(trace_ctx, "\t\t--VADRMPRIME3SurfaceDescriptor\n");
va_TraceMsg(trace_ctx, "\t\t pixel_format=0x%08x\n", tmp->fourcc);
va_TraceMsg(trace_ctx, "\t\t width=%d\n", tmp->width);
va_TraceMsg(trace_ctx, "\t\t height=%d\n", tmp->height);
va_TraceMsg(trace_ctx, "\t\t num_objects=0x%08x\n", tmp->num_objects);
va_TraceMsg(trace_ctx, "\t\t flags=0x%08x\n", tmp->flags);
for (j = 0; j < tmp->num_objects && tmp->num_objects <= 4; j++) {
va_TraceMsg(trace_ctx, "\t\t\tobjects[%d].fd=%d\n", j, tmp->objects[j].fd);
va_TraceMsg(trace_ctx, "\t\t\tobjects[%d].size=%d\n", j, tmp->objects[j].size);
va_TraceMsg(trace_ctx, "\t\t\tobjects[%d].drm_format_modifier=%llx\n", j, tmp->objects[j].drm_format_modifier);
}
va_TraceMsg(trace_ctx, "\t\t num_layers=%d\n", tmp->num_layers);
for (j = 0; j < tmp->num_layers && tmp->num_layers <= 4; j++) {
va_TraceMsg(trace_ctx, "\t\t\tlayers[%d].drm_format=0x%08x\n", j, tmp->layers[j].drm_format);
va_TraceMsg(trace_ctx, "\t\t\tlayers[%d].num_planes=0x%d\n", j, tmp->layers[j].num_planes);
for (k = 0; k < 4; k++) {
va_TraceMsg(trace_ctx, "\t\t\t\tlayers[%d].object_index[%d]=0x%d\n", j, k, tmp->layers[j].object_index[k]);
va_TraceMsg(trace_ctx, "\t\t\t\tlayers[%d].offset[%d]=0x%d\n", j, k, tmp->layers[j].offset[k]);
va_TraceMsg(trace_ctx, "\t\t\t\tlayers[%d].pitch[%d]=0x%d\n", j, k, tmp->layers[j].pitch[k]);
}
}
#if defined(_WIN32)
} else if (memtype == VA_SURFACE_ATTRIB_MEM_TYPE_NTHANDLE) {
va_TraceMsg(trace_ctx, "\t\t--Win32 %d surfaces\n", num_surfaces);
Expand Down Expand Up @@ -6336,7 +6361,7 @@ void va_TraceExportSurfaceHandle(
va_TraceMsg(trace_ctx, "\tmemType = 0x%08x\n", memType);
va_TraceMsg(trace_ctx, "\tflags = 0x%08x\n", flags);

if (memType != VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2) {
if (memType != VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2 && memType != VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_3) {
DPY2TRACE_VIRCTX_EXIT(pva_trace);
return;
}
Expand Down

0 comments on commit bb45577

Please sign in to comment.