1 /* 2 * Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 3 * All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sub license, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the 14 * next paragraph) shall be included in all copies or substantial portions 15 * of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 21 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 26 /** 27 * \file dri_util.h 28 * DRI utility functions definitions. 29 * 30 * This module acts as glue between GLX and the actual hardware driver. A DRI 31 * driver doesn't really \e have to use any of this - it's optional. But, some 32 * useful stuff is done here that otherwise would have to be duplicated in most 33 * drivers. 34 * 35 * Basically, these utility functions take care of some of the dirty details of 36 * screen initialization, context creation, context binding, DRM setup, etc. 37 * 38 * These functions are compiled into each DRI driver so libGL.so knows nothing 39 * about them. 40 * 41 * \sa dri_util.c. 42 * 43 * \author Kevin E. Martin <kevin@precisioninsight.com> 44 * \author Brian Paul <brian@precisioninsight.com> 45 */ 46 47 /** 48 * The following structs are shared between DRISW and DRI2, the DRISW structs 49 * are essentially base classes of the DRI2 structs. DRISW needs to compile on 50 * platforms without DRM, so keep the structs opaque to DRM. 51 */ 52 53 #ifndef _DRI_UTIL_H_ 54 #define _DRI_UTIL_H_ 55 56 #include <GL/gl.h> 57 #include <GL/internal/dri_interface.h> 58 #include "main/mtypes.h" 59 #include "xmlconfig.h" 60 #include <stdbool.h> 61 62 /** 63 * Extensions. 64 */ 65 extern const __DRIcoreExtension driCoreExtension; 66 extern const __DRIswrastExtension driSWRastExtension; 67 extern const __DRIdri2Extension driDRI2Extension; 68 extern const __DRI2configQueryExtension dri2ConfigQueryExtension; 69 extern const __DRIcopySubBufferExtension driCopySubBufferExtension; 70 /** 71 * Driver callback functions. 72 * 73 * Each DRI driver must have one of these structures with all the pointers set 74 * to appropriate functions within the driver. 75 * 76 * When glXCreateContext() is called, for example, it'll call a helper function 77 * dri_util.c which in turn will jump through the \a CreateContext pointer in 78 * this structure. 79 */ 80 struct __DriverAPIRec { 81 const __DRIconfig **(*InitScreen) (__DRIscreen * priv); 82 83 void (*DestroyScreen)(__DRIscreen *driScrnPriv); 84 85 GLboolean (*CreateContext)(gl_api api, 86 const struct gl_config *glVis, 87 __DRIcontext *driContextPriv, 88 unsigned major_version, 89 unsigned minor_version, 90 uint32_t flags, 91 bool notify_reset, 92 unsigned *error, 93 void *sharedContextPrivate); 94 95 void (*DestroyContext)(__DRIcontext *driContextPriv); 96 97 GLboolean (*CreateBuffer)(__DRIscreen *driScrnPriv, 98 __DRIdrawable *driDrawPriv, 99 const struct gl_config *glVis, 100 GLboolean pixmapBuffer); 101 102 void (*DestroyBuffer)(__DRIdrawable *driDrawPriv); 103 104 void (*SwapBuffers)(__DRIdrawable *driDrawPriv); 105 106 GLboolean (*MakeCurrent)(__DRIcontext *driContextPriv, 107 __DRIdrawable *driDrawPriv, 108 __DRIdrawable *driReadPriv); 109 110 GLboolean (*UnbindContext)(__DRIcontext *driContextPriv); 111 112 __DRIbuffer *(*AllocateBuffer) (__DRIscreen *screenPrivate, 113 unsigned int attachment, 114 unsigned int format, 115 int width, int height); 116 117 void (*ReleaseBuffer) (__DRIscreen *screenPrivate, __DRIbuffer *buffer); 118 119 void (*CopySubBuffer)(__DRIdrawable *driDrawPriv, int x, int y, 120 int w, int h); 121 }; 122 123 extern const struct __DriverAPIRec driDriverAPI; 124 extern const struct __DriverAPIRec *globalDriverAPI; 125 126 /** 127 * Per-screen private driver information. 128 */ 129 struct __DRIscreenRec { 130 /** 131 * Driver-specific entrypoints provided by the driver's 132 * __DRIDriverVtableExtensionRec. 133 */ 134 const struct __DriverAPIRec *driver; 135 136 /** 137 * Current screen's number 138 */ 139 int myNum; 140 141 /** 142 * File descriptor returned when the kernel device driver is opened. 143 * 144 * Used to: 145 * - authenticate client to kernel 146 * - map the frame buffer, SAREA, etc. 147 * - close the kernel device driver 148 */ 149 int fd; 150 151 /** 152 * Device-dependent private information (not stored in the SAREA). 153 * 154 * This pointer is never touched by the DRI layer. 155 */ 156 void *driverPrivate; 157 158 void *loaderPrivate; 159 160 int max_gl_core_version; 161 int max_gl_compat_version; 162 int max_gl_es1_version; 163 int max_gl_es2_version; 164 165 const __DRIextension **extensions; 166 167 const __DRIswrastLoaderExtension *swrast_loader; 168 169 struct { 170 /* Flag to indicate that this is a DRI2 screen. Many of the above 171 * fields will not be valid or initializaed in that case. */ 172 const __DRIdri2LoaderExtension *loader; 173 const __DRIimageLookupExtension *image; 174 const __DRIuseInvalidateExtension *useInvalidate; 175 } dri2; 176 177 struct { 178 const __DRIimageLoaderExtension *loader; 179 } image; 180 181 driOptionCache optionInfo; 182 driOptionCache optionCache; 183 184 unsigned int api_mask; 185 }; 186 187 /** 188 * Per-context private driver information. 189 */ 190 struct __DRIcontextRec { 191 /** 192 * Device driver's private context data. This structure is opaque. 193 */ 194 void *driverPrivate; 195 196 /** 197 * The loaders's private context data. This structure is opaque. 198 */ 199 void *loaderPrivate; 200 201 /** 202 * Pointer to drawable currently bound to this context for drawing. 203 */ 204 __DRIdrawable *driDrawablePriv; 205 206 /** 207 * Pointer to drawable currently bound to this context for reading. 208 */ 209 __DRIdrawable *driReadablePriv; 210 211 /** 212 * Pointer to screen on which this context was created. 213 */ 214 __DRIscreen *driScreenPriv; 215 216 struct { 217 int draw_stamp; 218 int read_stamp; 219 } dri2; 220 }; 221 222 /** 223 * Per-drawable private DRI driver information. 224 */ 225 struct __DRIdrawableRec { 226 /** 227 * Driver's private drawable information. 228 * 229 * This structure is opaque. 230 */ 231 void *driverPrivate; 232 233 /** 234 * Private data from the loader. We just hold on to it and pass 235 * it back when calling into loader provided functions. 236 */ 237 void *loaderPrivate; 238 239 /** 240 * Pointer to context to which this drawable is currently bound. 241 */ 242 __DRIcontext *driContextPriv; 243 244 /** 245 * Pointer to screen on which this drawable was created. 246 */ 247 __DRIscreen *driScreenPriv; 248 249 /** 250 * Reference count for number of context's currently bound to this 251 * drawable. 252 * 253 * Once it reaches zero, the drawable can be destroyed. 254 * 255 * \note This behavior will change with GLX 1.3. 256 */ 257 int refcount; 258 259 /** 260 * Last value of the stamp. 261 * 262 * If this differs from the value stored at __DRIdrawable::dri2.stamp, 263 * then the drawable information has been modified by the X server, and the 264 * drawable information (below) should be retrieved from the X server. 265 */ 266 unsigned int lastStamp; 267 268 int w, h; 269 270 /** 271 * Drawable timestamp. Increased when the loader calls invalidate. 272 */ 273 struct { 274 unsigned int stamp; 275 } dri2; 276 }; 277 278 extern uint32_t 279 driGLFormatToImageFormat(mesa_format format); 280 281 extern mesa_format 282 driImageFormatToGLFormat(uint32_t image_format); 283 284 extern void 285 dri2InvalidateDrawable(__DRIdrawable *drawable); 286 287 extern void 288 driUpdateFramebufferSize(struct gl_context *ctx, const __DRIdrawable *dPriv); 289 290 extern void 291 driContextSetFlags(struct gl_context *ctx, uint32_t flags); 292 293 extern const __DRIimageDriverExtension driImageDriverExtension; 294 295 #endif /* _DRI_UTIL_H_ */ 296