3 * COPYRIGHT: See COPYING in the top level directory
5 * FILE: lib/ddraw/hal/surface.c
6 * PURPOSE: DirectDraw HAL Implementation
7 * PROGRAMMER: Magnus Olsen, Maarten Bosma
13 HRESULT
Hal_DDrawSurface_Initialize (LPDIRECTDRAWSURFACE7 iface
, LPDIRECTDRAW pDD
, LPDDSURFACEDESC2 pDDSD2
)
15 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
17 if(sizeof(DDSURFACEDESC2
) != pDDSD2
->dwSize
)
18 return DDERR_UNSUPPORTED
;
20 This
->owner
= (IDirectDrawImpl
*)pDD
;
22 /************ fill the discription of our primary surface ***********************/
24 memset (&This
->ddsd
, 0, sizeof(DDSURFACEDESC
));
25 This
->ddsd
.dwSize
= sizeof(DDSURFACEDESC
);
27 RtlCopyMemory(&This
->ddsd
.ddckCKDestBlt
,&pDDSD2
->ddckCKDestBlt
,sizeof(This
->ddsd
.ddckCKDestBlt
));
28 RtlCopyMemory(&This
->ddsd
.ddckCKDestOverlay
,&pDDSD2
->ddckCKDestOverlay
,sizeof(This
->ddsd
.ddckCKDestOverlay
));
29 RtlCopyMemory(&This
->ddsd
.ddckCKSrcBlt
,&pDDSD2
->ddckCKSrcBlt
,sizeof(This
->ddsd
.ddckCKSrcBlt
));
30 RtlCopyMemory(&This
->ddsd
.ddckCKSrcOverlay
,&pDDSD2
->ddckCKSrcOverlay
,sizeof(This
->ddsd
.ddckCKSrcOverlay
));
31 RtlCopyMemory(&This
->ddsd
.ddpfPixelFormat
,&pDDSD2
->ddpfPixelFormat
,sizeof(This
->ddsd
.ddpfPixelFormat
));
32 RtlCopyMemory(&This
->ddsd
.ddsCaps
,&pDDSD2
->ddsCaps
,sizeof(This
->ddsd
.ddsCaps
));
34 This
->ddsd
.dwAlphaBitDepth
= pDDSD2
->dwAlphaBitDepth
;
35 This
->ddsd
.dwBackBufferCount
= pDDSD2
->dwBackBufferCount
;
36 This
->ddsd
.dwFlags
= pDDSD2
->dwFlags
;
37 This
->ddsd
.dwHeight
= pDDSD2
->dwHeight
;
38 This
->ddsd
.dwLinearSize
= pDDSD2
->dwLinearSize
;
39 This
->ddsd
.dwMipMapCount
= pDDSD2
->dwMipMapCount
;
40 This
->ddsd
.dwRefreshRate
= pDDSD2
->dwRefreshRate
;
41 This
->ddsd
.dwReserved
= pDDSD2
->dwReserved
;
42 This
->ddsd
.dwWidth
= pDDSD2
->dwWidth
;
43 This
->ddsd
.lPitch
= pDDSD2
->lPitch
;
44 This
->ddsd
.lpSurface
= pDDSD2
->lpSurface
;
46 /************ Test see if we can Create Surface ***********************/
48 if (This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
)
50 /* can the driver create the surface */
51 DDHAL_CANCREATESURFACEDATA CanCreateData
;
52 memset(&CanCreateData
, 0, sizeof(DDHAL_CANCREATESURFACEDATA
));
53 CanCreateData
.lpDD
= &This
->owner
->DirectDrawGlobal
;
54 CanCreateData
.lpDDSurfaceDesc
= (LPDDSURFACEDESC
)&This
->ddsd
;
56 if (This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.CanCreateSurface(&CanCreateData
) == DDHAL_DRIVER_NOTHANDLED
)
57 return DDERR_INVALIDPARAMS
;
59 if(CanCreateData
.ddRVal
!= DD_OK
)
60 return CanCreateData
.ddRVal
;
63 /************ Create Surface ***********************/
65 /* surface global struct */
66 memset(&This
->Global
, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL
));
67 This
->Global
.lpDD
= &This
->owner
->DirectDrawGlobal
;
68 This
->Global
.wHeight
= This
->owner
->DirectDrawGlobal
.vmiData
.dwDisplayHeight
;
69 This
->Global
.wWidth
= This
->owner
->DirectDrawGlobal
.vmiData
.dwDisplayWidth
;
70 This
->Global
.dwLinearSize
= This
->owner
->DirectDrawGlobal
.vmiData
.lDisplayPitch
;
71 if(pDDSD2
->ddsCaps
.dwCaps
& DDSCAPS_PRIMARYSURFACE
)
72 This
->Global
.dwGlobalFlags
= DDRAWISURFGBL_ISGDISURFACE
;
74 /* surface more struct */
75 memset(&This
->More
, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE
));
76 This
->More
.dwSize
= sizeof(DDRAWI_DDRAWSURFACE_MORE
);
77 This
->More
.dmiDDrawReserved7
.wWidth
= This
->Global
.wWidth
;
78 This
->More
.dmiDDrawReserved7
.wHeight
= This
->Global
.wHeight
;
79 This
->More
.dmiDDrawReserved7
.wBPP
= This
->owner
->Bpp
;
80 This
->More
.dmiDDrawReserved7
.wRefreshRate
= This
->owner
->DirectDrawGlobal
.dwMonitorFrequency
;
81 //This->More.dmiDDrawReserved7.wMonitorsAttachedToDesktop = 2;
82 /* ToDo: fill ddsCapsEx */
84 /* surface local struct */
85 memset(&This
->Local
, 0, sizeof(DDRAWI_DDRAWSURFACE_LCL
));
86 This
->Local
.lpGbl
= &This
->Global
;
87 This
->Local
.lpSurfMore
= &This
->More
;
88 This
->Local
.ddsCaps
.dwCaps
= pDDSD2
->ddsCaps
.dwCaps
;
89 This
->Local
.dwProcessId
= This
->owner
->ExclusiveOwner
.dwProcessId
;
91 /* for the double pointer below */
92 This
->pLocal
[0] = &This
->Local
;
93 This
->pLocal
[1] = NULL
;
95 /* the parameter struct */
96 DDHAL_CREATESURFACEDATA CreateData
;
97 memset(&CreateData
, 0, sizeof(DDHAL_CREATESURFACEDATA
));
98 CreateData
.lpDD
= &This
->owner
->DirectDrawGlobal
;
99 CreateData
.lpDDSurfaceDesc
= (LPDDSURFACEDESC
)&This
->ddsd
;
100 CreateData
.dwSCnt
= 1;
101 CreateData
.lplpSList
= This
->pLocal
;
103 CreateData
.ddRVal
= 1;
105 /* this is the call we were waiting for */
106 if(This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.CreateSurface(&CreateData
) == DDHAL_DRIVER_NOTHANDLED
)
107 return DDERR_INVALIDPARAMS
;
110 /* FIXME remove the if and debug string*/
111 if(CreateData
.ddRVal
!= DD_OK
)
112 return CreateData
.ddRVal
;
114 OutputDebugString(L
"This does hit By Ati Readon but not for nvida :( ");
115 OutputDebugString(L
"Yet ;)");
121 HRESULT
Hal_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface
, LPRECT rDest
,
122 LPDIRECTDRAWSURFACE7 src
, LPRECT rSrc
, DWORD dwFlags
, LPDDBLTFX lpbltfx
)
126 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
127 IDirectDrawSurfaceImpl
* That
= (IDirectDrawSurfaceImpl
*)src
;
129 if (!(This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_BLT
))
131 return DDERR_NODRIVERSUPPORT
;
134 DDHAL_BLTDATA BltData
;
135 BltData
.lpDD
= &This
->owner
->DirectDrawGlobal
;
136 BltData
.dwFlags
= dwFlags
;
137 BltData
.lpDDDestSurface
= &This
->Local
;
138 if(rDest
) BltData
.rDest
= *(RECTL
*)rDest
;
139 if(rSrc
) BltData
.rSrc
= *(RECTL
*)rSrc
;
140 if(That
) BltData
.lpDDSrcSurface
= &That
->Local
;
141 if(lpbltfx
) BltData
.bltFX
= *lpbltfx
;
143 if (This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDDSurface
.Blt(&BltData
) != DDHAL_DRIVER_HANDLED
)
145 return DDERR_NODRIVERSUPPORT
;
148 return BltData
.ddRVal
;