| 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. |
| |