Author: greatlrd
Date: Sat Nov 29 11:53:51 2008
New Revision: 37735
URL:
http://svn.reactos.org/svn/reactos?rev=37735&view=rev
Log:
trying implement DdCreateSurface for wined3d
Modified:
branches/reactx/reactos/dll/win32/gdi32/misc/gdientryhelgl.c
Modified: branches/reactx/reactos/dll/win32/gdi32/misc/gdientryhelgl.c
URL:
http://svn.reactos.org/svn/reactos/branches/reactx/reactos/dll/win32/gdi32/…
==============================================================================
--- branches/reactx/reactos/dll/win32/gdi32/misc/gdientryhelgl.c [iso-8859-1] (original)
+++ branches/reactx/reactos/dll/win32/gdi32/misc/gdientryhelgl.c [iso-8859-1] Sat Nov 29
11:53:51 2008
@@ -396,259 +396,94 @@
DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface)
{
/* Fixme for opengl hel emulations */
- HEL_OGL_STUB;
-
-#if 0
- DWORD Return = DDHAL_DRIVER_NOTHANDLED;
- ULONG SurfaceCount = pCreateSurface->dwSCnt;
- DD_SURFACE_LOCAL DdSurfaceLocal;
- DD_SURFACE_MORE DdSurfaceMore;
- DD_SURFACE_GLOBAL DdSurfaceGlobal;
-
- HANDLE hPrevSurface, hSurface;
-
- PDD_SURFACE_LOCAL pDdSurfaceLocal = NULL;
- PDD_SURFACE_MORE pDdSurfaceMore = NULL;
- PDD_SURFACE_GLOBAL pDdSurfaceGlobal = NULL;
-
- PDD_SURFACE_LOCAL ptmpDdSurfaceLocal = NULL;
- PDD_SURFACE_MORE ptmpDdSurfaceMore = NULL;
- PDD_SURFACE_GLOBAL ptmpDdSurfaceGlobal = NULL;
- PHANDLE phSurface = NULL, puhSurface = NULL;
- ULONG i;
- LPDDSURFACEDESC pSurfaceDesc = NULL;
-
- /* TODO : Speed optimze, most games/dx apps/program does not want 1 surface, they
want lest 2
- * so we need incress the stack so it can contain 2 surface instead of one, this will
incress
- * the speed of the apps when it trying alloc buffer. How to incress the surface
stack space
- * we need create a own struct for DD_SURFACE_LOCAL DdSurfaceLocal, DD_SURFACE_MORE
DdSurfaceMore
- * DD_SURFACE_GLOBAL DdSurfaceGlobal. HANDLE hPrevSurface, hSurface. like
- * struct { DD_SURFACE_LOCAL DdSurfaceLocal1, DD_SURFACE_LOCAL DdSurfaceLocal2 }
- * lest so it contain two surface. maybe 4. we need watch what is most common here
before
- * we create the size activate this IF when you start doing the optimze and please
also
- * take report from user which value they got here
- */
-#if 1
- {
- char buffer[1024]; \
- sprintf ( buffer, "Function %s : Optimze max to %d Surface ?
(%s:%d)\n", __FUNCTION__, (int)SurfaceCount,__FILE__,__LINE__ );
- OutputDebugStringA(buffer);
- }
-#endif
-
- /* Check how many surfaces there are */
- if (SurfaceCount != 1)
- {
- /* We got more that one surface so we need alloc memory for them */
- pDdSurfaceLocal = (PDD_SURFACE_LOCAL) HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY, (sizeof(DD_SURFACE_LOCAL) * SurfaceCount ));
- pDdSurfaceMore = (PDD_SURFACE_MORE) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
(sizeof(DD_SURFACE_MORE) * SurfaceCount ));
- pDdSurfaceGlobal = (PDD_SURFACE_GLOBAL) HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY, (sizeof(DD_SURFACE_GLOBAL) * SurfaceCount ));
- phSurface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(HANDLE) *
SurfaceCount ));
- puhSurface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (sizeof(HANDLE) *
SurfaceCount ));
-
- /* check if we sueese alloc all memory we need */
- if ((pDdSurfaceLocal == NULL) || (pDdSurfaceMore == NULL) || (pDdSurfaceGlobal ==
NULL) || (phSurface == NULL) || (puhSurface == NULL))
- {
- pCreateSurface->ddRVal = DDERR_OUTOFMEMORY;
-
- if ( pDdSurfaceLocal != NULL )
- {
- HeapFree(GetProcessHeap(), 0, pDdSurfaceLocal);
- }
-
- if ( pDdSurfaceMore != NULL )
- {
- HeapFree(GetProcessHeap(), 0, pDdSurfaceMore);
- }
-
- if ( phSurface != NULL )
- {
- HeapFree(GetProcessHeap(), 0, phSurface);
- }
-
- if ( puhSurface != NULL )
- {
- HeapFree(GetProcessHeap(), 0, puhSurface);
- }
-
- return DDHAL_DRIVER_HANDLED;
- }
+
+ ULONG SurfaceCount;
+ DDSURFACEDESC2 desc2;
+ LPDDSURFACEDESC pSurfaceDesc;
+
+ HRESULT hrc = DD_OK;
+ UINT Height;
+ UINT Width;
+ INT i;
+ IWineD3DSurface *object;
+ IWineD3D *pWined3d = (IWineD3D*) GetDdHandle(pCreateSurface->lpDD->hDD);
+ IWineD3DDevice * pWineD3DDevice = (IWineD3DDevice*)
pCreateSurface->lpDD->dwUnused3;
+ void *Parent = NULL;
+
+ if ( (!pWined3d) ||
+ (!pWineD3DDevice))
+ {
+ return DDHAL_DRIVER_NOTHANDLED;
+ }
+
+ SurfaceCount = pCreateSurface->dwSCnt;
+ pSurfaceDesc = pCreateSurface->lpDDSurfaceDesc;
+ Height = pSurfaceDesc->dwHeight;
+ Width = pSurfaceDesc->dwWidth;
+
+ if (pSurfaceDesc->dwSize == sizeof(DDSURFACEDESC2))
+ {
+ RtlCopyMemory(&desc2,pSurfaceDesc,sizeof(DDSURFACEDESC2));
}
else
{
- /* We'll use what we have on the stack */
- pDdSurfaceLocal = &DdSurfaceLocal;
- pDdSurfaceMore = &DdSurfaceMore;
- pDdSurfaceGlobal = &DdSurfaceGlobal;
- phSurface = &hPrevSurface;
- puhSurface = &hSurface;
-
- /* Clear the structures */
- RtlZeroMemory(&DdSurfaceLocal, sizeof(DdSurfaceLocal));
- RtlZeroMemory(&DdSurfaceGlobal, sizeof(DdSurfaceGlobal));
- RtlZeroMemory(&DdSurfaceMore, sizeof(DdSurfaceMore));
- }
-
- /* check if we got a surface or not */
- if (SurfaceCount!=0)
- {
- /* Loop for each surface */
- ptmpDdSurfaceGlobal = pDdSurfaceGlobal;
- ptmpDdSurfaceLocal = pDdSurfaceLocal;
- ptmpDdSurfaceMore = pDdSurfaceMore;
- pSurfaceDesc = pCreateSurface->lpDDSurfaceDesc;
-
- for (i = 0; i < SurfaceCount; i++)
- {
- LPDDRAWI_DDRAWSURFACE_LCL lcl = pCreateSurface->lplpSList[i];
- LPDDRAWI_DDRAWSURFACE_GBL gpl = pCreateSurface->lplpSList[i]->lpGbl;
-
- phSurface[i] = (HANDLE)lcl->hDDSurface;
- ptmpDdSurfaceLocal->ddsCaps.dwCaps = lcl->ddsCaps.dwCaps;
-
- ptmpDdSurfaceLocal->dwFlags = (ptmpDdSurfaceLocal->dwFlags &
- (0xB0000000 | DDRAWISURF_INMASTERSPRITELIST |
- DDRAWISURF_HELCB | DDRAWISURF_FRONTBUFFER |
- DDRAWISURF_BACKBUFFER | DDRAWISURF_INVALID |
- DDRAWISURF_DCIBUSY | DDRAWISURF_DCILOCK)) |
- (lcl->dwFlags &
DDRAWISURF_DRIVERMANAGED);
-
- ptmpDdSurfaceGlobal->wWidth = gpl->wWidth;
- ptmpDdSurfaceGlobal->wHeight = gpl->wHeight;
- ptmpDdSurfaceGlobal->lPitch = gpl->lPitch;
- ptmpDdSurfaceGlobal->fpVidMem = gpl->fpVidMem;
- ptmpDdSurfaceGlobal->dwBlockSizeX = gpl->dwBlockSizeX;
- ptmpDdSurfaceGlobal->dwBlockSizeY = gpl->dwBlockSizeY;
-
- if (lcl->dwFlags & DDRAWISURF_HASPIXELFORMAT)
- {
- RtlCopyMemory( &ptmpDdSurfaceGlobal->ddpfSurface ,
- &gpl->ddpfSurface,
- sizeof(DDPIXELFORMAT));
-
- ptmpDdSurfaceGlobal->ddpfSurface.dwSize = sizeof(DDPIXELFORMAT);
- }
- else
- {
- RtlCopyMemory( &ptmpDdSurfaceGlobal->ddpfSurface ,
- &gpl->lpDD->vmiData.ddpfDisplay,
- sizeof(DDPIXELFORMAT));
- }
-
- /* Note if lcl->lpSurfMore is NULL zero out
- * ptmpDdSurfaceMore->ddsCapsEx.dwCaps2,
- * dwCaps3, dwCaps4, ptmpDdSurfaceMore->dwSurfaceHandle
- */
- if (lcl->lpSurfMore)
- {
- ptmpDdSurfaceMore->ddsCapsEx.dwCaps2 =
lcl->lpSurfMore->ddsCapsEx.dwCaps2;
- ptmpDdSurfaceMore->ddsCapsEx.dwCaps3 =
lcl->lpSurfMore->ddsCapsEx.dwCaps3;
- ptmpDdSurfaceMore->ddsCapsEx.dwCaps4 =
lcl->lpSurfMore->ddsCapsEx.dwCaps4;
- ptmpDdSurfaceMore->dwSurfaceHandle =
lcl->lpSurfMore->dwSurfaceHandle;
- }
-
-
- /* count to next SurfaceCount */
- ptmpDdSurfaceGlobal = (PDD_SURFACE_GLOBAL) (((PBYTE) ((ULONG_PTR)
ptmpDdSurfaceGlobal)) + sizeof(DD_SURFACE_GLOBAL));
- ptmpDdSurfaceLocal = (PDD_SURFACE_LOCAL) (((PBYTE) ((ULONG_PTR)
ptmpDdSurfaceLocal)) + sizeof(DD_SURFACE_LOCAL));
- ptmpDdSurfaceMore = (PDD_SURFACE_MORE) (((PBYTE) ((ULONG_PTR)
ptmpDdSurfaceMore)) + sizeof(DD_SURFACE_MORE));
- }
- }
-
- /* Call win32k now */
+ RtlZeroMemory(&desc2,sizeof(DDSURFACEDESC2));
+ RtlCopyMemory(&desc2,pSurfaceDesc,sizeof(DDSURFACEDESC));
+ desc2.dwSize = sizeof(DDSURFACEDESC2);
+ }
+
pCreateSurface->ddRVal = DDERR_GENERIC;
-
- Return = NtGdiDdCreateSurface(GetDdHandle(pCreateSurface->lpDD->hDD),
- (HANDLE *)phSurface,
- pSurfaceDesc,
- pDdSurfaceGlobal,
- pDdSurfaceLocal,
- pDdSurfaceMore,
- (PDD_CREATESURFACEDATA)pCreateSurface,
- puhSurface);
-
- if (SurfaceCount == 0)
- {
- pCreateSurface->ddRVal = DDERR_GENERIC;
- }
- else
- {
- ptmpDdSurfaceMore = pDdSurfaceMore;
- ptmpDdSurfaceGlobal = pDdSurfaceGlobal;
- ptmpDdSurfaceLocal = pDdSurfaceLocal;
+ if (SurfaceCount != 0)
+ {
+ /* Fixme for opengl hel emulations */
+ DPRINT1("DdCreateSurface entered\n");
+
+ pCreateSurface->ddRVal = DD_OK;
for (i=0;i<SurfaceCount;i++)
{
LPDDRAWI_DDRAWSURFACE_LCL lcl = pCreateSurface->lplpSList[i];
- LPDDRAWI_DDRAWSURFACE_GBL gpl = pCreateSurface->lplpSList[i]->lpGbl;
-
- gpl->lPitch = ptmpDdSurfaceGlobal->lPitch;
- gpl->fpVidMem = ptmpDdSurfaceGlobal->fpVidMem;
- gpl->dwBlockSizeX = ptmpDdSurfaceGlobal->dwBlockSizeX;
- gpl->dwBlockSizeY = ptmpDdSurfaceGlobal->dwBlockSizeY;
-
- if (lcl->dwFlags & DDRAWISURF_HASPIXELFORMAT)
- {
- RtlCopyMemory( &gpl->ddpfSurface,
&ptmpDdSurfaceGlobal->ddpfSurface , sizeof(DDPIXELFORMAT));
- }
-
- if (pCreateSurface->ddRVal != DD_OK)
- {
- gpl->fpVidMem = 0;
- if (lcl->hDDSurface)
- {
- NtGdiDdDeleteSurfaceObject( (HANDLE)lcl->hDDSurface);
- }
- lcl->hDDSurface = 0;
- }
- else
- {
-
- lcl->hDDSurface = (ULONG_PTR) puhSurface[i];
- }
-
- lcl->ddsCaps.dwCaps = ptmpDdSurfaceLocal->ddsCaps.dwCaps;
- if (lcl->lpSurfMore)
- {
- lcl->lpSurfMore->ddsCapsEx.dwCaps2 =
ptmpDdSurfaceMore->ddsCapsEx.dwCaps2;
- lcl->lpSurfMore->ddsCapsEx.dwCaps3 =
ptmpDdSurfaceMore->ddsCapsEx.dwCaps3;
- lcl->lpSurfMore->ddsCapsEx.dwCaps4 =
ptmpDdSurfaceMore->ddsCapsEx.dwCaps4;
- }
-
- /* count to next SurfaceCount */
- ptmpDdSurfaceGlobal = (PDD_SURFACE_GLOBAL) (((PBYTE) ((ULONG_PTR)
ptmpDdSurfaceGlobal)) + sizeof(DD_SURFACE_GLOBAL));
- ptmpDdSurfaceLocal = (PDD_SURFACE_LOCAL) (((PBYTE) ((ULONG_PTR)
ptmpDdSurfaceLocal)) + sizeof(DD_SURFACE_LOCAL));
- ptmpDdSurfaceMore = (PDD_SURFACE_MORE) (((PBYTE) ((ULONG_PTR)
ptmpDdSurfaceMore)) + sizeof(DD_SURFACE_MORE));
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(IWineD3DSurface));
+ if (NULL == object)
+ {
+ DPRINT1("Allocation of memory failed\n");
+ pCreateSurface->ddRVal = DDERR_OUTOFVIDEOMEMORY;
+ }
+ lcl->hDDSurface = (ULONG_PTR) object;
}
- }
-
- /* Check if we have to free all our local allocations */
- if (SurfaceCount > 1)
- {
- if ( pDdSurfaceLocal != NULL )
+
+ if ( pCreateSurface->ddRVal == DD_OK)
{
- HeapFree(GetProcessHeap(), 0, pDdSurfaceLocal);
+ for (i=0;i<SurfaceCount;i++)
+ {
+ LPDDRAWI_DDRAWSURFACE_LCL lcl = pCreateSurface->lplpSList[i];
+
+ hrc = IWineD3DDevice_CreateSurface(pWineD3DDevice,
+ Width,
+ Height,
+ WINED3DFMT_R8G8B8,
+ TRUE /* Lockable */,
+ FALSE /* Discard */,
+ 1,
+ (IWineD3DSurface
**)&lcl->hDDSurface,
+ WINED3DRTYPE_SURFACE, /**/
+ WINED3DUSAGE_DYNAMIC &
WINED3DUSAGE_MASK,
+ WINED3DPOOL_DEFAULT,
+ WINED3DMULTISAMPLE_NONE,
+ 0 /* MultiSampleQuality */,
+ 0 /* SharedHandle */,
+ SURFACE_OPENGL,
+ (IUnknown *)Parent);
+ }
+ if (hrc != D3D_OK )
+ {
+ pCreateSurface->ddRVal = DDERR_GENERIC;
+ }
}
-
- if ( pDdSurfaceMore != NULL )
- {
- HeapFree(GetProcessHeap(), 0, pDdSurfaceMore);
- }
-
- if ( phSurface != NULL )
- {
- HeapFree(GetProcessHeap(), 0, phSurface);
- }
-
- if ( puhSurface != NULL )
- {
- HeapFree(GetProcessHeap(), 0, puhSurface);
- }
}
/* Return */
- return Return;
-#endif
+ return DDHAL_DRIVER_HANDLED;
}
/*