blob: 3ea74927ac6412359e3ed4076f27ef61b5732013 [file] [log] [blame]
Name
NV_video_output
Name Strings
GLX_NV_video_out
Contact
Thomas True, Nvidia, ttrue@nvidia.com
Ian Williams, Nvidia, iwilliams@nvidia.com
Martin Schwarzer, Nvidia, mschwarzer@nvidia.com
Andy Ritger, Nvidia, aritger@nvidia.com
Status
Shipping since 2004 for NVIDIA Quadro SDI (Serial Digital Interface)
Version
Last Modified: 2014/06/04
NVIDIA Revision: 8
Number
348
Dependencies
OpenGL 1.1 is required.
GLX 1.3 is required.
Overview
This extension permits a color and or depth buffer of a pbuffer to
be used for rendering and subsequent video output. After a pbuffer
has been bound to a video device, subsequent color and or depth
rendering into that buffer may be displayed on the video output.
This is intended for use with NVIDIA products such as the Quadro FX
4000 SDI.
Issues
1. Should the new pbuffer attributes be available through GL queries?
No, like other pbuffer attributes you need to query them through the
window system extension. This extension does not make any changes to
OpenGL.
2. Should glXSendPbufferToVideoNV require that the pbuffer be current?
Implementation Notes
1. Any created pbuffers must be the same resolution as that specified
by the state of the video output device. The current state of the
video output device can be queried via the NV-CONTROL X extension.
2. Applications may use a single pbuffer or a collection of pbuffers
to send frames/fields to a video device. In the first case, an
application should block on the call to glXSendPbufferToVideoNV() to
ensure synchronization. In the second case, an application should
utilize glXGetVideoInfoNV() in order to query vblank and
buffer counters for synchronization.
Intended Usage
1) Configure the video output device via the NV-CONTROL X extension.
2) Use glXGetFBConfigs or glXChooseFBConfig to find a suitable
FBConfig for rendering images. GLX_DRAWABLE_TYPE must have
GLX_PBUFFER_BIT set. The per-component pixel depth of the pbuffer
must be equal to or greater than the per-component depth of the
video output.
3) Create a GLXPbuffer for each stream of video by calling
glXCreatePbuffer. Set the width and height for each GLXPbuffer
to match that of the intended video output device.
4) Call glXGetVideoDeviceNV to retrieve the handles for all
video devices available. A video device handle is required
for each video stream. glXGetVideoDeviceNV will lock the
video device for exclusive use by this GLX client. The NV-CONTROL
X extension will not be able to update video out attributes until
the video device is released with glXReleaseVideoDeviceNV.
5) Call glXBindVideoImageNV to bind each GLXPbuffer to a
corresponding video device handle. Multiple pbuffers can
be bound, at the same time, to the same video device.
6) Render the current frame/field for each stream to one of the bound
GLXPbuffers. Once rendering is complete, call
glXSendPbufferToVideoNV to send each frame/field to the video
device.
7) Render subsequent video frames or fields calling
glXSendPbufferToVideoNV() at the completion of rendering for
each frame/field.
8) Call glXReleaseVideoImageNV to unbind each GLXPbuffer
from its associated video device.
9) Call glXReleaseVideoDeviceNV to release the video device.
New Types
/*
* GLXVideoDeviceNV is an opaque handle to a video device.
*/
typedef unsigned int GLXVideoDeviceNV;
New Procedures and Functions
int glXGetVideoDeviceNV(Display *dpy, int screen, int numVideoDevices,
GLXVideoDeviceNV *pVideoDevice);
int glXReleaseVideoDeviceNV(Display *dpy, int screen,
GLXVideoDeviceNV VideoDevice);
int glXBindVideoImageNV(Display *dpy, GLXVideoDeviceNV VideoDevice,
GLXPbuffer pbuf, int iVideoBuffer);
int glXReleaseVideoImageNV(Display *dpy, GLXPbuffer pbuf);
int glXSendPbufferToVideoNV(Display *dpy, GLXPbuffer pbuf,
int iBufferType,
unsigned long *pulCounterPbuffer,
GLboolean bBlock);
int glXGetVideoInfoNV(Display *dpy, int screen,
GLXVideoDeviceNV VideoDevice,
unsigned long *pulCounterOutputPbuffer,
unsigned long *pulCounterOutputVideo);
New Tokens
Accepted by the <iVideoBuffer> parameter of glXBindVideoImageNV:
GLX_VIDEO_OUT_COLOR_NV 0x20C3
GLX_VIDEO_OUT_ALPHA_NV 0x20C4
GLX_VIDEO_OUT_DEPTH_NV 0x20C5
GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6
GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7
Accepted by the <iBufferType> parameter of glXSendPbufferToVideoNV:
GLX_VIDEO_OUT_FRAME_NV 0x20C8
GLX_VIDEO_OUT_FIELD_1_NV 0x20C9
GLX_VIDEO_OUT_FIELD_2_NV 0x20CA
GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB
GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC
Additions to Chapter 2 of the OpenGL 1.2.1 Specification (OpenGL Operation)
None.
Additions to Chapter 3 of the OpenGL 1.2.1 Specification (Rasterization)
None.
Additions to Chapter 4 of the OpenGL 1.2.1 Specification (Per-Fragment
Operations and the Frame Buffer)
None.
Additions to Chapter 5 of the OpenGL 1.2.1 Specification (Special Functions)
None.
Additions to Chapter 6 of the OpenGL 1.2.1 Specification (State and State
Requests)
None.
Additions to the GLX 1.3 Specification
[Add new section, Video Out]
Video out functions permit color and depth buffers from a
pbuffer to be sent to a video output device.
The command
int glXGetVideoDeviceNV(Display *dpy, int screen, int numVideoDevices,
GLXVideoDeviceNV *pVideoDevice);
fills in the array <pVideoDevice> with up to <numVideoDevices>
handles to the available video devices. <numVideoDevices> must be
non-negative, and <pVideoDevice> must not be NULL.
It is not an error if the number of available video devices is larger
that <numVideoDevices>; in that case the first <numVideoDevices>
device handles are returned. It is an error if <numVideoDevices>
is larger than the number of available video devices. The order of
devices returned in <pVideoDevice> is implementation dependent.
If glXGetVideoDeviceNV succeeds, 0 is returned. Otherwise, a non-zero
error code is returned.
The command
int glXReleaseVideoDeviceNV(Display *dpy, int screen,
GLXVideoDeviceNV VideoDevice);
releases all resources associated with <VideoDevice>.
If glXReleaseVideoDeviceNV succeeds, 0 is returned. Otherwise,
a non-zero error code is returned.
The command
int glXBindVideoImageNV(Display *dpy, GLXVideoDeviceNV VideoDevice,
GLXPbuffer pbuf, int iVideoBuffer);
binds <pbuf> to <VideoDevice> for subsequent scanout where
<iVideoBuffer> specifies that <pbuf> contains color, alpha and/or
depth data. Valid values for <iVideoBuffer> are:
GLX_VIDEO_OUT_COLOR_NV 0x20C3
GLX_VIDEO_OUT_ALPHA_NV 0x20C4
GLX_VIDEO_OUT_DEPTH_NV 0x20C5
GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6
GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7
<pbuf> cannot be None, and <VideoDevice> must be a VideoDevice
returned by glXGetVideoDeviceNV().
A pbuffer can only be bound to one GLXVideoDeviceNV at a time.
If <pbuf> is already bound to a different GLXVideoDeviceNV, then
glXBindVideoImageNV will fail.
If glXBindVideoImageNV succeeds, 0 is returned. Otherwise,
a non-zero error code is returned.
The command
int glXReleaseVideoImageNV(Display *dpy, GLXPbuffer pbuf);
releases <pbuf> from a previously bound video device. <pbuf> may
not be None.
If glXReleaseVideoImageNV succeeds, 0 is returned. Otherwise,
a non-zero error code is returned.
The command
int glXSendPbufferToVideoNV(Display *dpy, GLXPbuffer pbuf,
int iBufferType,
unsigned long *pulCounterPbuffer,
Bool bBlock);
indicates that rendering to the <pbuf> is complete and that the
completed frame/field contained with <pbuf> is ready for scan out by
the video device where <iBufferType> specifies that <pbuf> contains
the first field, second field or a complete frame. Valid values
for <iBufferType> are:
GLX_VIDEO_OUT_FRAME_NV 0x20C8
GLX_VIDEO_OUT_FIELD_1_NV 0x20C9
GLX_VIDEO_OUT_FIELD_2_NV 0x20CA
The color buffer controlled by glReadBuffer is used as the color
buffer input to glXSendPbufferToVideoNV(). <pbuf> cannot be None.
The <bBlock> argument specifies whether or not the call should
block until scan out of the specified frame/field is complete.
<pulCounterPbuffer> returns the total number of frames/fields sent
to the video device.
If glXSendPbufferToVideoNV succeeds, 0 is returned. Otherwise,
a non-zero error code is returned.
The command
int glXGetVideoInfoNV(GLXVideoDeviceNV VideoDevice,
unsigned long *pulCounterOutputPbuffer,
unsigned long *pulCounterOutputVideo);
returns in <pulCounterOutputVideo> the absolute count of vertical
blanks on <VideoDevice> since transfers were started while
<pulCounterOutputPbuffer> returns the count of the current pbuffer
being scanned out by <VideoDevice>.
If glXGetVideoInfoNV succeeds, 0 is returned. Otherwise, a non-zero
error code is returned.
GLX Protocol
Six new GLX protocol commands are added.
GetVideoDeviceNV
1 CARD8 opcode (X assigned)
1 17 GLX opcode (glXVendorPrivateWithReply)
2 5 request length
4 1313 vendor specific opcode
4 unused
4 CARD32 num_devices
4 CARD32 screen
=>
1 CARD8 reply
1 unused
2 CARD16 sequence number
4 n reply length
4 CARD32 status
4 CARD32 num_devices
16 unused
4 * n CARD32 video_device handles
Where n is the number of device handles returned.
ReleaseVideoDeviceNV
1 CARD8 opcode (X assigned)
1 17 GLX opcode (glXVendorPrivateWithReply)
2 5 request length
4 1314 vendor specific opcode
4 unused
4 CARD32 video_device
4 CARD32 screen
=>
1 CARD8 reply
1 unused
2 CARD16 sequence number
4 0 reply length
4 CARD32 status
20 unused
BindVideoImageNV
1 CARD8 opcode (X assigned)
1 17 GLX opcode (glXVendorPrivateWithReply)
2 6 request length
4 1315 vendor specific opcode
4 unused
4 GLX_PBUFFER pbuffer
4 CARD32 video_device
4 CARD32 video_buffer
=>
1 CARD8 reply
1 unused
2 CARD16 sequence number
4 0 reply length
4 CARD32 status
20 unused
ReleaseVideoImageNV
1 CARD8 opcode (X assigned)
1 17 GLX opcode (glXVendorPrivateWithReply)
2 4 request length
4 1316 vendor specific opcode
4 GLX_PBUFFER pbuffer
=>
1 CARD8 reply
1 unused
2 CARD16 sequence number
4 0 reply length
4 CARD32 status
20 unused
SendPbufferToVideoNV
1 CARD8 opcode (X assigned)
1 17 GLX opcode (glXVendorPrivateWithReply)
2 6 request length
4 1317 vendor specific opcode
4 unused
4 GLX_PBUFFER pbuffer
4 CARD32 buffer_type
1 BOOL block
1 unused
2 unused
=>
1 CARD8 reply
1 unused
2 CARD16 sequence number
4 0 reply length
4 CARD32 status
4 CARD32 counter_pbuffer
16 unused
GetVideoInfoNV
1 CARD8 opcode (X assigned)
1 17 GLX opcode (glXVendorPrivateWithReply)
2 5 request length
4 1318 vendor specific opcode
4 CARD32 screen
4 CARD32 video_device
=>
1 CARD8 reply
1 unused
2 CARD16 sequence number
4 0 reply length
4 CARD32 status
4 CARD32 counter_video
4 CARD32 counter_pbuffer
12 unused
New State
None
New Implementation Dependent State
None
History
Revision 8, June 4, 2014 (jajones)
- Fix extension string to match implementation.
Revision 7, February 6, 2013 (pbrown)
- Fix GLX protocol section to remove the duplicate
opcode and match the implementation.
Revision 6, February 20, 2008
- Internal revisions.