2 * DirectDraw driver interface
4 * Copyright 2001 TransGaming Technologies, Inc.
16 #include "debugtools.h"
18 DEFAULT_DEBUG_CHANNEL(x11drv
);
20 LPDDRAWI_DDRAWSURFACE_LCL X11DRV_DD_Primary
;
21 LPDDRAWI_DDRAWSURFACE_GBL X11DRV_DD_PrimaryGbl
;
22 HBITMAP X11DRV_DD_PrimaryDIB
;
23 Drawable X11DRV_DD_PrimaryDrawable
;
24 ATOM X11DRV_DD_UserClass
;
25 BOOL X11DRV_DD_IsDirect
;
27 static void SetPrimaryDIB(HBITMAP hBmp
)
29 X11DRV_DD_PrimaryDIB
= hBmp
;
32 bmp
= (BITMAPOBJ
*)GDI_GetObjPtr( hBmp
, BITMAP_MAGIC
);
33 X11DRV_DD_PrimaryDrawable
= (Pixmap
)bmp
->physBitmap
;
34 GDI_ReleaseObj( hBmp
);
36 X11DRV_DD_PrimaryDrawable
= 0;
40 static DWORD PASCAL
X11DRV_DDHAL_DestroyDriver(LPDDHAL_DESTROYDRIVERDATA data
)
43 return DDHAL_DRIVER_HANDLED
;
46 static DWORD PASCAL
X11DRV_DDHAL_CreateSurface(LPDDHAL_CREATESURFACEDATA data
)
48 if (data
->lpDDSurfaceDesc
->ddsCaps
.dwCaps
& DDSCAPS_PRIMARYSURFACE
) {
49 X11DRV_DD_Primary
= *data
->lplpSList
;
50 X11DRV_DD_PrimaryGbl
= X11DRV_DD_Primary
->lpGbl
;
51 SetPrimaryDIB(GET_LPDDRAWSURFACE_GBL_MORE(X11DRV_DD_PrimaryGbl
)->hKernelSurface
);
52 X11DRV_DD_UserClass
= GlobalFindAtomA("WINE_DDRAW");
55 return DDHAL_DRIVER_NOTHANDLED
;
58 static DWORD PASCAL
X11DRV_DDHAL_CreatePalette(LPDDHAL_CREATEPALETTEDATA data
)
61 /* only makes sense to do anything if the X server is running at 8bpp,
62 * which few people do nowadays */
64 return DDHAL_DRIVER_HANDLED
;
67 static DDHAL_DDCALLBACKS hal_ddcallbacks
= {
68 sizeof(DDHAL_DDCALLBACKS
),
69 0x3ff, /* all callbacks are 32-bit */
70 X11DRV_DDHAL_DestroyDriver
,
71 X11DRV_DDHAL_CreateSurface
,
72 NULL
, /* SetColorKey */
74 NULL
, /* WaitForVerticalBlank */
75 NULL
, /* CanCreateSurface */
76 X11DRV_DDHAL_CreatePalette
,
77 NULL
, /* GetScanLine */
78 NULL
, /* SetExclusiveMode */
79 NULL
/* FlipToGDISurface */
82 static DWORD PASCAL
X11DRV_DDHAL_DestroySurface(LPDDHAL_DESTROYSURFACEDATA data
)
84 if (data
->lpDDSurface
== X11DRV_DD_Primary
) {
85 X11DRV_DD_Primary
= NULL
;
86 X11DRV_DD_PrimaryGbl
= NULL
;
88 X11DRV_DD_UserClass
= 0;
91 return DDHAL_DRIVER_HANDLED
;
94 static DWORD PASCAL
X11DRV_DDHAL_SetPalette(LPDDHAL_SETPALETTEDATA data
)
96 Colormap pal
= data
->lpDDPalette
->u1
.dwReserved1
;
98 if (data
->lpDDSurface
== X11DRV_DD_Primary
) {
100 /* we should probably find the ddraw window (maybe data->lpDD->lpExclusiveOwner->hWnd),
101 * and attach the palette to it */
104 data
->ddRVal
= DD_OK
;
105 return DDHAL_DRIVER_HANDLED
;
108 static DDHAL_DDSURFACECALLBACKS hal_ddsurfcallbacks
= {
109 sizeof(DDHAL_DDSURFACECALLBACKS
),
110 0x3fff, /* all callbacks are 32-bit */
111 X11DRV_DDHAL_DestroySurface
,
113 NULL
, /* SetClipList */
117 NULL
, /* SetColorKey */
118 NULL
, /* AddAttachedSurface */
119 NULL
, /* GetBltStatus */
120 NULL
, /* GetFlipStatus */
121 NULL
, /* UpdateOverlay */
122 NULL
, /* SetOverlayPosition */
123 NULL
, /* reserved4 */
124 X11DRV_DDHAL_SetPalette
127 static DWORD PASCAL
X11DRV_DDHAL_DestroyPalette(LPDDHAL_DESTROYPALETTEDATA data
)
129 Colormap pal
= data
->lpDDPalette
->u1
.dwReserved1
;
130 if (pal
) TSXFreeColormap(display
, pal
);
131 data
->ddRVal
= DD_OK
;
132 return DDHAL_DRIVER_HANDLED
;
135 static DWORD PASCAL
X11DRV_DDHAL_SetPaletteEntries(LPDDHAL_SETENTRIESDATA data
)
137 X11DRV_DDHAL_SetPalEntries(data
->lpDDPalette
->u1
.dwReserved1
,
138 data
->dwBase
, data
->dwNumEntries
,
140 data
->ddRVal
= DD_OK
;
141 return DDHAL_DRIVER_HANDLED
;
144 static DDHAL_DDPALETTECALLBACKS hal_ddpalcallbacks
= {
145 sizeof(DDHAL_DDPALETTECALLBACKS
),
146 0x3, /* all callbacks are 32-bit */
147 X11DRV_DDHAL_DestroyPalette
,
148 X11DRV_DDHAL_SetPaletteEntries
151 static DDHALINFO hal_info
= {
154 &hal_ddsurfcallbacks
,
162 0, /* dwMonitorFrequency */
163 NULL
, /* GetDriverInfo */
165 NULL
, /* lpdwFourCC */
167 NULL
, /* lpModeInfo */
168 DDHALINFO_ISPRIMARYDISPLAY
| DDHALINFO_MODEXILLEGAL
, /* dwFlags */
169 NULL
, /* lpPDevice */
173 static LPDDHALDDRAWFNS ddraw_fns
;
174 static DWORD ddraw_ver
;
176 static void X11DRV_DDHAL_SetInfo(void)
178 (ddraw_fns
->lpSetInfo
)(&hal_info
, FALSE
);
181 INT
X11DRV_DCICommand(INT cbInput
, LPVOID lpInData
, LPVOID lpOutData
)
183 LPDCICMD lpCmd
= (LPDCICMD
)lpInData
;
185 TRACE("(%d,(%ld,%ld,%ld),%p)\n", cbInput
, lpCmd
->dwCommand
,
186 lpCmd
->dwParam1
, lpCmd
->dwParam2
, lpOutData
);
188 switch (lpCmd
->dwCommand
) {
189 case DDNEWCALLBACKFNS
:
190 ddraw_fns
= (LPDDHALDDRAWFNS
)lpCmd
->dwParam1
;
194 LPDDVERSIONDATA lpVer
= (LPDDVERSIONDATA
)lpOutData
;
195 ddraw_ver
= lpCmd
->dwParam1
;
197 /* well, whatever... the DDK says so */
198 lpVer
->dwHALVersion
= DD_RUNTIME_VERSION
;
201 case DDGET32BITDRIVERNAME
:
203 LPDD32BITDRIVERDATA lpData
= (LPDD32BITDRIVERDATA
)lpOutData
;
204 /* here, we could ask ddraw to load a separate DLL, that
205 * would contain the 32-bit ddraw HAL */
206 strcpy(lpData
->szName
,"x11drv");
207 /* the entry point named here should initialize our hal_info
208 * with 32-bit entry points (ignored for now) */
209 strcpy(lpData
->szEntryPoint
,"DriverInit");
210 lpData
->dwContext
= 0;
213 case DDCREATEDRIVEROBJECT
:
215 LPDWORD lpInstance
= (LPDWORD
)lpOutData
;
217 /* FIXME: get x11drv's hInstance */
218 #ifdef HAVE_LIBXXF86DGA2
219 /*if (!X11DRV_XF86DGA2_CreateDriver(&hal_info))*/
222 #ifdef HAVE_LIBXXF86VM
223 X11DRV_XF86VM_CreateDriver(&hal_info
);
227 (ddraw_fns
->lpSetInfo
)(&hal_info
, FALSE
);
228 *lpInstance
= hal_info
.hInstance
;
235 void X11DRV_DDHAL_SwitchMode(DWORD dwModeIndex
, LPVOID fb_addr
)
237 LPDDHALMODEINFO info
= &hal_info
.lpModeInfo
[dwModeIndex
];
239 hal_info
.dwModeIndex
= dwModeIndex
;
240 hal_info
.dwMonitorFrequency
= info
->wRefreshRate
;
241 hal_info
.vmiData
.fpPrimary
= (FLATPTR
)fb_addr
;
242 hal_info
.vmiData
.dwDisplayWidth
= info
->dwWidth
;
243 hal_info
.vmiData
.dwDisplayHeight
= info
->dwHeight
;
244 hal_info
.vmiData
.lDisplayPitch
= info
->lPitch
;
245 hal_info
.vmiData
.ddpfDisplay
.dwSize
= info
->dwBPP
? sizeof(hal_info
.vmiData
.ddpfDisplay
) : 0;
246 hal_info
.vmiData
.ddpfDisplay
.dwFlags
= (info
->wFlags
& DDMODEINFO_PALETTIZED
) ? DDPF_PALETTEINDEXED8
: 0;
247 hal_info
.vmiData
.ddpfDisplay
.u1
.dwRGBBitCount
= (info
->dwBPP
> 24) ? 24 : info
->dwBPP
;
248 hal_info
.vmiData
.ddpfDisplay
.u2
.dwRBitMask
= info
->dwRBitMask
;
249 hal_info
.vmiData
.ddpfDisplay
.u3
.dwGBitMask
= info
->dwGBitMask
;
250 hal_info
.vmiData
.ddpfDisplay
.u4
.dwBBitMask
= info
->dwBBitMask
;
252 X11DRV_DDHAL_SetInfo();
255 void X11DRV_DDHAL_SetPalEntries(Colormap pal
, DWORD dwBase
, DWORD dwNumEntries
,
256 LPPALETTEENTRY lpEntries
)
262 c
.flags
= DoRed
|DoGreen
|DoBlue
;
264 for (n
=0; n
<dwNumEntries
; n
++,c
.pixel
++) {
265 c
.red
= lpEntries
[n
].peRed
<< 8;
266 c
.green
= lpEntries
[n
].peGreen
<< 8;
267 c
.blue
= lpEntries
[n
].peBlue
<< 8;
268 TSXStoreColor(display
, pal
, &c
);
270 TSXFlush(display
); /* update display immediate */