dri_interface.h revision 5f1ba3e21b62cee1a4f900a2e6964728f3eeea9b
1192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/*
2192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
3192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * (C) Copyright IBM Corporation 2004
4192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * All Rights Reserved.
5192c988c7360d026a6f345b21acc2cdf41977915Brian Paul *
6192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
7192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * copy of this software and associated documentation files (the "Software"),
8192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * to deal in the Software without restriction, including without limitation
9192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * on the rights to use, copy, modify, merge, publish, distribute, sub
10192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * license, and/or sell copies of the Software, and to permit persons to whom
11192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * the Software is furnished to do so, subject to the following conditions:
12192c988c7360d026a6f345b21acc2cdf41977915Brian Paul *
13192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * The above copyright notice and this permission notice (including the next
14192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * paragraph) shall be included in all copies or substantial portions of the
15192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * Software.
16192c988c7360d026a6f345b21acc2cdf41977915Brian Paul *
17192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
20192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * THE COPYRIGHT HOLDERS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
21192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
22192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
23192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * USE OR OTHER DEALINGS IN THE SOFTWARE.
24192c988c7360d026a6f345b21acc2cdf41977915Brian Paul */
25192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
26192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/**
27192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \file dri_interface.h
28192c988c7360d026a6f345b21acc2cdf41977915Brian Paul *
29192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * This file contains all the types and functions that define the interface
30192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * between a DRI driver and driver loader.  Currently, the most common driver
31192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * loader is the XFree86 libGL.so.  However, other loaders do exist, and in
32192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * the future the server-side libglx.a will also be a loader.
33192c988c7360d026a6f345b21acc2cdf41977915Brian Paul *
34192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \author Kevin E. Martin <kevin@precisioninsight.com>
35192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \author Ian Romanick <idr@us.ibm.com>
36192c988c7360d026a6f345b21acc2cdf41977915Brian Paul */
37192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
3874d563cdfbfb07cc666d60dc909e90ddb9949cbbKeith Whitwell#ifndef DRI_INTERFACE_H
3974d563cdfbfb07cc666d60dc909e90ddb9949cbbKeith Whitwell#define DRI_INTERFACE_H
4074d563cdfbfb07cc666d60dc909e90ddb9949cbbKeith Whitwell
4160b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick#ifndef DRI_NEW_INTERFACE_ONLY
42318aa8409983f3292b4919196df2ca42f4de6a16Ian Romanick# include <X11/X.h>
43318aa8409983f3292b4919196df2ca42f4de6a16Ian Romanick# include <GL/glx.h>
44318aa8409983f3292b4919196df2ca42f4de6a16Ian Romanick# include "GL/glxint.h"
45192c988c7360d026a6f345b21acc2cdf41977915Brian Paul#endif
46192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
47192c988c7360d026a6f345b21acc2cdf41977915Brian Paul#include <GL/internal/glcore.h>
48192c988c7360d026a6f345b21acc2cdf41977915Brian Paul#include <xf86drm.h>
49fabe2b9ba38e95bd21a35b265bfc403fa3cb2883Ian Romanick#include <drm.h>
50192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
51192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/**
52192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \name DRI interface structures
53192c988c7360d026a6f345b21acc2cdf41977915Brian Paul *
54192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * The following structures define the interface between the GLX client
55192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * side library and the DRI (direct rendering infrastructure).
56192c988c7360d026a6f345b21acc2cdf41977915Brian Paul */
57192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/*@{*/
58192c988c7360d026a6f345b21acc2cdf41977915Brian Paultypedef struct __DRIdisplayRec  __DRIdisplay;
59192c988c7360d026a6f345b21acc2cdf41977915Brian Paultypedef struct __DRIscreenRec   __DRIscreen;
60192c988c7360d026a6f345b21acc2cdf41977915Brian Paultypedef struct __DRIcontextRec  __DRIcontext;
61192c988c7360d026a6f345b21acc2cdf41977915Brian Paultypedef struct __DRIdrawableRec __DRIdrawable;
62192c988c7360d026a6f345b21acc2cdf41977915Brian Paultypedef struct __DRIdriverRec   __DRIdriver;
63192c988c7360d026a6f345b21acc2cdf41977915Brian Paultypedef struct __DRIframebufferRec __DRIframebuffer;
64192c988c7360d026a6f345b21acc2cdf41977915Brian Paultypedef struct __DRIversionRec     __DRIversion;
655f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanicktypedef struct __DRIinterfaceMethodsRec  __DRIinterfaceMethods;
66192c988c7360d026a6f345b21acc2cdf41977915Brian Paultypedef unsigned long __DRIid;
6760b0e12830310e7c05b4043857ed277b28b1c781Ian Romanicktypedef void __DRInativeDisplay;
68192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/*@}*/
69192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
70192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
71192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/**
72192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \name Functions provided by the driver loader.
73192c988c7360d026a6f345b21acc2cdf41977915Brian Paul */
74192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/*@{*/
7560b0e12830310e7c05b4043857ed277b28b1c781Ian Romanickextern __DRIscreen *__glXFindDRIScreen(__DRInativeDisplay *dpy, int scrn);
76192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
77192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
78192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
79192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/**
80192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * Type of a pointer to \c glXGetScreenDriver, as returned by
81192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \c glXGetProcAddress.  This function is used to get the name of the DRI
82192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * driver for the specified screen of the specified display.  The driver
83192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * name is typically used with \c glXGetDriverConfig.
84192c988c7360d026a6f345b21acc2cdf41977915Brian Paul *
85192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \sa glXGetScreenDriver, glXGetProcAddress, glXGetDriverConfig
86192c988c7360d026a6f345b21acc2cdf41977915Brian Paul */
8760b0e12830310e7c05b4043857ed277b28b1c781Ian Romanicktypedef const char * (* PFNGLXGETSCREENDRIVERPROC) (__DRInativeDisplay *dpy, int scrNum);
88192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
89192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/**
90192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * Type of a pointer to \c glXGetDriverConfig, as returned by
91192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \c glXGetProcAddress.  This function is used to get the XML document
92192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * describing the configuration options available for the specified driver.
93192c988c7360d026a6f345b21acc2cdf41977915Brian Paul *
94192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \sa glXGetDriverConfig, glXGetProcAddress, glXGetScreenDriver
95192c988c7360d026a6f345b21acc2cdf41977915Brian Paul */
96192c988c7360d026a6f345b21acc2cdf41977915Brian Paultypedef const char * (* PFNGLXGETDRIVERCONFIGPROC) (const char *driverName);
97192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
98192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/**
99192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * Type of a pointer to \c __glXScrEnableExtension, as returned by
100192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \c glXGetProcAddress.  This function is used to enable a GLX extension
101192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * on the specified screen.
102192c988c7360d026a6f345b21acc2cdf41977915Brian Paul *
103192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \sa __glXScrEnableExtension, glXGetProcAddress
104192c988c7360d026a6f345b21acc2cdf41977915Brian Paul */
105192c988c7360d026a6f345b21acc2cdf41977915Brian Paultypedef void (* PFNGLXSCRENABLEEXTENSIONPROC) ( void *psc, const char * name );
106192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
107318aa8409983f3292b4919196df2ca42f4de6a16Ian Romanick
10886356155018fce96ba3367fd1a48a18cd6db3c40Alan Hourihane/* Test for the xf86dri.h header file */
10986356155018fce96ba3367fd1a48a18cd6db3c40Alan Hourihane#ifndef _XF86DRI_H_
110749e842953a9ea6e1c9070af7f7211bfc48aa1fdIan Romanickextern GLboolean XF86DRIDestroyContext( __DRInativeDisplay *dpy, int screen,
111318aa8409983f3292b4919196df2ca42f4de6a16Ian Romanick    __DRIid context_id );
112318aa8409983f3292b4919196df2ca42f4de6a16Ian Romanick
113749e842953a9ea6e1c9070af7f7211bfc48aa1fdIan Romanickextern GLboolean XF86DRICreateDrawable( __DRInativeDisplay *dpy, int screen,
114318aa8409983f3292b4919196df2ca42f4de6a16Ian Romanick    __DRIid drawable, drm_drawable_t *hHWDrawable );
115318aa8409983f3292b4919196df2ca42f4de6a16Ian Romanick
116749e842953a9ea6e1c9070af7f7211bfc48aa1fdIan Romanickextern GLboolean XF86DRIDestroyDrawable( __DRInativeDisplay *dpy, int screen,
117318aa8409983f3292b4919196df2ca42f4de6a16Ian Romanick    __DRIid drawable);
11886356155018fce96ba3367fd1a48a18cd6db3c40Alan Hourihane#endif
119192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/*@}*/
120192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
121192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
122192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/**
123192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \name Functions and data provided by the driver.
124192c988c7360d026a6f345b21acc2cdf41977915Brian Paul */
125192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/*@{*/
126192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
127c2bffec91a5b6ba72514c875b70dbc96ac97431dJon Smirltypedef void *(CREATENEWSCREENFUNC)(__DRInativeDisplay *dpy, int scrn,
128c2bffec91a5b6ba72514c875b70dbc96ac97431dJon Smirl    __DRIscreen *psc, const __GLcontextModes * modes,
129c2bffec91a5b6ba72514c875b70dbc96ac97431dJon Smirl    const __DRIversion * ddx_version, const __DRIversion * dri_version,
130c2bffec91a5b6ba72514c875b70dbc96ac97431dJon Smirl    const __DRIversion * drm_version, const __DRIframebuffer * frame_buffer,
131c2bffec91a5b6ba72514c875b70dbc96ac97431dJon Smirl    void * pSAREA, int fd, int internal_api_version,
1325f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    const __DRIinterfaceMethods * interface,
133c2bffec91a5b6ba72514c875b70dbc96ac97431dJon Smirl    __GLcontextModes ** driver_modes);
134c2bffec91a5b6ba72514c875b70dbc96ac97431dJon Smirltypedef CREATENEWSCREENFUNC* PFNCREATENEWSCREENFUNC;
1355f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanickextern CREATENEWSCREENFUNC __driCreateNewScreen_20050725;
136192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
137192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
138192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/**
139192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * XML document describing the configuration options supported by the
140192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * driver.
141192c988c7360d026a6f345b21acc2cdf41977915Brian Paul */
142192c988c7360d026a6f345b21acc2cdf41977915Brian Paulextern const char __driConfigOptions[];
143192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
144192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/*@}*/
145192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
146192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
147192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/**
148192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * Stored version of some component (i.e., server-side DRI module, kernel-side
149192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * DRM, etc.).
150192c988c7360d026a6f345b21acc2cdf41977915Brian Paul *
151192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \todo
152192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * There are several data structures that explicitly store a major version,
153192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * minor version, and patch level.  These structures should be modified to
154192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * have a \c __DRIversionRec instead.
155192c988c7360d026a6f345b21acc2cdf41977915Brian Paul */
156192c988c7360d026a6f345b21acc2cdf41977915Brian Paulstruct __DRIversionRec {
157192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    int    major;        /**< Major version number. */
158192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    int    minor;        /**< Minor version number. */
159192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    int    patch;        /**< Patch-level. */
160192c988c7360d026a6f345b21acc2cdf41977915Brian Paul};
161192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
1625f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
1635f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanicktypedef void (*__DRIfuncPtr)(void);
1645f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
1655f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanickstruct __DRIinterfaceMethodsRec {
1665f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /**
1675f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * Get pointer to named function.
1685f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     */
1695f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    __DRIfuncPtr (*getProcAddress)( const char * proc_name );
1705f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
1715f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /**
1725f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * Create a list of \c __GLcontextModes structures.
1735f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     */
1745f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    __GLcontextModes * (*createContextModes)(unsigned count,
1755f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick        size_t minimum_bytes_per_struct);
1765f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
1775f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /**
1785f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * Destroy a list of \c __GLcontextModes structures.
1795f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     *
1805f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * \todo
1815f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * Determine if the drivers actually need to call this.
1825f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     */
1835f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    void (*destroyContextModes)( __GLcontextModes * modes );
1845f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
1855f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /**
1865f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * Get the \c __DRIscreen for a given display and screen number.
1875f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     */
1885f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    __DRIscreen *(*getScreen)(__DRInativeDisplay *dpy, int screenNum);
1895f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
1905f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
1915f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /**
1925f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * \name Client/server protocol functions.
1935f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     *
1945f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * These functions implement the DRI client/server protocol for
1955f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * context and drawable operations.  Platforms that do not implement
1965f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * the wire protocol (e.g., EGL) will implement glorified no-op functions.
1975f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     */
1985f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /*@{*/
1995f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /**
2005f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * Determine if the specified window ID still exists.
2015f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     *
2025f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * \note
2035f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * Implementations may assume that the driver will only pass an ID into
2045f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * this function that actually corresponds to a window.  On
2055f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * implementations where windows can only be destroyed by the DRI driver
2065f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * (e.g., EGL), this function is allowed to always return \c GL_TRUE.
2075f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     */
2085f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    GLboolean (*windowExists)(__DRInativeDisplay *dpy, __DRIid draw);
2095f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
2105f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /**
2115f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * Create the server-side portion of the GL context.
2125f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     */
2135f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    GLboolean (* createContext)( __DRInativeDisplay *dpy, int screenNum,
2145f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick        int configID, void * contextID, drm_context_t * hw_context );
2155f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
2165f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /**
2175f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * Destroy the server-side portion of the GL context.
2185f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     */
2195f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    GLboolean (* destroyContext)( __DRInativeDisplay *dpy, int screenNum,
2205f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick        __DRIid context );
2215f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
2225f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /**
2235f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * Create the server-side portion of the drawable.
2245f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     */
2255f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    GLboolean (*createDrawable)( __DRInativeDisplay * ndpy, int screen,
2265f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick        __DRIid drawable, drm_drawable_t * hHWDrawable );
2275f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
2285f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /**
2295f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * Destroy the server-side portion of the drawable.
2305f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     */
2315f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    GLboolean (*destroyDrawable)( __DRInativeDisplay * ndpy, int screen,
2325f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick        __DRIid drawable );
2335f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
2345f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /**
2355f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * This function is used to get information about the position, size, and
2365f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * clip rects of a drawable.
2375f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     */
2385f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    GLboolean (* getDrawableInfo) ( __DRInativeDisplay *dpy, int scrn,
2395f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick        __DRIid draw, unsigned int * index, unsigned int * stamp,
2405f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick        int * x, int * y, int * width, int * height,
2415f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick        int * numClipRects, drm_clip_rect_t ** pClipRects,
2425f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick        int * backX, int * backY,
2435f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick        int * numBackClipRects, drm_clip_rect_t ** pBackClipRects );
2445f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /*@}*/
2455f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
2465f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
2475f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /**
2485f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * \name Timing related functions.
2495f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     */
2505f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /*@{*/
2515f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /**
2525f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * Get the 64-bit unadjusted system time (UST).
2535f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     */
2545f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    int (*getUST)(int64_t * ust);
2555f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
2565f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /**
2575f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * Get the media stream counter (MSC) rate.
2585f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     *
2595f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * Matching the definition in GLX_OML_sync_control, this function returns
2605f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * the rate of the "media stream counter".  In practical terms, this is
2615f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * the frame refresh rate of the display.
2625f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     */
2635f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    GLboolean (*getMSCRate)(__DRInativeDisplay * dpy, __DRIid drawable,
2645f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick        int32_t * numerator, int32_t * denominator);
2655f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick    /*@}*/
2665f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick};
2675f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
2685f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick
269192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/**
270192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * Framebuffer information record.  Used by libGL to communicate information
271192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * about the framebuffer to the driver's \c __driCreateNewScreen function.
272192c988c7360d026a6f345b21acc2cdf41977915Brian Paul *
273192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * In XFree86, most of this information is derrived from data returned by
274192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * calling \c XF86DRIGetDeviceInfo.
275192c988c7360d026a6f345b21acc2cdf41977915Brian Paul *
276192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \sa XF86DRIGetDeviceInfo __DRIdisplayRec::createNewScreen
277192c988c7360d026a6f345b21acc2cdf41977915Brian Paul *     __driUtilCreateNewScreen CallCreateNewScreen
278192c988c7360d026a6f345b21acc2cdf41977915Brian Paul *
279192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \bug This structure could be better named.
280192c988c7360d026a6f345b21acc2cdf41977915Brian Paul */
281192c988c7360d026a6f345b21acc2cdf41977915Brian Paulstruct __DRIframebufferRec {
282192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    unsigned char *base;    /**< Framebuffer base address in the CPU's
283192c988c7360d026a6f345b21acc2cdf41977915Brian Paul			     * address space.  This value is calculated by
284192c988c7360d026a6f345b21acc2cdf41977915Brian Paul			     * calling \c drmMap on the framebuffer handle
285192c988c7360d026a6f345b21acc2cdf41977915Brian Paul			     * returned by \c XF86DRIGetDeviceInfo (or a
286192c988c7360d026a6f345b21acc2cdf41977915Brian Paul			     * similar function).
287192c988c7360d026a6f345b21acc2cdf41977915Brian Paul			     */
288192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    int size;               /**< Framebuffer size, in bytes. */
289192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    int stride;             /**< Number of bytes from one line to the next. */
290192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    int width;              /**< Pixel width of the framebuffer. */
291192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    int height;             /**< Pixel height of the framebuffer. */
292192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    int dev_priv_size;      /**< Size of the driver's dev-priv structure. */
293192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    void *dev_priv;         /**< Pointer to the driver's dev-priv structure. */
294192c988c7360d026a6f345b21acc2cdf41977915Brian Paul};
295192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
296192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
297192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/**
298192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * Screen dependent methods.  This structure is initialized during the
299192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \c __DRIdisplayRec::createScreen call.
300192c988c7360d026a6f345b21acc2cdf41977915Brian Paul */
301192c988c7360d026a6f345b21acc2cdf41977915Brian Paulstruct __DRIscreenRec {
302192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
303192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Method to destroy the private DRI screen data.
304192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
30560b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    void (*destroyScreen)(__DRInativeDisplay *dpy, int scrn, void *screenPrivate);
306192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
307192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
308192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Method to create the private DRI drawable data and initialize the
309192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * drawable dependent methods.
310192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
31160b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    void *(*createNewDrawable)(__DRInativeDisplay *dpy, const __GLcontextModes *modes,
312fabe2b9ba38e95bd21a35b265bfc403fa3cb2883Ian Romanick			       __DRIid draw, __DRIdrawable *pdraw,
313192c988c7360d026a6f345b21acc2cdf41977915Brian Paul			       int renderType, const int *attrs);
314192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
315192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
316192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Method to return a pointer to the DRI drawable data.
317192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
31860b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    __DRIdrawable *(*getDrawable)(__DRInativeDisplay *dpy, __DRIid draw,
319192c988c7360d026a6f345b21acc2cdf41977915Brian Paul				  void *drawablePrivate);
320192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
321192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
322192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Opaque pointer to private per screen direct rendering data.  \c NULL
323192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * if direct rendering is not supported on this screen.  Never
324192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * dereferenced in libGL.
325192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
326192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    void *private;
327192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
328192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
329192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Get the number of vertical refreshes since some point in time before
330192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * this function was first called (i.e., system start up).
331192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     *
332192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * \since Internal API version 20030317.
333192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
334192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    int (*getMSC)( void *screenPrivate, int64_t *msc );
335192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
336192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
337192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Opaque pointer that points back to the containing
338192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * \c __GLXscreenConfigs.  This data structure is shared with DRI drivers
339192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * but \c __GLXscreenConfigs is not. However, they are needed by some GLX
340192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * functions called by DRI drivers.
341192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     *
342192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * \since Internal API version 20030813.
343192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
344192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    void *screenConfigs;
345192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
346192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
347192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Functions associated with MESA_allocate_memory.
348192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     *
349192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * \since Internal API version 20030815.
350192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
351192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /*@{*/
35260b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    void *(*allocateMemory)(__DRInativeDisplay *dpy, int scrn, GLsizei size,
353192c988c7360d026a6f345b21acc2cdf41977915Brian Paul			    GLfloat readfreq, GLfloat writefreq,
354192c988c7360d026a6f345b21acc2cdf41977915Brian Paul			    GLfloat priority);
355192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
35660b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    void (*freeMemory)(__DRInativeDisplay *dpy, int scrn, GLvoid *pointer);
357192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
35860b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    GLuint (*memoryOffset)(__DRInativeDisplay *dpy, int scrn, const GLvoid *pointer);
359192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /*@}*/
360192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
361192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
362192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Method to create the private DRI context data and initialize the
363192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * context dependent methods.
364192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     *
365192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * \since Internal API version 20031201.
366192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
36760b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    void * (*createNewContext)(__DRInativeDisplay *dpy, const __GLcontextModes *modes,
368192c988c7360d026a6f345b21acc2cdf41977915Brian Paul			       int render_type,
369192c988c7360d026a6f345b21acc2cdf41977915Brian Paul			       void *sharedPrivate, __DRIcontext *pctx);
370192c988c7360d026a6f345b21acc2cdf41977915Brian Paul};
371192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
372192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/**
373192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * Context dependent methods.  This structure is initialized during the
374192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \c __DRIscreenRec::createContext call.
375192c988c7360d026a6f345b21acc2cdf41977915Brian Paul */
376192c988c7360d026a6f345b21acc2cdf41977915Brian Paulstruct __DRIcontextRec {
377192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
378192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Method to destroy the private DRI context data.
379192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
38060b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    void (*destroyContext)(__DRInativeDisplay *dpy, int scrn, void *contextPrivate);
381192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
382192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
383192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Opaque pointer to private per context direct rendering data.
384192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * \c NULL if direct rendering is not supported on the display or
385192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * screen used to create this context.  Never dereferenced in libGL.
386192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
387192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    void *private;
388192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
389192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
390192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Pointer to the mode used to create this context.
391192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     *
392192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * \since Internal API version 20040317.
393192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
394192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    const __GLcontextModes * mode;
395192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
396192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
397192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Method to bind a DRI drawable to a DRI graphics context.
398192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     *
3995f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * \since Internal API version 20050725.
400192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
401c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick    GLboolean (*bindContext)(__DRInativeDisplay *dpy, int scrn, __DRIid draw,
402192c988c7360d026a6f345b21acc2cdf41977915Brian Paul			 __DRIid read, __DRIcontext *ctx);
403192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
404192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
405192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Method to unbind a DRI drawable from a DRI graphics context.
406192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     *
4075f1ba3e21b62cee1a4f900a2e6964728f3eeea9bIan Romanick     * \since Internal API version 20050725.
408192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
409c39bf5e273a4995a279ae2af59fc29e06ab47e29Ian Romanick    GLboolean (*unbindContext)(__DRInativeDisplay *dpy, int scrn, __DRIid draw,
410192c988c7360d026a6f345b21acc2cdf41977915Brian Paul			   __DRIid read, __DRIcontext *ctx);
411192c988c7360d026a6f345b21acc2cdf41977915Brian Paul};
412192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
413192c988c7360d026a6f345b21acc2cdf41977915Brian Paul/**
414192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * Drawable dependent methods.  This structure is initialized during the
415192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * \c __DRIscreenRec::createDrawable call.  \c createDrawable is not called
416192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * by libGL at this time.  It's currently used via the dri_util.c utility code
417192c988c7360d026a6f345b21acc2cdf41977915Brian Paul * instead.
418192c988c7360d026a6f345b21acc2cdf41977915Brian Paul */
419192c988c7360d026a6f345b21acc2cdf41977915Brian Paulstruct __DRIdrawableRec {
420192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
421192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Method to destroy the private DRI drawable data.
422192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
42360b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    void (*destroyDrawable)(__DRInativeDisplay *dpy, void *drawablePrivate);
424192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
425192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
426192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Method to swap the front and back buffers.
427192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
42860b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    void (*swapBuffers)(__DRInativeDisplay *dpy, void *drawablePrivate);
429192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
430192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
431192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Opaque pointer to private per drawable direct rendering data.
432192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * \c NULL if direct rendering is not supported on the display or
433192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * screen used to create this drawable.  Never dereferenced in libGL.
434192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
435192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    void *private;
436192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
437192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
438192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Get the number of completed swap buffers for this drawable.
439192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     *
440192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * \since Internal API version 20030317.
441192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
44260b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    int (*getSBC)(__DRInativeDisplay *dpy, void *drawablePrivate, int64_t *sbc );
443192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
444192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
445192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Wait for the SBC to be greater than or equal target_sbc.
446192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     *
447192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * \since Internal API version 20030317.
448192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
44960b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    int (*waitForSBC)( __DRInativeDisplay * dpy, void *drawablePriv,
450192c988c7360d026a6f345b21acc2cdf41977915Brian Paul		       int64_t target_sbc,
451192c988c7360d026a6f345b21acc2cdf41977915Brian Paul		       int64_t * msc, int64_t * sbc );
452192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
453192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
454192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Wait for the MSC to equal target_msc, or, if that has already passed,
455192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * the next time (MSC % divisor) is equal to remainder.  If divisor is
456192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * zero, the function will return as soon as MSC is greater than or equal
457192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * to target_msc.
458192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     *
459192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * \since Internal API version 20030317.
460192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
46160b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    int (*waitForMSC)( __DRInativeDisplay * dpy, void *drawablePriv,
462192c988c7360d026a6f345b21acc2cdf41977915Brian Paul		       int64_t target_msc, int64_t divisor, int64_t remainder,
463192c988c7360d026a6f345b21acc2cdf41977915Brian Paul		       int64_t * msc, int64_t * sbc );
464192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
465192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
466192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Like \c swapBuffers, but does NOT have an implicit \c glFlush.  Once
467192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * rendering is complete, waits until MSC is equal to target_msc, or
468192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * if that has already passed, waits until (MSC % divisor) is equal
469192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * to remainder.  If divisor is zero, the swap will happen as soon as
470192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * MSC is greater than or equal to target_msc.
471192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     *
472192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * \since Internal API version 20030317.
473192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
47460b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    int64_t (*swapBuffersMSC)(__DRInativeDisplay *dpy, void *drawablePrivate,
475192c988c7360d026a6f345b21acc2cdf41977915Brian Paul			      int64_t target_msc,
476192c988c7360d026a6f345b21acc2cdf41977915Brian Paul			      int64_t divisor, int64_t remainder);
477192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
478192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
479192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Enable or disable frame usage tracking.
480192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     *
481192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * \since Internal API version 20030317.
482192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
483749e842953a9ea6e1c9070af7f7211bfc48aa1fdIan Romanick    int (*frameTracking)(__DRInativeDisplay *dpy, void *drawablePrivate, GLboolean enable);
484192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
485192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
486192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Retrieve frame usage information.
487192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     *
488192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * \since Internal API version 20030317.
489192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
49060b0e12830310e7c05b4043857ed277b28b1c781Ian Romanick    int (*queryFrameTracking)(__DRInativeDisplay *dpy, void *drawablePrivate,
491192c988c7360d026a6f345b21acc2cdf41977915Brian Paul			      int64_t * sbc, int64_t * missedFrames,
492192c988c7360d026a6f345b21acc2cdf41977915Brian Paul			      float * lastMissedUsage, float * usage );
493192c988c7360d026a6f345b21acc2cdf41977915Brian Paul
494192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    /**
495192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * Used by drivers that implement the GLX_SGI_swap_control or
496192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * GLX_MESA_swap_control extension.
497192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     *
498192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     * \since Internal API version 20030317.
499192c988c7360d026a6f345b21acc2cdf41977915Brian Paul     */
500192c988c7360d026a6f345b21acc2cdf41977915Brian Paul    unsigned swap_interval;
501192c988c7360d026a6f345b21acc2cdf41977915Brian Paul};
50274d563cdfbfb07cc666d60dc909e90ddb9949cbbKeith Whitwell
50374d563cdfbfb07cc666d60dc909e90ddb9949cbbKeith Whitwell#endif
504