~ubuntu-branches/ubuntu/quantal/mesa-glw/quantal

« back to all changes in this revision

Viewing changes to src/mesa/drivers/x11/xm_glide.c

  • Committer: Bazaar Package Importer
  • Author(s): Morten Kjeldgaard
  • Date: 2008-05-06 16:19:15 UTC
  • Revision ID: james.westby@ubuntu.com-20080506161915-uynz7nftmfixu6bq
Tags: upstream-7.0.3
ImportĀ upstreamĀ versionĀ 7.0.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Mesa 3-D graphics library
 
3
 * Version:  6.5
 
4
 *
 
5
 * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
 
6
 *
 
7
 * Permission is hereby granted, free of charge, to any person obtaining a
 
8
 * copy of this software and associated documentation files (the "Software"),
 
9
 * to deal in the Software without restriction, including without limitation
 
10
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 
11
 * and/or sell copies of the Software, and to permit persons to whom the
 
12
 * Software is furnished to do so, subject to the following conditions:
 
13
 *
 
14
 * The above copyright notice and this permission notice shall be included
 
15
 * in all copies or substantial portions 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 MERCHANTABILITY,
 
19
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 
20
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 
21
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 
22
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
23
 */
 
24
 
 
25
 
 
26
#include "glxheader.h"
 
27
#include "xmesaP.h"
 
28
 
 
29
#ifdef FX
 
30
#include "../glide/fxdrv.h"
 
31
 
 
32
void
 
33
FXcreateContext(XMesaVisual v, XMesaWindow w, XMesaContext c, XMesaBuffer b)
 
34
{
 
35
   char *fxEnvVar = _mesa_getenv("MESA_GLX_FX");
 
36
   if (fxEnvVar) {
 
37
     if (fxEnvVar[0]!='d') {
 
38
       int attribs[100];
 
39
       int numAttribs = 0;
 
40
       int hw;
 
41
       if (v->mesa_visual.depthBits > 0) {
 
42
         attribs[numAttribs++] = FXMESA_DEPTH_SIZE;
 
43
         attribs[numAttribs++] = v->mesa_visual.depthBits;
 
44
       }
 
45
       if (v->mesa_visual.doubleBufferMode) {
 
46
         attribs[numAttribs++] = FXMESA_DOUBLEBUFFER;
 
47
       }
 
48
       if (v->mesa_visual.accumRedBits > 0) {
 
49
         attribs[numAttribs++] = FXMESA_ACCUM_SIZE;
 
50
         attribs[numAttribs++] = v->mesa_visual.accumRedBits;
 
51
       }
 
52
       if (v->mesa_visual.stencilBits > 0) {
 
53
         attribs[numAttribs++] = FXMESA_STENCIL_SIZE;
 
54
         attribs[numAttribs++] = v->mesa_visual.stencilBits;
 
55
       }
 
56
       if (v->mesa_visual.alphaBits > 0) {
 
57
         attribs[numAttribs++] = FXMESA_ALPHA_SIZE;
 
58
         attribs[numAttribs++] = v->mesa_visual.alphaBits;
 
59
       }
 
60
       if (1) {
 
61
         attribs[numAttribs++] = FXMESA_SHARE_CONTEXT;
 
62
         attribs[numAttribs++] = (int) &(c->mesa);
 
63
       }
 
64
       attribs[numAttribs++] = FXMESA_NONE;
 
65
 
 
66
       /* [dBorca] we should take an envvar for `fxMesaSelectCurrentBoard'!!! */
 
67
       hw = fxMesaSelectCurrentBoard(0);
 
68
 
 
69
       /* if these fail, there's a new bug somewhere */
 
70
       ASSERT(b->mesa_buffer.Width > 0);
 
71
       ASSERT(b->mesa_buffer.Height > 0);
 
72
 
 
73
       if ((hw == GR_SSTTYPE_VOODOO) || (hw == GR_SSTTYPE_Voodoo2)) {
 
74
         b->FXctx = fxMesaCreateBestContext(0, b->mesa_buffer.Width,
 
75
                                            b->mesa_buffer.Height, attribs);
 
76
         if ((v->undithered_pf!=PF_Index) && (b->backxrb->ximage)) {
 
77
           b->FXisHackUsable = b->FXctx ? GL_TRUE : GL_FALSE;
 
78
           if (b->FXctx && (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')) {
 
79
             b->FXwindowHack = GL_TRUE;
 
80
             FX_grSstControl(GR_CONTROL_DEACTIVATE);
 
81
           }
 
82
           else {
 
83
             b->FXwindowHack = GL_FALSE;
 
84
           }
 
85
         }
 
86
       }
 
87
       else {
 
88
         if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')
 
89
           b->FXctx = fxMesaCreateContext(w, GR_RESOLUTION_NONE,
 
90
                                          GR_REFRESH_75Hz, attribs);
 
91
         else
 
92
           b->FXctx = fxMesaCreateBestContext(0, b->mesa_buffer.Width,
 
93
                                              b->mesa_buffer.Height, attribs);
 
94
         b->FXisHackUsable = GL_FALSE;
 
95
         b->FXwindowHack = GL_FALSE;
 
96
       }
 
97
       /*
 
98
       fprintf(stderr,
 
99
               "voodoo %d, wid %d height %d hack: usable %d active %d\n",
 
100
               hw, b->mesa_buffer.Width, b->mesa_buffer.Height,
 
101
               b->FXisHackUsable, b->FXwindowHack);
 
102
       */
 
103
     }
 
104
   }
 
105
   else {
 
106
      _mesa_warning(NULL, "WARNING: This Mesa Library includes the Glide driver but\n");
 
107
      _mesa_warning(NULL, "         you have not defined the MESA_GLX_FX env. var.\n");
 
108
      _mesa_warning(NULL, "         (check the README.3DFX file for more information).\n\n");
 
109
      _mesa_warning(NULL, "         you can disable this message with a 'export MESA_GLX_FX=disable'.\n");
 
110
   }
 
111
}
 
112
 
 
113
 
 
114
void FXdestroyContext( XMesaBuffer b )
 
115
{
 
116
   if (b && b->FXctx)
 
117
      fxMesaDestroyContext(b->FXctx);
 
118
}
 
119
 
 
120
 
 
121
GLboolean FXmakeCurrent( XMesaBuffer b )
 
122
{
 
123
   if (b->FXctx) {
 
124
      fxMesaMakeCurrent(b->FXctx);
 
125
 
 
126
      return GL_TRUE;
 
127
   }
 
128
   return GL_FALSE;
 
129
}
 
130
 
 
131
 
 
132
/*
 
133
 * Read image from VooDoo frame buffer into X/Mesa's back XImage.
 
134
 */
 
135
static void FXgetImage( XMesaBuffer b )
 
136
{
 
137
   GET_CURRENT_CONTEXT(ctx);
 
138
   static unsigned short pixbuf[MAX_WIDTH];
 
139
   GLuint x, y;
 
140
   GLuint width, height;
 
141
 
 
142
#ifdef XFree86Server
 
143
   x = b->frontxrb->pixmap->x;
 
144
   y = b->frontxrb->pixmap->y;
 
145
   width = b->frontxrb->pixmap->width;
 
146
   height = b->frontxrb->pixmap->height;
 
147
   depth = b->frontxrb->pixmap->depth;
 
148
#else
 
149
   xmesa_get_window_size(b->display, b, &width, &height);
 
150
   x = y = 0;
 
151
#endif
 
152
   if (b->mesa_buffer.Width != width || b->mesa_buffer.Height != height) {
 
153
      b->mesa_buffer.Width = MIN2((int)width, b->FXctx->width);
 
154
      b->mesa_buffer.Height = MIN2((int)height, b->FXctx->height);
 
155
      if (b->mesa_buffer.Width & 1)
 
156
         b->mesa_buffer.Width--;  /* prevent odd width */
 
157
   }
 
158
 
 
159
   /* [dBorca] we're always in the right GR_COLORFORMAT... aren't we? */
 
160
   /* grLfbWriteColorFormat(GR_COLORFORMAT_ARGB); */
 
161
   if (b->xm_visual->undithered_pf==PF_5R6G5B) {
 
162
      /* Special case: 16bpp RGB */
 
163
      grLfbReadRegion( GR_BUFFER_FRONTBUFFER,       /* src buffer */
 
164
                       0, b->FXctx->height - b->mesa_buffer.Height,  /*pos*/
 
165
                       b->mesa_buffer.Width, b->mesa_buffer.Height,  /* size */
 
166
                       b->mesa_buffer.Width * sizeof(GLushort), /* stride */
 
167
                       b->backxrb->ximage->data);         /* dest buffer */
 
168
   }
 
169
   else if (b->xm_visual->dithered_pf==PF_Dither
 
170
            && GET_VISUAL_DEPTH(b->xm_visual)==8) {
 
171
      /* Special case: 8bpp RGB */
 
172
      for (y=0;y<b->mesa_buffer.Height;y++) {
 
173
         GLubyte *ptr = (GLubyte*) b->backxrb->ximage->data
 
174
                        + b->backxrb->ximage->bytes_per_line * y;
 
175
         XDITHER_SETUP(y);
 
176
 
 
177
         /* read row from 3Dfx frame buffer */
 
178
         grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
 
179
                          0, b->FXctx->height-(b->mesa_buffer.Height-y),
 
180
                          b->mesa_buffer.Width, 1,
 
181
                          0,
 
182
                          pixbuf );
 
183
 
 
184
         /* write to XImage back buffer */
 
185
         for (x=0;x<b->mesa_buffer.Width;x++) {
 
186
            GLubyte r = (pixbuf[x] & 0xf800) >> 8;
 
187
            GLubyte g = (pixbuf[x] & 0x07e0) >> 3;
 
188
            GLubyte b = (pixbuf[x] & 0x001f) << 3;
 
189
            *ptr++ = XDITHER( x, r, g, b);
 
190
         }
 
191
      }
 
192
   }
 
193
   else {
 
194
      /* General case: slow! */
 
195
      for (y=0;y<b->mesa_buffer.Height;y++) {
 
196
         /* read row from 3Dfx frame buffer */
 
197
         grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
 
198
                          0, b->FXctx->height-(b->mesa_buffer.Height-y),
 
199
                          b->mesa_buffer.Width, 1,
 
200
                          0,
 
201
                          pixbuf );
 
202
 
 
203
         /* write to XImage back buffer */
 
204
         for (x=0;x<b->mesa_buffer.Width;x++) {
 
205
            XMesaPutPixel(b->backxrb->ximage,x,y,
 
206
                          xmesa_color_to_pixel(ctx,
 
207
                                               (pixbuf[x] & 0xf800) >> 8,
 
208
                                               (pixbuf[x] & 0x07e0) >> 3,
 
209
                                               (pixbuf[x] & 0x001f) << 3,
 
210
                                               0xff,
 
211
                                               b->xm_visual->undithered_pf));
 
212
         }
 
213
      }
 
214
   }
 
215
   /* grLfbWriteColorFormat(GR_COLORFORMAT_ABGR); */
 
216
}
 
217
 
 
218
 
 
219
GLboolean FXswapBuffers( XMesaBuffer b )
 
220
{
 
221
   if (b->FXctx) {
 
222
      fxMesaSwapBuffers();
 
223
 
 
224
      if (!b->FXwindowHack)
 
225
         return GL_TRUE;
 
226
 
 
227
      FXgetImage(b);
 
228
   }
 
229
   return GL_FALSE;
 
230
}
 
231
 
 
232
 
 
233
/*
 
234
 * Switch 3Dfx support hack between window and full-screen mode.
 
235
 */
 
236
GLboolean XMesaSetFXmode( GLint mode )
 
237
{
 
238
   const char *fx = _mesa_getenv("MESA_GLX_FX");
 
239
   if (fx && fx[0] != 'd') {
 
240
      GET_CURRENT_CONTEXT(ctx);
 
241
      GrHwConfiguration hw;
 
242
      if (!FX_grSstQueryHardware(&hw)) {
 
243
         /*fprintf(stderr, "!grSstQueryHardware\n");*/
 
244
         return GL_FALSE;
 
245
      }
 
246
      if (hw.num_sst < 1) {
 
247
         /*fprintf(stderr, "hw.num_sst < 1\n");*/
 
248
         return GL_FALSE;
 
249
      }
 
250
      if (ctx) {
 
251
         /* [dBorca] Hack alert: 
 
252
          * oh, this is sooo wrong: ctx above is
 
253
          * really an fxMesaContext, not an XMesaContext
 
254
          */
 
255
         XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer);
 
256
         if (mode == XMESA_FX_WINDOW) {
 
257
            if (xmbuf->FXisHackUsable) {
 
258
               FX_grSstControl(GR_CONTROL_DEACTIVATE);
 
259
               xmbuf->FXwindowHack = GL_TRUE;
 
260
               return GL_TRUE;
 
261
            }
 
262
         }
 
263
         else if (mode == XMESA_FX_FULLSCREEN) {
 
264
            FX_grSstControl(GR_CONTROL_ACTIVATE);
 
265
            xmbuf->FXwindowHack = GL_FALSE;
 
266
            return GL_TRUE;
 
267
         }
 
268
         else {
 
269
            /* Error: Bad mode value */
 
270
         }
 
271
      }
 
272
   }
 
273
   /*fprintf(stderr, "fallthrough\n");*/
 
274
   return GL_FALSE;
 
275
}
 
276
#endif