2 * ReactOS Generic Framebuffer display driver directdraw interface
4 * Copyright (C) 2006 Magnus Olsen
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 DrvDisableDirectDraw( IN DHPDEV dhpdev
)
26 PPDEV ppdev
= (PPDEV
)dhpdev
;
27 ppdev
->bDDInitialized
= FALSE
;
28 /* Add Clean up code here if we need it
29 when we shout down directx interface */
35 OUT DD_CALLBACKS
*pCallBacks
,
36 OUT DD_SURFACECALLBACKS
*pSurfaceCallBacks
,
37 OUT DD_PALETTECALLBACKS
*pPaletteCallBacks
)
39 PPDEV ppdev
= (PPDEV
)dhpdev
;
41 if (ppdev
->bDDInitialized
)
46 /* Setup pixel format */
47 ppdev
->ddpfDisplay
.dwSize
= sizeof( DDPIXELFORMAT
);
48 ppdev
->ddpfDisplay
.dwFourCC
= 0;
50 ppdev
->ddpfDisplay
.dwRBitMask
= ppdev
->RedMask
;
51 ppdev
->ddpfDisplay
.dwGBitMask
= ppdev
->GreenMask
;
52 ppdev
->ddpfDisplay
.dwBBitMask
= ppdev
->BlueMask
;
54 ppdev
->ddpfDisplay
.dwRGBBitCount
=ppdev
->BitsPerPixel
;
55 ppdev
->ddpfDisplay
.dwRGBAlphaBitMask
= 0;
56 ppdev
->ddpfDisplay
.dwFlags
= DDPF_RGB
;
58 ppdev
->pvmList
= NULL
;
60 switch(ppdev
->iDitherFormat
)
63 ppdev
->ddpfDisplay
.dwFlags
|= DDPF_PALETTEINDEXED8
;
67 switch(ppdev
->RedMask
)
70 ppdev
->ddpfDisplay
.dwRGBAlphaBitMask
= 0x8000;
82 ppdev
->ddpfDisplay
.dwRGBAlphaBitMask
= 0xff000000;
86 /* FIXME unknown pixel bits */
87 ppdev
->ddpfDisplay
.dwRGBBitCount
=0;
91 if (pCallBacks
!=NULL
)
93 memset(pCallBacks
,0,sizeof(DD_CALLBACKS
));
95 /* FILL pCallBacks with hal stuff */
96 pCallBacks
->dwSize
= sizeof(DDHAL_DDCALLBACKS
);
97 pCallBacks
->CanCreateSurface
= (PDD_CANCREATESURFACE
)DdCanCreateSurface
;
98 pCallBacks
->CreateSurface
= (PDD_CREATESURFACE
)DdCreateSurface
;
100 /* Fill in the HAL Callback flags */
101 pCallBacks
->dwFlags
= DDHAL_CB32_CANCREATESURFACE
| DDHAL_CB32_CREATESURFACE
;
104 if (pSurfaceCallBacks
!=NULL
)
106 memset(pSurfaceCallBacks
,0,sizeof(DD_SURFACECALLBACKS
));
108 /* FILL pSurfaceCallBacks with hal stuff */
109 // pSurfaceCallBacks.dwSize = sizeof(DDHAL_DDSURFACECALLBACKS);
110 // pSurfaceCallBacks.DestroySurface = DdDestroySurface;
111 // pSurfaceCallBacks.Lock = DdLock;
112 // pSurfaceCallBacks.Blt = DdBlt;
114 // pSurfaceCallBacks->dwFlags = DDHAL_SURFCB32_DESTROYSURFACE | DDHAL_SURFCB32_LOCK | DDHAL_SURFCB32_BLT ;
117 if (pPaletteCallBacks
!=NULL
)
119 memset(pPaletteCallBacks
,0,sizeof(DD_PALETTECALLBACKS
));
120 /* FILL pPaletteCallBacks with hal stuff */
121 /* We will not support this callback in the framebuf.dll */
125 /* Fixme fill the ppdev->dxHalInfo with the info we need */
126 ppdev
->bDDInitialized
= TRUE
;
127 return ppdev
->bDDInitialized
;
131 DrvGetDirectDrawInfo(
133 OUT DD_HALINFO
*pHalInfo
,
134 OUT DWORD
*pdwNumHeaps
,
135 OUT VIDEOMEMORY
*pvmList
,
136 OUT DWORD
*pdwNumFourCCCodes
,
137 OUT DWORD
*pdwFourCC
)
139 PPDEV ppdev
= (PPDEV
)dhpdev
;
141 DWORD heap
= 1; /* we always alloc one heap */
142 BOOL bDDrawHeap
= FALSE
;
147 /* check so pHalInfo, pdwNumHeaps, pdwNumFourCCCodes is not NULL
148 pdwFourCC and pvmList can be null
151 if (pHalInfo
== NULL
)
154 if (pdwNumHeaps
== NULL
)
157 if (pdwNumFourCCCodes
== NULL
)
161 if ( (ppdev
->ScreenWidth
< ppdev
->MemWidth
) || (ppdev
->ScreenHeight
< ppdev
->MemHeight
))
167 ppdev
->dwHeap
= heap
;
170 /* We do not support other fourcc */
171 *pdwNumFourCCCodes
= 0;
175 check see if pvmList and pdwFourCC are frist call
176 or frist. Secon call we fill in pHalInfo info
179 if(!(pvmList
&& pdwFourCC
))
182 RtlZeroMemory(pHalInfo
, sizeof(DD_HALINFO
));
183 pHalInfo
->dwSize
= sizeof(DD_HALINFO
);
185 pHalInfo
->ddCaps
.dwCaps
= DDCAPS_BLT
| DDCAPS_BLTQUEUE
| DDCAPS_BLTCOLORFILL
| DDCAPS_READSCANLINE
|
186 DDCAPS_BLTSTRETCH
| DDCAPS_COLORKEY
| DDCAPS_CANBLTSYSMEM
;
188 pHalInfo
->ddCaps
.dwFXCaps
= DDFXCAPS_BLTSTRETCHY
| DDFXCAPS_BLTSTRETCHX
|
189 DDFXCAPS_BLTSTRETCHYN
| DDFXCAPS_BLTSTRETCHXN
|
190 DDFXCAPS_BLTSHRINKY
| DDFXCAPS_BLTSHRINKX
|
191 DDFXCAPS_BLTSHRINKYN
| DDFXCAPS_BLTSHRINKXN
|
192 DDFXCAPS_BLTMIRRORUPDOWN
| DDFXCAPS_BLTMIRRORLEFTRIGHT
;
194 pHalInfo
->ddCaps
.dwCaps2
= DDCAPS2_NONLOCALVIDMEM
| DDCAPS2_NONLOCALVIDMEMCAPS
;
196 pHalInfo
->ddCaps
.ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
| DDSCAPS_PRIMARYSURFACE
| DDSCAPS_FLIP
;
198 pHalInfo
->ddCaps
.dwCKeyCaps
= DDCKEYCAPS_SRCBLT
| DDCKEYCAPS_SRCBLTCLRSPACE
;
200 pHalInfo
->ddCaps
.dwSVBCaps
= DDCAPS_BLT
;
201 pHalInfo
->ddCaps
.ddsCaps
.dwCaps
|= DDSCAPS_LOCALVIDMEM
| DDSCAPS_NONLOCALVIDMEM
;
203 /* Calc how much memmory is left on the video cards memmory */
204 pHalInfo
->ddCaps
.dwVidMemTotal
= (ppdev
->MemHeight
- ppdev
->ScreenHeight
) * ppdev
->ScreenDelta
;
206 /* fill in some basic info that we need */
207 pHalInfo
->vmiData
.pvPrimary
= ppdev
->ScreenPtr
;
208 pHalInfo
->vmiData
.dwDisplayWidth
= ppdev
->ScreenWidth
;
209 pHalInfo
->vmiData
.dwDisplayHeight
= ppdev
->ScreenHeight
;
210 pHalInfo
->vmiData
.lDisplayPitch
= ppdev
->ScreenDelta
;
211 pHalInfo
->vmiData
.ddpfDisplay
.dwSize
= sizeof(DDPIXELFORMAT
);
212 pHalInfo
->vmiData
.ddpfDisplay
.dwFlags
= DDPF_RGB
;
213 pHalInfo
->vmiData
.ddpfDisplay
.dwRGBBitCount
= ppdev
->BitsPerPixel
;
214 pHalInfo
->vmiData
.ddpfDisplay
.dwRBitMask
= ppdev
->RedMask
;
215 pHalInfo
->vmiData
.ddpfDisplay
.dwGBitMask
= ppdev
->GreenMask
;
216 pHalInfo
->vmiData
.ddpfDisplay
.dwBBitMask
= ppdev
->BlueMask
;
217 pHalInfo
->vmiData
.dwOffscreenAlign
= 4;
219 if ( ppdev
->BitsPerPixel
== 8 )
221 pHalInfo
->vmiData
.ddpfDisplay
.dwFlags
|= DDPF_PALETTEINDEXED8
;
225 Config the rops we do not doing that yet
226 for we need write the rops table
228 for(i
=0;i
<DD_ROP_SPACE
;i
++ )
230 // pHALInfo->ddCaps.dwSVBRops[i] = rops[i];
231 // pHALInfo->ddCaps.dwRops[i] = rops[i];
235 /* Now build pvmList info */
238 ppdev
->pvmList
= pvmList
;
242 pvmList
->dwFlags
= VIDMEM_ISLINEAR
;
243 pvmList
->fpStart
= ppdev
->ScreenHeight
* ppdev
->ScreenDelta
;
244 pvmList
->fpEnd
= ppdev
->MemHeight
* ppdev
->ScreenDelta
- 1;
245 pvmList
->ddsCaps
.dwCaps
= DDSCAPS_OFFSCREENPLAIN
;
249 pvmList
->fpStart
= 0;
250 pvmList
->fpEnd
= (ppdev
->MemHeight
* ppdev
->ScreenDelta
) - 1;
251 pvmList
->dwFlags
= VIDMEM_ISNONLOCAL
| VIDMEM_ISLINEAR
| VIDMEM_ISWC
;
252 pvmList
->ddsCaps
.dwCaps
= DDSCAPS_FRONTBUFFER
| DDSCAPS_BACKBUFFER
;
253 pvmList
->ddsCapsAlt
.dwCaps
= DDSCAPS_FRONTBUFFER
| DDSCAPS_BACKBUFFER
;
255 pvmList
= ppdev
->pvmList
;