[ros-diffs] [greatlrd] 37737: Createsurface now detect if it screen res or desc size it should use, and which level each surface are create in.
greatlrd at svn.reactos.org
greatlrd at svn.reactos.org
Sat Nov 29 20:21:30 CET 2008
Author: greatlrd
Date: Sat Nov 29 13:21:30 2008
New Revision: 37737
URL: http://svn.reactos.org/svn/reactos?rev=37737&view=rev
Log:
Createsurface now detect if it screen res or desc size it should use, and which level each surface are create in.
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/misc/gdientryhelgl.c?rev=37737&r1=37736&r2=37737&view=diff
==============================================================================
--- 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 13:21:30 2008
@@ -396,10 +396,10 @@
DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface)
{
/* Fixme for opengl hel emulations */
-
ULONG SurfaceCount;
DDSURFACEDESC2 desc2;
LPDDSURFACEDESC pSurfaceDesc;
+ WINED3DDISPLAYMODE Mode;
HRESULT hrc = DD_OK;
UINT Height;
@@ -409,7 +409,7 @@
IWineD3D *pWined3d = (IWineD3D*) GetDdHandle(pCreateSurface->lpDD->hDD);
IWineD3DDevice * pWineD3DDevice = (IWineD3DDevice*) pCreateSurface->lpDD->dwUnused3;
void *Parent = NULL;
-
+
if ( (!pWined3d) ||
(!pWineD3DDevice))
{
@@ -435,19 +435,112 @@
pCreateSurface->ddRVal = DDERR_GENERIC;
if (SurfaceCount != 0)
{
+ LPDDRAWI_DDRAWSURFACE_LCL lcl = pCreateSurface->lplpSList[0];
+
/* Fixme for opengl hel emulations */
DPRINT1("DdCreateSurface entered\n");
pCreateSurface->ddRVal = DD_OK;
+
+ lcl->lpGbl->wWidth = desc2.dwWidth;
+ lcl->lpGbl->wHeight = desc2.dwHeight;
+ lcl->lpGbl->dwLinearSize = desc2.dwLinearSize;
+ RtlCopyMemory(&lcl->lpGbl->ddpfSurface, &desc2.ddpfPixelFormat, sizeof(DDPIXELFORMAT))
+
+ /* Get the video mode from WineD3D - we will need it */
+ hr = IWineD3DDevice_GetDisplayMode(pWineD3DDevice, 0, &Mode);
+ if(FAILED(hr))
+ {
+
+ ERR("Failed to read display mode from wined3d\n");
+
+ if ((lcl->dwFlags & DDRAWISURF_HASPIXELFORMAT) == 0)
+ {
+ switch(pCreateSurface->lpDD->vmiData.ddpfDisplay.dwRGBBitCount)
+ {
+ case 8:
+ Mode.Format = WINED3DFMT_P8;
+ break;
+
+ case 15:
+ Mode.Format = WINED3DFMT_X1R5G5B5;
+ break;
+
+ case 16:
+ Mode.Format = WINED3DFMT_R5G6B5;
+ break;
+
+ case 24:
+ Mode.Format = WINED3DFMT_R8G8B8;
+ break;
+
+ case 32:
+ Mode.Format = WINED3DFMT_X8R8G8B8;
+ break;
+
+ default:
+ pCreateSurface->ddRVal = DDERR_GENERIC;
+ break;
+ }
+
+ Mode.Width = pCreateSurface->lpDD->vmiData.dwDisplayWidth;
+ Mode.Height = pCreateSurface->lpDD->vmiData.dwDisplayHeight;
+ }
+ else
+ {
+ if (lcl->lpGbl->ddpfSurface.dwFlags & DDPF_FOURCC)
+ {
+ Mode.Format = lcl->lpGbl->ddpfSurface.dwFourCC;
+ }
+ else
+ {
+ switch(lcl->lpGbl->ddpfSurface.dwRGBBitCount)
+ {
+ case 8:
+ Mode.Format = WINED3DFMT_P8;
+ break;
+
+ case 15:
+ Mode.Format = WINED3DFMT_X1R5G5B5;
+ break;
+
+ case 16:
+ Mode.Format = WINED3DFMT_R5G6B5;
+ break;
+
+ case 24:
+ Mode.Format = WINED3DFMT_R8G8B8;
+ break;
+
+ case 32:
+ Mode.Format = WINED3DFMT_X8R8G8B8;
+ break;
+
+ default:
+ pCreateSurface->ddRVal = DDERR_GENERIC;
+ break;
+ }
+ }
+ Mode.Width = lcl->lpGbl->wWidth;
+ Mode.Height = lcl->lpGbl->wHeight;
+ }
+ }
+ }
+
+ if (pCreateSurface->ddRVal = DD_OK)
+ {
+
for (i=0;i<SurfaceCount;i++)
{
LPDDRAWI_DDRAWSURFACE_LCL lcl = pCreateSurface->lplpSList[i];
+
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DSurface));
if (NULL == object)
{
DPRINT1("Allocation of memory failed\n");
pCreateSurface->ddRVal = DDERR_OUTOFVIDEOMEMORY;
+ break;
}
lcl->hDDSurface = (ULONG_PTR) object;
}
@@ -458,13 +551,14 @@
{
LPDDRAWI_DDRAWSURFACE_LCL lcl = pCreateSurface->lplpSList[i];
+ pWineD3DDevice->CreateSurface(
hrc = IWineD3DDevice_CreateSurface(pWineD3DDevice,
- Width,
- Height,
- WINED3DFMT_R8G8B8,
+ Mode.Width,
+ Mode.Height,
+ Mode.Format,
TRUE /* Lockable */,
FALSE /* Discard */,
- 1,
+ i,
(IWineD3DSurface **)&lcl->hDDSurface,
WINED3DRTYPE_SURFACE, /**/
WINED3DUSAGE_DYNAMIC & WINED3DUSAGE_MASK,
More information about the Ros-diffs
mailing list