2
* Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
4
* Copyright 2010 George Sapountzis <gsapountzis@gmail.com>
6
* Permission is hereby granted, free of charge, to any person obtaining a
7
* copy of this software and associated documentation files (the "Software"),
8
* to deal in the Software without restriction, including without limitation
9
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
10
* and/or sell copies of the Software, and to permit persons to whom the
11
* Software is furnished to do so, subject to the following conditions:
13
* The above copyright notice and this permission notice shall be included
14
* in all copies or substantial portions of the Software.
16
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
* BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
* DRISW utility functions, i.e. dri_util.c stripped from drm-specific bits.
30
#include "drisw_util.h"
39
setupLoaderExtensions(__DRIscreen *psp,
40
const __DRIextension **extensions)
44
for (i = 0; extensions[i]; i++) {
45
if (strcmp(extensions[i]->name, __DRI_SWRAST_LOADER) == 0)
46
psp->swrast_loader = (__DRIswrastLoaderExtension *) extensions[i];
51
driCreateNewScreen(int scrn, const __DRIextension **extensions,
52
const __DRIconfig ***driver_configs, void *data)
54
static const __DRIextension *emptyExtensionList[] = { NULL };
59
psp = CALLOC_STRUCT(__DRIscreenRec);
63
setupLoaderExtensions(psp, extensions);
65
psp->extensions = emptyExtensionList;
69
*driver_configs = driDriverAPI.InitScreen(psp);
71
if (*driver_configs == NULL) {
79
static void driDestroyScreen(__DRIscreen *psp)
82
driDriverAPI.DestroyScreen(psp);
88
static const __DRIextension **driGetExtensions(__DRIscreen *psp)
90
return psp->extensions;
99
driCreateNewContext(__DRIscreen *psp, const __DRIconfig *config,
100
__DRIcontext *shared, void *data)
103
void * const shareCtx = (shared != NULL) ? shared->driverPrivate : NULL;
105
pcp = CALLOC_STRUCT(__DRIcontextRec);
109
pcp->loaderPrivate = data;
111
pcp->driScreenPriv = psp;
112
pcp->driDrawablePriv = NULL;
113
pcp->driReadablePriv = NULL;
115
if (!driDriverAPI.CreateContext(API_OPENGL,
116
&config->modes, pcp, shareCtx)) {
125
driDestroyContext(__DRIcontext *pcp)
128
driDriverAPI.DestroyContext(pcp);
134
driCopyContext(__DRIcontext *dst, __DRIcontext *src, unsigned long mask)
139
static void dri_get_drawable(__DRIdrawable *pdp);
140
static void dri_put_drawable(__DRIdrawable *pdp);
142
static int driBindContext(__DRIcontext *pcp,
146
/* Bind the drawable to the context */
148
pcp->driDrawablePriv = pdp;
149
pcp->driReadablePriv = prp;
151
pdp->driContextPriv = pcp;
152
dri_get_drawable(pdp);
154
if ( prp && pdp != prp ) {
155
dri_get_drawable(prp);
159
return driDriverAPI.MakeCurrent(pcp, pdp, prp);
162
static int driUnbindContext(__DRIcontext *pcp)
170
pdp = pcp->driDrawablePriv;
171
prp = pcp->driReadablePriv;
173
/* already unbound */
177
driDriverAPI.UnbindContext(pcp);
179
dri_put_drawable(pdp);
182
dri_put_drawable(prp);
185
pcp->driDrawablePriv = NULL;
186
pcp->driReadablePriv = NULL;
196
static void dri_get_drawable(__DRIdrawable *pdp)
201
static void dri_put_drawable(__DRIdrawable *pdp)
208
driDriverAPI.DestroyBuffer(pdp);
214
static __DRIdrawable *
215
driCreateNewDrawable(__DRIscreen *psp,
216
const __DRIconfig *config, void *data)
220
pdp = CALLOC_STRUCT(__DRIdrawableRec);
224
pdp->loaderPrivate = data;
226
pdp->driScreenPriv = psp;
227
pdp->driContextPriv = NULL;
229
dri_get_drawable(pdp);
231
if (!driDriverAPI.CreateBuffer(psp, pdp, &config->modes, GL_FALSE)) {
236
pdp->lastStamp = 1; /* const */
242
driDestroyDrawable(__DRIdrawable *pdp)
244
dri_put_drawable(pdp);
247
static void driSwapBuffers(__DRIdrawable *pdp)
249
driDriverAPI.SwapBuffers(pdp);
252
const __DRIcoreExtension driCoreExtension = {
253
{ __DRI_CORE, __DRI_CORE_VERSION },
254
NULL, /* driCreateNewScreen */
258
driIndexConfigAttrib,
259
NULL, /* driCreateNewDrawable */
269
const __DRIswrastExtension driSWRastExtension = {
270
{ __DRI_SWRAST, __DRI_SWRAST_VERSION },