1706f2543Smrg/**************************************************************************
2706f2543Smrg
3706f2543SmrgCopyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
4706f2543SmrgAll Rights Reserved.
5706f2543Smrg
6706f2543SmrgPermission is hereby granted, free of charge, to any person obtaining a
7706f2543Smrgcopy of this software and associated documentation files (the
8706f2543Smrg"Software"), to deal in the Software without restriction, including
9706f2543Smrgwithout limitation the rights to use, copy, modify, merge, publish,
10706f2543Smrgdistribute, sub license, and/or sell copies of the Software, and to
11706f2543Smrgpermit persons to whom the Software is furnished to do so, subject to
12706f2543Smrgthe following conditions:
13706f2543Smrg
14706f2543SmrgThe above copyright notice and this permission notice (including the
15706f2543Smrgnext paragraph) shall be included in all copies or substantial portions
16706f2543Smrgof the Software.
17706f2543Smrg
18706f2543SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19706f2543SmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20706f2543SmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21706f2543SmrgIN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
22706f2543SmrgANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23706f2543SmrgTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24706f2543SmrgSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25706f2543Smrg
26706f2543Smrg**************************************************************************/
27706f2543Smrg
28706f2543Smrg/*
29706f2543Smrg * Authors:
30706f2543Smrg *   Jens Owen <jens@tungstengraphics.com>
31706f2543Smrg *
32706f2543Smrg */
33706f2543Smrg
34706f2543Smrg/* Prototypes for DRI functions */
35706f2543Smrg
36706f2543Smrg#ifndef _DRI_H_
37706f2543Smrg
38706f2543Smrg#include <pciaccess.h>
39706f2543Smrg
40706f2543Smrg#include "scrnintstr.h"
41706f2543Smrg#include "xf86dri.h"
42706f2543Smrg
43706f2543Smrgtypedef int DRISyncType;
44706f2543Smrg
45706f2543Smrg#define DRI_NO_SYNC 0
46706f2543Smrg#define DRI_2D_SYNC 1
47706f2543Smrg#define DRI_3D_SYNC 2
48706f2543Smrg
49706f2543Smrgtypedef int DRIContextType;
50706f2543Smrg
51706f2543Smrgtypedef struct _DRIContextPrivRec DRIContextPrivRec, *DRIContextPrivPtr;
52706f2543Smrg
53706f2543Smrgtypedef enum _DRIContextFlags
54706f2543Smrg{
55706f2543Smrg    DRI_CONTEXT_2DONLY    = 0x01,
56706f2543Smrg    DRI_CONTEXT_PRESERVED = 0x02,
57706f2543Smrg    DRI_CONTEXT_RESERVED  = 0x04 /* DRI Only -- no kernel equivalent */
58706f2543Smrg} DRIContextFlags;
59706f2543Smrg
60706f2543Smrg#define DRI_NO_CONTEXT 0
61706f2543Smrg#define DRI_2D_CONTEXT 1
62706f2543Smrg#define DRI_3D_CONTEXT 2
63706f2543Smrg
64706f2543Smrgtypedef int DRISwapMethod;
65706f2543Smrg
66706f2543Smrg#define DRI_HIDE_X_CONTEXT 0
67706f2543Smrg#define DRI_SERVER_SWAP    1
68706f2543Smrg#define DRI_KERNEL_SWAP    2
69706f2543Smrg
70706f2543Smrgtypedef int DRIWindowRequests;
71706f2543Smrg
72706f2543Smrg#define DRI_NO_WINDOWS       0
73706f2543Smrg#define DRI_3D_WINDOWS_ONLY  1
74706f2543Smrg#define DRI_ALL_WINDOWS      2
75706f2543Smrg
76706f2543Smrg
77706f2543Smrgtypedef void (*ClipNotifyPtr)( WindowPtr, int, int );
78706f2543Smrgtypedef void (*AdjustFramePtr)(int scrnIndex, int x, int y, int flags);
79706f2543Smrg
80706f2543Smrg
81706f2543Smrg/*
82706f2543Smrg * These functions can be wrapped by the DRI.  Each of these have
83706f2543Smrg * generic default funcs (initialized in DRICreateInfoRec) and can be
84706f2543Smrg * overridden by the driver in its [driver]DRIScreenInit function.
85706f2543Smrg */
86706f2543Smrgtypedef struct {
87706f2543Smrg    ScreenWakeupHandlerProcPtr   WakeupHandler;
88706f2543Smrg    ScreenBlockHandlerProcPtr    BlockHandler;
89706f2543Smrg    WindowExposuresProcPtr       WindowExposures;
90706f2543Smrg    CopyWindowProcPtr            CopyWindow;
91706f2543Smrg    ValidateTreeProcPtr          ValidateTree;
92706f2543Smrg    PostValidateTreeProcPtr      PostValidateTree;
93706f2543Smrg    ClipNotifyProcPtr            ClipNotify;
94706f2543Smrg    AdjustFramePtr               AdjustFrame;
95706f2543Smrg} DRIWrappedFuncsRec, *DRIWrappedFuncsPtr;
96706f2543Smrg
97706f2543Smrg
98706f2543Smrg/*
99706f2543Smrg * Prior to Xorg 6.8.99.8, the DRIInfoRec structure was implicitly versioned
100706f2543Smrg * by the XF86DRI_*_VERSION defines in xf86dristr.h.  These numbers were also
101706f2543Smrg * being used to version the XFree86-DRI protocol.  Bugs #3066 and #3163
102706f2543Smrg * showed that this was inadequate.  The DRIInfoRec structure is now versioned
103706f2543Smrg * by the DRIINFO_*_VERSION defines in this file. - ajax, 2005-05-18.
104706f2543Smrg *
105706f2543Smrg * Revision history:
106706f2543Smrg * 4.1.0 and earlier: DRIQueryVersion returns XF86DRI_*_VERSION.
107706f2543Smrg * 4.2.0: DRIQueryVersion begins returning DRIINFO_*_VERSION.
108706f2543Smrg * 5.0.0: frameBufferPhysicalAddress changed from CARD32 to pointer.
109706f2543Smrg */
110706f2543Smrg
111706f2543Smrg#define DRIINFO_MAJOR_VERSION   5
112706f2543Smrg#define DRIINFO_MINOR_VERSION   4
113706f2543Smrg#define DRIINFO_PATCH_VERSION   0
114706f2543Smrg
115706f2543Smrgtypedef unsigned long long (*DRITexOffsetStartProcPtr)(PixmapPtr pPix);
116706f2543Smrgtypedef void (*DRITexOffsetFinishProcPtr)(PixmapPtr pPix);
117706f2543Smrg
118706f2543Smrgtypedef struct {
119706f2543Smrg    /* driver call back functions
120706f2543Smrg     *
121706f2543Smrg     * New fields should be added at the end for backwards compatibility.
122706f2543Smrg     * Bump the DRIINFO patch number to indicate bugfixes.
123706f2543Smrg     * Bump the DRIINFO minor number to indicate new fields.
124706f2543Smrg     * Bump the DRIINFO major number to indicate binary-incompatible changes.
125706f2543Smrg     */
126706f2543Smrg    Bool	(*CreateContext)(ScreenPtr pScreen,
127706f2543Smrg				 VisualPtr visual,
128706f2543Smrg				 drm_context_t hHWContext,
129706f2543Smrg				 void* pVisualConfigPriv,
130706f2543Smrg				 DRIContextType context);
131706f2543Smrg    void        (*DestroyContext)(ScreenPtr pScreen,
132706f2543Smrg				  drm_context_t hHWContext,
133706f2543Smrg                                  DRIContextType context);
134706f2543Smrg    void	(*SwapContext)(ScreenPtr pScreen,
135706f2543Smrg			       DRISyncType syncType,
136706f2543Smrg			       DRIContextType readContextType,
137706f2543Smrg			       void* readContextStore,
138706f2543Smrg			       DRIContextType writeContextType,
139706f2543Smrg			       void* writeContextStore);
140706f2543Smrg    void	(*InitBuffers)(WindowPtr pWin,
141706f2543Smrg			       RegionPtr prgn,
142706f2543Smrg			       CARD32 indx);
143706f2543Smrg    void	(*MoveBuffers)(WindowPtr pWin,
144706f2543Smrg			       DDXPointRec ptOldOrg,
145706f2543Smrg			       RegionPtr prgnSrc,
146706f2543Smrg			       CARD32 indx);
147706f2543Smrg    void        (*TransitionTo3d)(ScreenPtr pScreen);
148706f2543Smrg    void        (*TransitionTo2d)(ScreenPtr pScreen);
149706f2543Smrg
150706f2543Smrg    void	(*SetDrawableIndex)(WindowPtr pWin, CARD32 indx);
151706f2543Smrg    Bool        (*OpenFullScreen)(ScreenPtr pScreen);
152706f2543Smrg    Bool        (*CloseFullScreen)(ScreenPtr pScreen);
153706f2543Smrg
154706f2543Smrg    /* wrapped functions */
155706f2543Smrg    DRIWrappedFuncsRec  wrap;
156706f2543Smrg
157706f2543Smrg    /* device info */
158706f2543Smrg    char*		drmDriverName;
159706f2543Smrg    char*		clientDriverName;
160706f2543Smrg    char*		busIdString;
161706f2543Smrg    int			ddxDriverMajorVersion;
162706f2543Smrg    int			ddxDriverMinorVersion;
163706f2543Smrg    int			ddxDriverPatchVersion;
164706f2543Smrg    pointer		frameBufferPhysicalAddress;
165706f2543Smrg    long		frameBufferSize;
166706f2543Smrg    long		frameBufferStride;
167706f2543Smrg    long		SAREASize;
168706f2543Smrg    int			maxDrawableTableEntry;
169706f2543Smrg    int			ddxDrawableTableEntry;
170706f2543Smrg    long		contextSize;
171706f2543Smrg    DRISwapMethod	driverSwapMethod;
172706f2543Smrg    DRIWindowRequests	bufferRequests;
173706f2543Smrg    int			devPrivateSize;
174706f2543Smrg    void*		devPrivate;
175706f2543Smrg    Bool		createDummyCtx;
176706f2543Smrg    Bool		createDummyCtxPriv;
177706f2543Smrg
178706f2543Smrg    /* New with DRI version 4.1.0 */
179706f2543Smrg    void        (*TransitionSingleToMulti3D)(ScreenPtr pScreen);
180706f2543Smrg    void        (*TransitionMultiToSingle3D)(ScreenPtr pScreen);
181706f2543Smrg
182706f2543Smrg    /* New with DRI version 5.1.0 */
183706f2543Smrg    void        (*ClipNotify)(ScreenPtr pScreen, WindowPtr *ppWin, int num);
184706f2543Smrg
185706f2543Smrg    /* New with DRI version 5.2.0 */
186706f2543Smrg    Bool                allocSarea;
187706f2543Smrg    Bool                keepFDOpen;
188706f2543Smrg
189706f2543Smrg    /* New with DRI version 5.3.0 */
190706f2543Smrg    DRITexOffsetStartProcPtr  texOffsetStart;
191706f2543Smrg    DRITexOffsetFinishProcPtr texOffsetFinish;
192706f2543Smrg
193706f2543Smrg    /* New with DRI version 5.4.0 */
194706f2543Smrg    int			dontMapFrameBuffer;
195706f2543Smrg    drm_handle_t   	hFrameBuffer; /* Handle to framebuffer, either
196706f2543Smrg				       * mapped by DDX driver or DRI */
197706f2543Smrg
198706f2543Smrg} DRIInfoRec, *DRIInfoPtr;
199706f2543Smrg
200706f2543Smrg
201706f2543Smrgextern _X_EXPORT Bool DRIOpenDRMMaster(ScrnInfoPtr pScrn, unsigned long sAreaSize,
202706f2543Smrg			     const char *busID,
203706f2543Smrg			     const char *drmDriverName);
204706f2543Smrg
205706f2543Smrgextern _X_EXPORT Bool DRIScreenInit(ScreenPtr pScreen,
206706f2543Smrg                          DRIInfoPtr pDRIInfo,
207706f2543Smrg                          int *pDRMFD);
208706f2543Smrg
209706f2543Smrgextern _X_EXPORT void DRICloseScreen(ScreenPtr pScreen);
210706f2543Smrg
211706f2543Smrgextern _X_EXPORT Bool DRIExtensionInit(void);
212706f2543Smrg
213706f2543Smrgextern _X_EXPORT void DRIReset(void);
214706f2543Smrg
215706f2543Smrgextern _X_EXPORT Bool DRIQueryDirectRenderingCapable(ScreenPtr pScreen,
216706f2543Smrg                                           Bool *isCapable);
217706f2543Smrg
218706f2543Smrgextern _X_EXPORT Bool DRIOpenConnection(ScreenPtr pScreen,
219706f2543Smrg                              drm_handle_t * hSAREA,
220706f2543Smrg                              char **busIdString);
221706f2543Smrg
222706f2543Smrgextern _X_EXPORT Bool DRIAuthConnection(ScreenPtr pScreen, drm_magic_t magic);
223706f2543Smrg
224706f2543Smrgextern _X_EXPORT Bool DRICloseConnection(ScreenPtr pScreen);
225706f2543Smrg
226706f2543Smrgextern _X_EXPORT Bool DRIGetClientDriverName(ScreenPtr pScreen,
227706f2543Smrg                                   int* ddxDriverMajorVersion,
228706f2543Smrg                                   int* ddxDriverMinorVersion,
229706f2543Smrg                                   int* ddxDriverPatchVersion,
230706f2543Smrg                                   char** clientDriverName);
231706f2543Smrg
232706f2543Smrgextern _X_EXPORT Bool DRICreateContext(ScreenPtr pScreen,
233706f2543Smrg                             VisualPtr visual,
234706f2543Smrg                             XID context,
235706f2543Smrg                             drm_context_t * pHWContext);
236706f2543Smrg
237706f2543Smrgextern _X_EXPORT Bool DRIDestroyContext(ScreenPtr pScreen, XID context);
238706f2543Smrg
239706f2543Smrgextern _X_EXPORT Bool DRIContextPrivDelete(pointer pResource, XID id);
240706f2543Smrg
241706f2543Smrgextern _X_EXPORT Bool DRICreateDrawable(ScreenPtr pScreen,
242706f2543Smrg                              ClientPtr client,
243706f2543Smrg                              DrawablePtr pDrawable,
244706f2543Smrg                              drm_drawable_t * hHWDrawable);
245706f2543Smrg
246706f2543Smrgextern _X_EXPORT Bool DRIDestroyDrawable(ScreenPtr pScreen,
247706f2543Smrg			       ClientPtr client,
248706f2543Smrg                               DrawablePtr pDrawable);
249706f2543Smrg
250706f2543Smrgextern _X_EXPORT Bool DRIDrawablePrivDelete(pointer pResource,
251706f2543Smrg                                  XID id);
252706f2543Smrg
253706f2543Smrgextern _X_EXPORT Bool DRIGetDrawableInfo(ScreenPtr pScreen,
254706f2543Smrg                               DrawablePtr pDrawable,
255706f2543Smrg                               unsigned int* indx,
256706f2543Smrg                               unsigned int* stamp,
257706f2543Smrg                               int* X,
258706f2543Smrg                               int* Y,
259706f2543Smrg                               int* W,
260706f2543Smrg                               int* H,
261706f2543Smrg                               int* numClipRects,
262706f2543Smrg                               drm_clip_rect_t ** pClipRects,
263706f2543Smrg                               int* backX,
264706f2543Smrg                               int* backY,
265706f2543Smrg                               int* numBackClipRects,
266706f2543Smrg                               drm_clip_rect_t ** pBackClipRects);
267706f2543Smrg
268706f2543Smrgextern _X_EXPORT Bool DRIGetDeviceInfo(ScreenPtr pScreen,
269706f2543Smrg                             drm_handle_t * hFrameBuffer,
270706f2543Smrg                             int* fbOrigin,
271706f2543Smrg                             int* fbSize,
272706f2543Smrg                             int* fbStride,
273706f2543Smrg                             int* devPrivateSize,
274706f2543Smrg                             void** pDevPrivate);
275706f2543Smrg
276706f2543Smrgextern _X_EXPORT DRIInfoPtr DRICreateInfoRec(void);
277706f2543Smrg
278706f2543Smrgextern _X_EXPORT void DRIDestroyInfoRec(DRIInfoPtr DRIInfo);
279706f2543Smrg
280706f2543Smrgextern _X_EXPORT Bool DRIFinishScreenInit(ScreenPtr pScreen);
281706f2543Smrg
282706f2543Smrgextern _X_EXPORT void DRIWakeupHandler(pointer wakeupData,
283706f2543Smrg                             int result,
284706f2543Smrg                             pointer pReadmask);
285706f2543Smrg
286706f2543Smrgextern _X_EXPORT void DRIBlockHandler(pointer blockData,
287706f2543Smrg                            OSTimePtr pTimeout,
288706f2543Smrg                            pointer pReadmask);
289706f2543Smrg
290706f2543Smrgextern _X_EXPORT void DRIDoWakeupHandler(int screenNum,
291706f2543Smrg                               pointer wakeupData,
292706f2543Smrg                               unsigned long result,
293706f2543Smrg                               pointer pReadmask);
294706f2543Smrg
295706f2543Smrgextern _X_EXPORT void DRIDoBlockHandler(int screenNum,
296706f2543Smrg                              pointer blockData,
297706f2543Smrg                              pointer pTimeout,
298706f2543Smrg                              pointer pReadmask);
299706f2543Smrg
300706f2543Smrgextern _X_EXPORT void DRISwapContext(int drmFD,
301706f2543Smrg                           void *oldctx,
302706f2543Smrg                           void *newctx);
303706f2543Smrg
304706f2543Smrgextern _X_EXPORT void *DRIGetContextStore(DRIContextPrivPtr context);
305706f2543Smrg
306706f2543Smrgextern _X_EXPORT void DRIWindowExposures(WindowPtr pWin,
307706f2543Smrg                              RegionPtr prgn,
308706f2543Smrg                              RegionPtr bsreg);
309706f2543Smrg
310706f2543Smrgextern _X_EXPORT Bool DRIDestroyWindow(WindowPtr pWin);
311706f2543Smrg
312706f2543Smrgextern _X_EXPORT void DRICopyWindow(WindowPtr pWin,
313706f2543Smrg                          DDXPointRec ptOldOrg,
314706f2543Smrg                          RegionPtr prgnSrc);
315706f2543Smrg
316706f2543Smrgextern _X_EXPORT int DRIValidateTree(WindowPtr pParent,
317706f2543Smrg                           WindowPtr pChild,
318706f2543Smrg                           VTKind    kind);
319706f2543Smrg
320706f2543Smrgextern _X_EXPORT void DRIPostValidateTree(WindowPtr pParent,
321706f2543Smrg                                WindowPtr pChild,
322706f2543Smrg                                VTKind    kind);
323706f2543Smrg
324706f2543Smrgextern _X_EXPORT void DRIClipNotify(WindowPtr pWin,
325706f2543Smrg                          int dx,
326706f2543Smrg                          int dy);
327706f2543Smrg
328706f2543Smrgextern _X_EXPORT CARD32 DRIGetDrawableIndex(WindowPtr pWin);
329706f2543Smrg
330706f2543Smrgextern _X_EXPORT void DRIPrintDrawableLock(ScreenPtr pScreen, char *msg);
331706f2543Smrg
332706f2543Smrgextern _X_EXPORT void DRILock(ScreenPtr pScreen, int flags);
333706f2543Smrg
334706f2543Smrgextern _X_EXPORT void DRIUnlock(ScreenPtr pScreen);
335706f2543Smrg
336706f2543Smrgextern _X_EXPORT DRIWrappedFuncsRec *DRIGetWrappedFuncs(ScreenPtr pScreen);
337706f2543Smrg
338706f2543Smrgextern _X_EXPORT void *DRIGetSAREAPrivate(ScreenPtr pScreen);
339706f2543Smrg
340706f2543Smrgextern _X_EXPORT unsigned int DRIGetDrawableStamp(ScreenPtr pScreen,
341706f2543Smrg                                        CARD32 drawable_index);
342706f2543Smrg
343706f2543Smrgextern _X_EXPORT DRIContextPrivPtr DRICreateContextPriv(ScreenPtr pScreen,
344706f2543Smrg                                              drm_context_t * pHWContext,
345706f2543Smrg                                              DRIContextFlags flags);
346706f2543Smrg
347706f2543Smrgextern _X_EXPORT DRIContextPrivPtr DRICreateContextPrivFromHandle(ScreenPtr pScreen,
348706f2543Smrg                                                        drm_context_t hHWContext,
349706f2543Smrg                                                        DRIContextFlags flags);
350706f2543Smrg
351706f2543Smrgextern _X_EXPORT Bool DRIDestroyContextPriv(DRIContextPrivPtr pDRIContextPriv);
352706f2543Smrg
353706f2543Smrgextern _X_EXPORT drm_context_t DRIGetContext(ScreenPtr pScreen);
354706f2543Smrg
355706f2543Smrgextern _X_EXPORT void DRIQueryVersion(int *majorVersion,
356706f2543Smrg                            int *minorVersion,
357706f2543Smrg                            int *patchVersion);
358706f2543Smrg
359706f2543Smrgextern _X_EXPORT void DRIAdjustFrame(int scrnIndex, int x, int y, int flags);
360706f2543Smrg
361706f2543Smrgextern _X_EXPORT void DRIMoveBuffersHelper(ScreenPtr pScreen,
362706f2543Smrg                                 int dx,
363706f2543Smrg                                 int dy,
364706f2543Smrg                                 int *xdir,
365706f2543Smrg                                 int *ydir,
366706f2543Smrg                                 RegionPtr reg);
367706f2543Smrg
368706f2543Smrgextern _X_EXPORT char *DRICreatePCIBusID(const struct pci_device *PciInfo);
369706f2543Smrg
370706f2543Smrgextern _X_EXPORT int drmInstallSIGIOHandler(int fd, void (*f)(int, void *, void *));
371706f2543Smrgextern _X_EXPORT int drmRemoveSIGIOHandler(int fd);
372706f2543Smrgextern _X_EXPORT int DRIMasterFD(ScrnInfoPtr pScrn);
373706f2543Smrg
374706f2543Smrgextern _X_EXPORT void *DRIMasterSareaPointer(ScrnInfoPtr pScrn);
375706f2543Smrg
376706f2543Smrgextern _X_EXPORT drm_handle_t DRIMasterSareaHandle(ScrnInfoPtr pScrn);
377706f2543Smrg
378706f2543Smrgextern _X_EXPORT void DRIGetTexOffsetFuncs(ScreenPtr pScreen,
379706f2543Smrg				 DRITexOffsetStartProcPtr *texOffsetStartFunc,
380706f2543Smrg				 DRITexOffsetFinishProcPtr *texOffsetFinishFunc);
381706f2543Smrg
382706f2543Smrg#define _DRI_H_
383706f2543Smrg
384706f2543Smrg#endif
385