1 | /* $Id: vgdrvr.c,v 1.2 2001-09-05 14:31:01 bird Exp $ */
|
---|
2 | /*
|
---|
3 | ** THIS SOFTWARE IS SUBJECT TO COPYRIGHT PROTECTION AND IS OFFERED ONLY
|
---|
4 | ** PURSUANT TO THE 3DFX GLIDE GENERAL PUBLIC LICENSE. THERE IS NO RIGHT
|
---|
5 | ** TO USE THE GLIDE TRADEMARK WITHOUT PRIOR WRITTEN PERMISSION OF 3DFX
|
---|
6 | ** INTERACTIVE, INC. A COPY OF THIS LICENSE MAY BE OBTAINED FROM THE
|
---|
7 | ** DISTRIBUTOR OR BY CONTACTING 3DFX INTERACTIVE INC(info@3dfx.com).
|
---|
8 | ** THIS PROGRAM IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
|
---|
9 | ** EXPRESSED OR IMPLIED. SEE THE 3DFX GLIDE GENERAL PUBLIC LICENSE FOR A
|
---|
10 | ** FULL TEXT OF THE NON-WARRANTY PROVISIONS.
|
---|
11 | **
|
---|
12 | ** USE, DUPLICATION OR DISCLOSURE BY THE GOVERNMENT IS SUBJECT TO
|
---|
13 | ** RESTRICTIONS AS SET FORTH IN SUBDIVISION (C)(1)(II) OF THE RIGHTS IN
|
---|
14 | ** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013,
|
---|
15 | ** AND/OR IN SIMILAR OR SUCCESSOR CLAUSES IN THE FAR, DOD OR NASA FAR
|
---|
16 | ** SUPPLEMENT. UNPUBLISHED RIGHTS RESERVED UNDER THE COPYRIGHT LAWS OF
|
---|
17 | ** THE UNITED STATES.
|
---|
18 | **
|
---|
19 | ** COPYRIGHT 3DFX INTERACTIVE, INC. 1999, ALL RIGHTS RESERVED
|
---|
20 | **
|
---|
21 | **
|
---|
22 | ** $Revision: 1.2 $
|
---|
23 | ** $Date: 2001-09-05 14:31:01 $
|
---|
24 | **
|
---|
25 | */
|
---|
26 |
|
---|
27 | #include <3dfx.h>
|
---|
28 | #include <sst1init.h>
|
---|
29 | #include "init.h"
|
---|
30 | #include "fxinit.h"
|
---|
31 | #include <sst1init.h>
|
---|
32 | #include <sst.h>
|
---|
33 |
|
---|
34 | static FxBool FX_CALL setVideo( FxU32 hWnd,
|
---|
35 | GrScreenResolution_t sRes,
|
---|
36 | GrScreenRefresh_t vRefresh,
|
---|
37 | InitColorFormat_t cFormat,
|
---|
38 | InitOriginLocation_t yOrigin,
|
---|
39 | int nColBuffers,
|
---|
40 | int nAuxBuffers,
|
---|
41 | int *xres,
|
---|
42 | int *yres,
|
---|
43 | int *fbStride,
|
---|
44 | sst1VideoTimingStruct *vidTimings) {
|
---|
45 | FxBool rv;
|
---|
46 | static int _w[] = {320,320,400,512,640,640,640,640,800,960,856,512};
|
---|
47 | static int _h[] = {200,240,256,384,200,350,400,480,600,720,480,256};
|
---|
48 |
|
---|
49 | rv = sst1InitVideo( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr,
|
---|
50 | sRes,
|
---|
51 | vRefresh,
|
---|
52 | vidTimings );
|
---|
53 |
|
---|
54 | if ( !rv ) goto BAIL;
|
---|
55 |
|
---|
56 | if ( context->info.hwDep.vgInfo.sliDetect ) {
|
---|
57 | rv = sst1InitRegisters((FxU32*)context->info.hwDep.vgInfo.slaveBaseAddr);
|
---|
58 | if ( !rv ) goto BAIL;
|
---|
59 | rv = sst1InitVideo( (FxU32*)context->info.hwDep.vgInfo.slaveBaseAddr,
|
---|
60 | sRes,
|
---|
61 | vRefresh,
|
---|
62 | vidTimings );
|
---|
63 | if ( !rv ) goto BAIL;
|
---|
64 | rv = sst1InitSli( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr,
|
---|
65 | (FxU32*)context->info.hwDep.vgInfo.slaveBaseAddr );
|
---|
66 | if ( !rv ) goto BAIL;
|
---|
67 | }
|
---|
68 |
|
---|
69 | if(vidTimings) {
|
---|
70 | *xres = vidTimings->xDimension;
|
---|
71 | *yres = vidTimings->yDimension;
|
---|
72 | } else {
|
---|
73 | *xres = _w[sRes];
|
---|
74 | *yres = _h[sRes];
|
---|
75 | }
|
---|
76 | *fbStride = 1024; /* 1024 always */
|
---|
77 |
|
---|
78 | BAIL:
|
---|
79 | return rv;
|
---|
80 | }
|
---|
81 |
|
---|
82 | static void FX_CALL restoreVideo( void ) {
|
---|
83 | sst1InitShutdown( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr );
|
---|
84 | }
|
---|
85 |
|
---|
86 | static FxBool FX_CALL enableTransport( InitFIFOData *info ) {
|
---|
87 | FxBool rv = FXFALSE;
|
---|
88 | sst1DeviceInfoStruct sstInfo;
|
---|
89 |
|
---|
90 | if ( info ) {
|
---|
91 | rv = sst1InitGetDeviceInfo( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr,
|
---|
92 | &sstInfo );
|
---|
93 | info->hwDep.vgFIFOData.memFifoStatusLwm = sstInfo.memFifoStatusLwm;
|
---|
94 | }
|
---|
95 |
|
---|
96 | sst1InitCachingOn();
|
---|
97 |
|
---|
98 | return rv;
|
---|
99 | }
|
---|
100 |
|
---|
101 | static void FX_CALL disableTransport( void ) {
|
---|
102 | }
|
---|
103 |
|
---|
104 | static InitSwapType_t FX_CALL swapBuffers( FxU32 code ) {
|
---|
105 | return INIT_SWAP_FLIP;
|
---|
106 | }
|
---|
107 |
|
---|
108 | static FxU32 FX_CALL status( void ) {
|
---|
109 | return sst1InitReturnStatus((FxU32 *) context->info.hwDep.vgInfo.vgBaseAddr);
|
---|
110 | }
|
---|
111 |
|
---|
112 | static FxBool FX_CALL busy(void) {
|
---|
113 | FxU32 stat = status();
|
---|
114 | FxBool ret = (stat & SST_BUSY) ? FXTRUE : FXFALSE;
|
---|
115 |
|
---|
116 | return ret;
|
---|
117 | }
|
---|
118 |
|
---|
119 | static void FX_CALL idle( void ) {
|
---|
120 | sst1InitIdle((FxU32 *)context->info.hwDep.vgInfo.vgBaseAddr);
|
---|
121 | }
|
---|
122 |
|
---|
123 | static void * FX_CALL getBufferPtr( InitBuffer_t buffer, int *strideBytes ) {
|
---|
124 | return 0;
|
---|
125 | }
|
---|
126 |
|
---|
127 | static void FX_CALL renderBuffer( InitBuffer_t buffer ) {
|
---|
128 | return;
|
---|
129 | }
|
---|
130 |
|
---|
131 | static void FX_CALL origin( InitOriginLocation_t origin ) {
|
---|
132 | return;
|
---|
133 | }
|
---|
134 |
|
---|
135 | static void FX_CALL ioCtl( FxU32 token, void *argument ) {
|
---|
136 | return;
|
---|
137 | }
|
---|
138 |
|
---|
139 | static FxBool FX_CALL control( FxU32 code ) {
|
---|
140 | switch ( code ) {
|
---|
141 | case INIT_CONTROL_DEACTIVATE:
|
---|
142 | sst1InitVgaPassCtrl( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr,
|
---|
143 | FXTRUE );
|
---|
144 | break;
|
---|
145 | case INIT_CONTROL_ACTIVATE:
|
---|
146 | sst1InitVgaPassCtrl( (FxU32*)context->info.hwDep.vgInfo.vgBaseAddr,
|
---|
147 | FXFALSE );
|
---|
148 | break;
|
---|
149 | }
|
---|
150 | return FXTRUE;
|
---|
151 | }
|
---|
152 |
|
---|
153 | static FxBool FX_CALL wrapFIFO(InitFIFOData *fd) {
|
---|
154 | return FXTRUE;
|
---|
155 | }
|
---|
156 |
|
---|
157 | static void FX_CALL gamma( double gamma ) {
|
---|
158 | sst1InitGamma((FxU32 *) context->info.hwDep.vgInfo.vgBaseAddr, gamma);
|
---|
159 | }
|
---|
160 |
|
---|
161 | static void FX_CALL sliPciOwner( FxU32 *regbase, FxU32 owner ) {
|
---|
162 | sst1InitSliPciOwner(regbase, owner);
|
---|
163 | }
|
---|
164 |
|
---|
165 | static FxBool FX_CALL gammargb( double r, double g, double b ) {
|
---|
166 | return sst1InitGammaRGB((FxU32 *) context->info.hwDep.vgInfo.vgBaseAddr, r, g, b);
|
---|
167 | }
|
---|
168 |
|
---|
169 | static FxBool FX_CALL gammatable( FxU32 nentries, FxU32 *r, FxU32 *g, FxU32 *b ) {
|
---|
170 | return sst1InitGammaTable((FxU32 *) context->info.hwDep.vgInfo.vgBaseAddr, nentries, r, g, b);
|
---|
171 | }
|
---|
172 |
|
---|
173 | static sst1VideoTimingStruct * FX_CALL findvidtiming( GrScreenResolution_t sRes, GrScreenRefresh_t vRefresh) {
|
---|
174 | return sst1InitFindVideoTimingStruct(sRes, vRefresh);
|
---|
175 | }
|
---|
176 |
|
---|
177 | void vgDriverInit( InitContext *context ) {
|
---|
178 | context->setVideo = setVideo;
|
---|
179 | context->restoreVideo = restoreVideo;
|
---|
180 | context->enableTransport = enableTransport;
|
---|
181 | context->disableTransport = disableTransport;
|
---|
182 | context->swapBuffers = swapBuffers;
|
---|
183 | context->status = status;
|
---|
184 | context->busy = busy;
|
---|
185 | context->idle = idle;
|
---|
186 | context->getBufferPtr = getBufferPtr;
|
---|
187 | context->renderBuffer = renderBuffer;
|
---|
188 | context->origin = origin;
|
---|
189 | context->ioCtl = ioCtl;
|
---|
190 | context->control = control;
|
---|
191 | context->wrapFIFO = wrapFIFO;
|
---|
192 |
|
---|
193 |
|
---|
194 | context->gamma = gamma;
|
---|
195 | context->sliPciOwner = sliPciOwner;
|
---|
196 |
|
---|
197 | context->gammaRGB = gammargb;
|
---|
198 | context->initGammaTable = gammatable;
|
---|
199 | context->findVidTimingStruct = findvidtiming;
|
---|
200 |
|
---|
201 | }
|
---|
202 |
|
---|