/*
 * This source file is documented using Doxygen markup.
 * See http://www.stack.nl/~dimitri/doxygen/
 */

/*
 * This copyright notice applies to this header file:
 *
 * Copyright (c) 2008-2009 NVIDIA Corporation
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use,
 * copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following
 * conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 */

/**
 * \file vdpau_x11.h
 * \brief X11 Window System Integration Layer
 *
 * This file contains the \ref api_winsys_x11 X11 Window System
 * Integration Layer.
 */

#ifndef _VDPAU_X11_H
#define _VDPAU_X11_H

#include <X11/Xlib.h>
#include "vdpau.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * \ingroup api_winsys
 * @{
 */

/**
 * \defgroup api_winsys_x11 X11 Window System Integration Layer
 *
 * The set of VDPAU functionality specific to usage with the X
 * Window System.
 *
 * \section Driver Library Layout
 *
 * An X11-oriented VDPAU installation consists of the following
 * components:
 *
 * - Header files. These files are located in the standard
 *   system header file path.
 *   - \c vdpau/vdpau.h
 *   - \c vdpau/vdpau_x11.h
 * - The VDPAU wrapper library. These files are located in the
 *   standard system (possibly X11-specific) library path.
 *   - \c libvdpau.so.1 (runtime)
 *   - \c libvdpau.so (development)
 * - Back-end driver files. These files are located in a
 *   system-defined library path, which is configurable at compile
 *   time but is typically /usr/lib/vdpau.  Use `pkg-config
 *   --variable=moduledir vdpau` to locate the driver install path.
 *   - \c $moduledir/libvdpau_\%s.so.1
 *   For example:
 *   - \c /usr/lib/vdpau/libvdpau_nvidia.so.1
 *   - \c /usr/lib/vdpau/libvdpau_intel.so.1
 *   - \c /usr/lib/vdpau/libvdpau_ati.so.1
 *   The library path can be overridden by the VDPAU_DRIVER_PATH
 *   environment variable.
 *
 * The VDPAU wrapper library implements just one function; \ref
 * vdp_device_create_x11. The wrapper implements this function by
 * dynamically loading the appropriate back-end driver file mentioned
 * above. When available, the wrapper uses the DRI2 extension's
 * DRI2Connect request with the driver type 'DRI2DriverVDPAU' to
 * determine which back-end driver to load. If that fails, the wrapper
 * library hard-codes the driver name as "nvidia", although this can
 * be overridden using the environment variable VDPAU_DRIVER.
 *
 * The back-end driver is expected to implement a function named
 * \b vdp_imp_device_create_x11. The wrapper will call this function to
 * actually implement the \ref vdp_device_create_x11 application call.
 *
 * Note that it is theoretically possible for an application to
 * create multiple \ref VdpDevice "VdpDevice" objects. In this
 * case, the wrapper library may load multiple back-end drivers
 * into the same application, and/or invoke a specific back-end
 * driver's \b VdpImpDeviceCreateX11 multiple times. The wrapper
 * library imposes no policy regarding whether the application
 * may instantiate multiple \ref VdpDevice "VdpDevice" objects for
 * the same display and/or screen. However, back-end drivers are
 * free to limit the number of \ref VdpDevice "VdpDevice" objects
 * as required by their implementation.
 *
 * @{
 */

/**
 * \brief Create a VdpDevice object for use with X11.
 * \param[in] display The X Display that the VdpDevice VdpDevice
 *       will operate against.
 * \param[in] screen The X screen that the VdpDevice will operate
 *       against.
 * \param[out] device The new device's handle.
 * \param[out] get_proc_address The get_proc_address entry point
 *       to use with this device.
 * \return VdpStatus The completion status of the operation.
 */
typedef VdpStatus VdpDeviceCreateX11(
    Display *             display,
    int                   screen,
    /* output parameters follow */
    VdpDevice *           device,
    VdpGetProcAddress * * get_proc_address
);

/**
 * \brief Create a VdpDevice object for use with X11.
 * This is an actual symbol of type \ref VdpDeviceCreateX11
 *
 */
VdpDeviceCreateX11 vdp_device_create_x11;

/**
 * \brief Create a VdpPresentationQueueTarget for use with X11.
 * \param[in] device The device that will contain the queue
 *       target.
 * \param[in] drawable The X11 Drawable that the presentation
 *       queue will present into.
 * \param[out] target The new queue target's handle.
 * \return VdpStatus The completion status of the operation.
 *
 * Note: VDPAU expects to own the entire drawable for the duration of time
 * that the presentation queue target exists. In particular,
 * implementations may choose to manipulate client-visible X11 window state
 * as required. As such, it is recommended that applications create a
 * dedicated window for the presentation queue target, as a child
 * (grand-child, ...) of their top-level application window.
 *
 * Applications may also create child-windows of the presentation queue
 * target, which will cover any presented video in the normal fashion. VDPAU
 * implementations will not manipulate such child windows in any fashion.
 */
typedef VdpStatus VdpPresentationQueueTargetCreateX11(
    VdpDevice                   device,
    Drawable                    drawable,
    /* output parameters follow */
    VdpPresentationQueueTarget * target
);

/** \hideinitializer */
#define VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_CREATE_X11 (VdpFuncId)(VDP_FUNC_ID_BASE_WINSYS + 0)

/*@}*/
/*@}*/

#ifdef __cplusplus
}
#endif

#endif

