[PATCH dri2proto] RFC: video support for dri2

Rob Clark robdclark at gmail.com
Thu Aug 18 19:58:07 PDT 2011


From: Rob Clark <rob at ti.com>

To allow the potential use of overlays to display video content, a few
extra parameters are required:

 + source buffer in different format (for example, various YUV formats)
   and size as compared to destination drawable
 + multi-planar formats where discontiguous buffers are used for
   different planes.  For example, luma and chroma split across
   multiple memory banks or with different tiled formats.
 + flipping between multiple back buffers, perhaps not in order (to
   handle video formats with B-frames)
 + cropping during swap.. in case of video, perhaps the required hw
   buffers are larger than the visible picture to account for codec
   borders (for example, reference frames where a block/macroblock
   moves past the edge of the visible picture, but back again in
   subsequent frames).

Current solutions use the GPU to do a scaled/colorconvert into a DRI2
buffer from the client context.  The goal of this protocol change is
to push the decision to use overlay or GPU blit to the xorg driver.
---
Eventually this should replace Xv.  With a few additions, like attributes,
it could perhaps be possible to implement the client side Xv API on top
of dri2.

Note: video is not exactly the same as 3d, there are a number of other
things to consider (scaling, colorconvert, multi-planar formats).  But
on the other hand the principle is similar (direct rendering from hw
video codecs).  And a lot infrastructure of connection, authentication,
is same.  So there are two options, either extend DRI2 or add a new
protocol which duplicates some parts.  I'd like to consider extending
DRI2 first, but if people think the requirements for video are too
much different from 3d, then I could split this into a new protocol.

In either case, I will implement the xserver side infrastructure, but
I wanted to get some feel for what is the preferred approach (extend
dri2 or new videoproto) first.

 dri2proto.txt |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 59 insertions(+), 1 deletions(-)

diff --git a/dri2proto.txt b/dri2proto.txt
index df763c7..aa83b1a 100644
--- a/dri2proto.txt
+++ b/dri2proto.txt
@@ -163,7 +163,8 @@ and DRI2InvalidateBuffers.
 6. Protocol Types
 
 DRI2DRIVER { DRI2DriverDRI
-	     DRI2DriverVDPAU }
+	     DRI2DriverVDPAU,
+	     DRI2DriverXV }
 
 	These values describe the type of driver the client will want
 	to load.  The server sends back the name of the driver to use
@@ -184,6 +185,10 @@ DRI2ATTACHMENT { DRI2BufferFrontLeft
 	These values describe various attachment points for DRI2
 	buffers.
 
+	In the case of video driver (DRI2DriverXV) the attachment,
+	other than DRI2BufferFrontLeft, just indicates buffer
+	number and has no other special significance.
+
 DRI2BUFFER { attachment: CARD32
     	     name: CARD32
 	     pitch: CARD32
@@ -203,6 +208,16 @@ DRI2ATTACH_FORMAT { attachment: CARD32
 	format.  'attachment' describes the attachment point for the buffer,
 	'format' describes an opaque, device-dependent format for the buffer.
 
+
+DRI2ATTACH_VIDEO { attachment: CARD32
+		    format:     CARD32,
+		    width, height:	CARD32 }
+
+	The DRI2ATTACH_VIDEO describes an attachment and the associated
+	format for video buffers.  'attachment' describes the attachment
+	point for the buffer, 'format' describes a fourcc value for the
+	buffer.
+
 			     ⚙ ⚙ ⚙  ⚙ ⚙ ⚙
 
 
@@ -367,6 +382,15 @@ The name of this extension is "DRI2".
 	later.
 
 ┌───
+    DRI2GetVideoBuffers
+	drawable: DRAWABLE
+	attachments: LISTofDRI2ATTACH_VIDEO
+      ▶
+	width, height: CARD32
+	buffers: LISTofDRI2BUFFER
+└───
+
+┌───
     DRI2GetMSC
 	drawable: DRAWABLE
       ▶
@@ -585,11 +609,21 @@ A.1 Common Types
 	4	CARD32	pitch
 	4	CARD32	cpp
 	4	CARD32	flags
+	4	n	extra names length
+	4n	LISTof	extra names
 └───
 	A DRI2 buffer specifies the attachment, the kernel memory
 	manager name, the pitch and chars per pixel for a buffer
 	attached to a given drawable.
 
+	In case of multi-planar video formats, 'extra names' will give the
+	list of additional buffer names if there is one buffer per plane.
+	For example, I420 has one Y plane in with a 8bit luma value per
+	pixel, followed by one U plane subsampled 2x2 (with one 8bit U value
+	per 2x2 pixel block), followed by one V plane subsampled 2x2.  This
+	could either be represented as a single buffer name, or three
+	separate buffer names, one each for Y, U, and V.
+
 ┌───
     DRI2ATTACH_FORMAT
 	4	CARD32	attachment
@@ -599,6 +633,17 @@ A.1 Common Types
 	This data type is only available with protocol version 1.1 or
 	later.
 
+┌───
+    DRI2ATTACH_VIDEO
+	4	CARD32	attachment
+	4	CARD32	format
+	4	CARD32	width
+	4	CARD32	height
+└───
+	Used to describe the attachment and format requested from the server.
+	This data type is only available with protocol version 1.? or
+	later.
+
 A.2 Protocol Requests
 
 ┌───
@@ -745,6 +790,11 @@ A.2 Protocol Requests
 	4	CARD32			divisor_lo
 	4	CARD32			remainder_hi
 	4	CARD32			remainder_lo
+	4	DRI2ATTACHMENT		source
+	4	CARD32			x1
+	4	CARD32			y1
+	4	CARD32			x2
+	4	CARD32			y2
       ▶	
 	1	1			Reply
         1				unused
@@ -754,6 +804,14 @@ A.2 Protocol Requests
 	4	CARD32			swap_lo
 	5n	LISTofDRI2BUFFER	buffers
 └───
+	The 'source', if not zero (DRI2BufferFrontLeft) indicates the
+	attachment point of the buffer to swap w/ DRI2BufferFrontLeft.
+	If zero is specified, DRI2BufferBackLeft is swapped with the
+	DRI2BufferFrontLeft buffer, for compatibility.
+
+	If 'source' is not zero, (x1,y1), (x2,y2) specify the bounding
+	box in coordinates of the source buffer which should be scaled
+	to (0,0), (width,height) of the destination drawable.
 
 ┌───
     DRI2GetMSC
-- 
1.7.5.4



More information about the xorg-devel mailing list