From 5b6863ed96a02bc5eab758aecf1cbf66135cc641 Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Sun, 5 Nov 2006 21:19:53 +0000 Subject: [PATCH] 1. Fixed some vc warings and fault 2. Implement AcquireDDThreadLock, ReleaseDDThreadLock (does not working as it should yet) 3. Start making ddraw thread safe 4. Fixed some mirors bugs svn path=/trunk/; revision=24690 --- reactos/dll/directx/ddraw/clipper.c | 14 +- reactos/dll/directx/ddraw/color.c | 15 +- reactos/dll/directx/ddraw/ddraw.def | 8 +- reactos/dll/directx/ddraw/gamma.c | 11 +- reactos/dll/directx/ddraw/hal/surface_hal.c | 2 +- reactos/dll/directx/ddraw/kernel.c | 22 +- reactos/dll/directx/ddraw/main.c | 58 ++- reactos/dll/directx/ddraw/main/ddraw_main.c | 339 +++++++++--------- reactos/dll/directx/ddraw/main/surface_main.c | 72 ++-- reactos/dll/directx/ddraw/palette.c | 15 +- reactos/dll/directx/ddraw/rosdraw.h | 7 + .../ddraw/soft/surface_callbacks_hel.c | 2 +- reactos/dll/directx/ddraw/soft/surface_hel.c | 2 +- reactos/dll/directx/ddraw/startup.c | 50 ++- .../dll/directx/ddraw/thunks/ddraw_thunk.c | 2 +- .../dll/directx/ddraw/thunks/surface_thunk.c | 2 +- 16 files changed, 361 insertions(+), 260 deletions(-) diff --git a/reactos/dll/directx/ddraw/clipper.c b/reactos/dll/directx/ddraw/clipper.c index b50ac67560a..bee251caa35 100644 --- a/reactos/dll/directx/ddraw/clipper.c +++ b/reactos/dll/directx/ddraw/clipper.c @@ -13,11 +13,12 @@ ULONG WINAPI DirectDrawClipper_Release(LPDIRECTDRAWCLIPPER iface) -{ - DX_WINDBG_trace(); +{ IDirectDrawClipperImpl* This = (IDirectDrawClipperImpl*)iface; ULONG ref=0; + + DX_WINDBG_trace(); if (iface!=NULL) { @@ -40,12 +41,11 @@ DirectDrawClipper_Release(LPDIRECTDRAWCLIPPER iface) ULONG WINAPI DirectDrawClipper_AddRef (LPDIRECTDRAWCLIPPER iface) -{ - DX_WINDBG_trace(); - - IDirectDrawClipperImpl * This = (IDirectDrawClipperImpl*)iface; - +{ + IDirectDrawClipperImpl * This = (IDirectDrawClipperImpl*)iface; ULONG ref=0; + + DX_WINDBG_trace(); if (iface!=NULL) { diff --git a/reactos/dll/directx/ddraw/color.c b/reactos/dll/directx/ddraw/color.c index 9e9ef031d0d..184fe1bf348 100644 --- a/reactos/dll/directx/ddraw/color.c +++ b/reactos/dll/directx/ddraw/color.c @@ -12,12 +12,11 @@ ULONG WINAPI DirectDrawColorControl_AddRef( LPDIRECTDRAWCOLORCONTROL iface) -{ - DX_WINDBG_trace(); - - IDirectDrawColorImpl * This = (IDirectDrawColorImpl*)iface; - +{ + IDirectDrawColorImpl * This = (IDirectDrawColorImpl*)iface; ULONG ref=0; + + DX_WINDBG_trace(); if (iface!=NULL) { @@ -28,12 +27,12 @@ DirectDrawColorControl_AddRef( LPDIRECTDRAWCOLORCONTROL iface) ULONG WINAPI DirectDrawColorControl_Release( LPDIRECTDRAWCOLORCONTROL iface) -{ - DX_WINDBG_trace(); - +{ IDirectDrawColorImpl* This = (IDirectDrawColorImpl*)iface; ULONG ref=0; + DX_WINDBG_trace(); + if (iface!=NULL) { ref = InterlockedDecrement( (PLONG) &This->ref); diff --git a/reactos/dll/directx/ddraw/ddraw.def b/reactos/dll/directx/ddraw/ddraw.def index a077cbdd68e..d08bb415ee3 100644 --- a/reactos/dll/directx/ddraw/ddraw.def +++ b/reactos/dll/directx/ddraw/ddraw.def @@ -1,7 +1,9 @@ EXPORTS -;AcquireDDThreadLock -;CompleteCreateSysmemSurface +AcquireDDThreadLock@0 D3DParseUnknownCommand@8 +ReleaseDDThreadLock@0 + +;CompleteCreateSysmemSurface ;DDGetAttachedSurfaceLcl ;DDInternalLock ;DDInternalUnlock @@ -19,4 +21,4 @@ DirectDrawEnumerateW@8 ;GetOLEThunkData ;GetSurfaceFromDC ;RegisterSpecialCase -;ReleaseDDThreadLock + diff --git a/reactos/dll/directx/ddraw/gamma.c b/reactos/dll/directx/ddraw/gamma.c index 9954b11a451..8394f98852f 100644 --- a/reactos/dll/directx/ddraw/gamma.c +++ b/reactos/dll/directx/ddraw/gamma.c @@ -12,12 +12,12 @@ ULONG WINAPI DirectDrawGammaControl_AddRef( LPDIRECTDRAWGAMMACONTROL iface) -{ - DX_WINDBG_trace(); - +{ IDirectDrawGammaImpl * This = (IDirectDrawGammaImpl*)iface; ULONG ref=0; + + DX_WINDBG_trace(); if (iface!=NULL) { @@ -28,11 +28,10 @@ DirectDrawGammaControl_AddRef( LPDIRECTDRAWGAMMACONTROL iface) ULONG WINAPI DirectDrawGammaControl_Release( LPDIRECTDRAWGAMMACONTROL iface) -{ - DX_WINDBG_trace(); - +{ IDirectDrawGammaImpl* This = (IDirectDrawGammaImpl*)iface; ULONG ref=0; + DX_WINDBG_trace(); if (iface!=NULL) { diff --git a/reactos/dll/directx/ddraw/hal/surface_hal.c b/reactos/dll/directx/ddraw/hal/surface_hal.c index e68d6a10db7..fbdde3863b4 100644 --- a/reactos/dll/directx/ddraw/hal/surface_hal.c +++ b/reactos/dll/directx/ddraw/hal/surface_hal.c @@ -8,7 +8,7 @@ * */ -#include "rosdraw.h" +#include "../rosdraw.h" diff --git a/reactos/dll/directx/ddraw/kernel.c b/reactos/dll/directx/ddraw/kernel.c index cb70ecfab43..c738596e549 100644 --- a/reactos/dll/directx/ddraw/kernel.c +++ b/reactos/dll/directx/ddraw/kernel.c @@ -15,12 +15,13 @@ ULONG WINAPI DirectDrawKernel_AddRef ( LPDIRECTDRAWKERNEL iface) -{ - DX_WINDBG_trace(); +{ IDirectDrawKernelImpl * This = (IDirectDrawKernelImpl*)iface; ULONG ref=0; + + DX_WINDBG_trace(); if (iface!=NULL) { @@ -31,12 +32,12 @@ DirectDrawKernel_AddRef ( LPDIRECTDRAWKERNEL iface) ULONG WINAPI DirectDrawKernel_Release ( LPDIRECTDRAWKERNEL iface) -{ - DX_WINDBG_trace(); - +{ IDirectDrawKernelImpl* This = (IDirectDrawKernelImpl*)iface; ULONG ref=0; + DX_WINDBG_trace(); + if (iface!=NULL) { ref = InterlockedDecrement( (PLONG) &This->ref); @@ -83,12 +84,11 @@ DirectDrawKernel_ReleaseKernelHandle ( LPDIRECTDRAWKERNEL iface) ULONG WINAPI DDSurfaceKernel_AddRef ( LPDIRECTDRAWSURFACEKERNEL iface) -{ - DX_WINDBG_trace(); - +{ IDirectDrawSurfaceKernelImpl * This = (IDirectDrawSurfaceKernelImpl*)iface; ULONG ref=0; + DX_WINDBG_trace(); if (iface!=NULL) { @@ -99,12 +99,12 @@ DDSurfaceKernel_AddRef ( LPDIRECTDRAWSURFACEKERNEL iface) ULONG WINAPI DDSurfaceKernel_Release ( LPDIRECTDRAWSURFACEKERNEL iface) -{ - DX_WINDBG_trace(); - +{ IDirectDrawSurfaceKernelImpl* This = (IDirectDrawSurfaceKernelImpl*)iface; ULONG ref=0; + DX_WINDBG_trace(); + if (iface!=NULL) { ref = InterlockedDecrement( (PLONG) &This->ref); diff --git a/reactos/dll/directx/ddraw/main.c b/reactos/dll/directx/ddraw/main.c index 5457aa36181..7d49c8d293a 100644 --- a/reactos/dll/directx/ddraw/main.c +++ b/reactos/dll/directx/ddraw/main.c @@ -13,6 +13,7 @@ #include "rosdraw.h" #include "d3dhal.h" +CRITICAL_SECTION ddcs; // This function is exported by the dll HRESULT WINAPI DirectDrawCreateClipper (DWORD dwFlags, @@ -34,6 +35,13 @@ DirectDrawCreate (LPGUID lpGUID, LPDIRECTDRAW* lplpDD, LPUNKNOWN pUnkOuter) { + DX_WINDBG_trace(); + + if (IsBadWritePtr( lplpDD, sizeof( LPVOID )) ) + { + return DDERR_INVALIDPARAMS; + } + /* check see if pUnkOuter is null or not */ if (pUnkOuter) { @@ -55,7 +63,14 @@ DirectDrawCreateEx(LPGUID lpGUID, LPVOID* lplpDD, REFIID id, LPUNKNOWN pUnkOuter) -{ +{ + DX_WINDBG_trace(); + + if (IsBadWritePtr( lplpDD, sizeof( LPVOID )) ) + { + return DDERR_INVALIDPARAMS; + } + /* check see if pUnkOuter is null or not */ if (pUnkOuter) { @@ -202,5 +217,44 @@ D3DParseUnknownCommand( LPVOID lpCmd, return retCode; } - +VOID +WINAPI +AcquireDDThreadLock() +{ + EnterCriticalSection(&ddcs); +} + +VOID +WINAPI +ReleaseDDThreadLock() +{ + LeaveCriticalSection(&ddcs); +} + +BOOL APIENTRY +DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) +{ + BOOL retStatus; + switch(ul_reason_for_call) + { + case DLL_PROCESS_DETACH: + DeleteCriticalSection( &ddcs ); + retStatus = TRUE; + break; + + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls( hModule ); + InitializeCriticalSection( &ddcs ); + EnterCriticalSection( &ddcs ); + LeaveCriticalSection( &ddcs ); + retStatus = FALSE; + break; + + default: + retStatus = TRUE; + break; + } + return retStatus; + +} diff --git a/reactos/dll/directx/ddraw/main/ddraw_main.c b/reactos/dll/directx/ddraw/main/ddraw_main.c index 551cfba7ed3..daf04379bc6 100644 --- a/reactos/dll/directx/ddraw/main/ddraw_main.c +++ b/reactos/dll/directx/ddraw/main/ddraw_main.c @@ -13,17 +13,17 @@ * Status ok */ -#include "rosdraw.h" +#include "../rosdraw.h" HRESULT WINAPI Main_DirectDraw_QueryInterface (LPDIRECTDRAW7 iface, REFIID id, LPVOID *obj) -{ - DX_WINDBG_trace(); - +{ IDirectDrawImpl* This = (IDirectDrawImpl*)iface; + + DX_WINDBG_trace(); if (IsEqualGUID(&IID_IDirectDraw7, id)) { @@ -57,10 +57,10 @@ Main_DirectDraw_QueryInterface (LPDIRECTDRAW7 iface, ULONG WINAPI Main_DirectDraw_AddRef (LPDIRECTDRAW7 iface) -{ - DX_WINDBG_trace(); - +{ IDirectDrawImpl* This = (IDirectDrawImpl*)iface; + + DX_WINDBG_trace(); if (iface!=NULL) { @@ -82,10 +82,10 @@ Main_DirectDraw_AddRef (LPDIRECTDRAW7 iface) ULONG WINAPI Main_DirectDraw_Release (LPDIRECTDRAW7 iface) -{ - DX_WINDBG_trace(); - +{ IDirectDrawImpl* This = (IDirectDrawImpl*)iface; + + DX_WINDBG_trace(); if (iface!=NULL) { @@ -139,12 +139,14 @@ Main_DirectDraw_CreateClipper(LPDIRECTDRAW7 iface, LPDIRECTDRAWCLIPPER *ppClipper, IUnknown *pUnkOuter) { + IDirectDrawClipperImpl* That; + DX_WINDBG_trace(); if (pUnkOuter!=NULL) return CLASS_E_NOAGGREGATION; - IDirectDrawClipperImpl* That; + That = (IDirectDrawClipperImpl*)HeapAlloc(GetProcessHeap(), 0, sizeof(IDirectDrawClipperImpl)); if (That == NULL) @@ -278,7 +280,7 @@ HRESULT internal_CreateNewSurface(IDirectDrawImpl* This, IDirectDrawSurfaceImpl* HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD, LPDIRECTDRAWSURFACE7 *ppSurf, IUnknown *pUnkOuter) { - DX_WINDBG_trace(); + DxSurf *surf; IDirectDrawImpl* This = (IDirectDrawImpl*)iface; @@ -286,6 +288,8 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE DEVMODE DevMode; LONG extra_surfaces = 0; + DX_WINDBG_trace(); + if (pUnkOuter!=NULL) { return CLASS_E_NOAGGREGATION; @@ -548,7 +552,10 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE } else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_OVERLAY) { - return internal_CreateNewSurface( This, That); + DDHAL_CANCREATESURFACEDATA mDdCanCreateSurface; + DDHAL_CREATESURFACEDATA mDdCreateSurface; + + return internal_CreateNewSurface( This, That); memset(&That->Surf->mddsdOverlay, 0, sizeof(DDSURFACEDESC)); memcpy(&That->Surf->mddsdOverlay, pDDSD, sizeof(DDSURFACEDESC)); @@ -564,7 +571,7 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE That->Surf->mddsdOverlay.ddpfPixelFormat.dwFlags = pDDSD->ddpfPixelFormat.dwFlags; That->Surf->mddsdOverlay.ddpfPixelFormat.dwRGBBitCount = pDDSD->ddpfPixelFormat.dwRGBBitCount; - DDHAL_CANCREATESURFACEDATA mDdCanCreateSurface; + mDdCanCreateSurface.lpDD = &This->mDDrawGlobal; mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface; mDdCanCreateSurface.bIsDifferentPixelFormat = TRUE; //isDifferentPixelFormat; @@ -608,7 +615,7 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE That->Surf->mpOverlayLocals[0] = &That->Surf->mOverlayLocal[0]; - DDHAL_CREATESURFACEDATA mDdCreateSurface; + mDdCreateSurface.lpDD = &This->mDDrawGlobal; mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface; mDdCreateSurface.lpDDSurfaceDesc = &That->Surf->mddsdOverlay;//pDDSD; @@ -755,148 +762,148 @@ HRESULT WINAPI Main_DirectDraw_EnumDisplayModes(LPDIRECTDRAW7 iface, DWORD dwFla DX_STUB_DD_OK; - IDirectDrawImpl* This = (IDirectDrawImpl*)iface; - DDSURFACEDESC2 desc_callback; - DEVMODE DevMode; - int iMode=0; - - RtlZeroMemory(&desc_callback, sizeof(DDSURFACEDESC2)); - - desc_callback.dwSize = sizeof(DDSURFACEDESC2); + // IDirectDrawImpl* This = (IDirectDrawImpl*)iface; + // DDSURFACEDESC2 desc_callback; + // DEVMODE DevMode; + // int iMode=0; + // + //RtlZeroMemory(&desc_callback, sizeof(DDSURFACEDESC2)); + // + // desc_callback.dwSize = sizeof(DDSURFACEDESC2); - desc_callback.dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT|DDSD_PITCH; + // desc_callback.dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT|DDSD_PITCH; - if (dwFlags & DDEDM_REFRESHRATES) - { - desc_callback.dwFlags |= DDSD_REFRESHRATE; - desc_callback.dwRefreshRate = This->mDDrawGlobal.dwMonitorFrequency; - } + // if (dwFlags & DDEDM_REFRESHRATES) + // { + // desc_callback.dwFlags |= DDSD_REFRESHRATE; + // desc_callback.dwRefreshRate = This->mDDrawGlobal.dwMonitorFrequency; + // } - - /* FIXME check if the mode are suppretd before sending it back */ + // + // /* FIXME check if the mode are suppretd before sending it back */ - memset(&DevMode,0,sizeof(DEVMODE)); - DevMode.dmSize = (WORD)sizeof(DEVMODE); - DevMode.dmDriverExtra = 0; + //memset(&DevMode,0,sizeof(DEVMODE)); + //DevMode.dmSize = (WORD)sizeof(DEVMODE); + //DevMode.dmDriverExtra = 0; - while (EnumDisplaySettingsEx(NULL, iMode, &DevMode, 0)) - { - - if (pDDSD) - { - if ((pDDSD->dwFlags & DDSD_WIDTH) && (pDDSD->dwWidth != DevMode.dmPelsWidth)) - continue; - if ((pDDSD->dwFlags & DDSD_HEIGHT) && (pDDSD->dwHeight != DevMode.dmPelsHeight)) - continue; - if ((pDDSD->dwFlags & DDSD_PIXELFORMAT) && (pDDSD->ddpfPixelFormat.dwFlags & DDPF_RGB) && - (pDDSD->ddpfPixelFormat.dwRGBBitCount != DevMode.dmBitsPerPel)) - continue; - } - - desc_callback.dwHeight = DevMode.dmPelsHeight; - desc_callback.dwWidth = DevMode.dmPelsWidth; - - if (DevMode.dmFields & DM_DISPLAYFREQUENCY) - { - desc_callback.dwRefreshRate = DevMode.dmDisplayFrequency; - } + // while (EnumDisplaySettingsEx(NULL, iMode, &DevMode, 0)) + // { + // + // if (pDDSD) + // { + // if ((pDDSD->dwFlags & DDSD_WIDTH) && (pDDSD->dwWidth != DevMode.dmPelsWidth)) + // continue; + // if ((pDDSD->dwFlags & DDSD_HEIGHT) && (pDDSD->dwHeight != DevMode.dmPelsHeight)) + // continue; + // if ((pDDSD->dwFlags & DDSD_PIXELFORMAT) && (pDDSD->ddpfPixelFormat.dwFlags & DDPF_RGB) && + // (pDDSD->ddpfPixelFormat.dwRGBBitCount != DevMode.dmBitsPerPel)) + // continue; + // } + // + // desc_callback.dwHeight = DevMode.dmPelsHeight; + // desc_callback.dwWidth = DevMode.dmPelsWidth; + // + // if (DevMode.dmFields & DM_DISPLAYFREQUENCY) + // { + // desc_callback.dwRefreshRate = DevMode.dmDisplayFrequency; + // } - if (desc_callback.dwRefreshRate == 0) - { - DX_STUB_str("dwRefreshRate = 0, we hard code it to value 60"); - desc_callback.dwRefreshRate = 60; /* Maybe the valye should be biger */ - } + // if (desc_callback.dwRefreshRate == 0) + // { + // DX_STUB_str("dwRefreshRate = 0, we hard code it to value 60"); + // desc_callback.dwRefreshRate = 60; /* Maybe the valye should be biger */ + // } - /* above same as wine */ - if ((pDDSD->dwFlags & DDSD_PIXELFORMAT) && (pDDSD->ddpfPixelFormat.dwFlags & DDPF_RGB) ) - { - switch(DevMode.dmBitsPerPel) - { - case 8: - desc_callback.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - desc_callback.ddpfPixelFormat.dwFlags = DDPF_RGB; - desc_callback.ddpfPixelFormat.dwFourCC = 0; - desc_callback.ddpfPixelFormat.dwRGBBitCount=8; - /* FIXME right value */ - desc_callback.ddpfPixelFormat.dwRBitMask = 0xFF0000; /* red bitmask */ - desc_callback.ddpfPixelFormat.dwGBitMask = 0; /* Green bitmask */ - desc_callback.ddpfPixelFormat.dwBBitMask = 0; /* Blue bitmask */ - break; + // /* above same as wine */ + // if ((pDDSD->dwFlags & DDSD_PIXELFORMAT) && (pDDSD->ddpfPixelFormat.dwFlags & DDPF_RGB) ) + // { + // switch(DevMode.dmBitsPerPel) + // { + // case 8: + // desc_callback.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); + // desc_callback.ddpfPixelFormat.dwFlags = DDPF_RGB; + // desc_callback.ddpfPixelFormat.dwFourCC = 0; + // desc_callback.ddpfPixelFormat.dwRGBBitCount=8; + // /* FIXME right value */ + // desc_callback.ddpfPixelFormat.dwRBitMask = 0xFF0000; /* red bitmask */ + // desc_callback.ddpfPixelFormat.dwGBitMask = 0; /* Green bitmask */ + // desc_callback.ddpfPixelFormat.dwBBitMask = 0; /* Blue bitmask */ + // break; - case 15: - desc_callback.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - desc_callback.ddpfPixelFormat.dwFlags = DDPF_RGB; - desc_callback.ddpfPixelFormat.dwFourCC = 0; - desc_callback.ddpfPixelFormat.dwRGBBitCount=15; - /* FIXME right value */ - desc_callback.ddpfPixelFormat.dwRBitMask = 0x7C00; /* red bitmask */ - desc_callback.ddpfPixelFormat.dwGBitMask = 0x3E0; /* Green bitmask */ - desc_callback.ddpfPixelFormat.dwBBitMask = 0x1F; /* Blue bitmask */ - break; + // case 15: + // desc_callback.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); + // desc_callback.ddpfPixelFormat.dwFlags = DDPF_RGB; + // desc_callback.ddpfPixelFormat.dwFourCC = 0; + // desc_callback.ddpfPixelFormat.dwRGBBitCount=15; + // /* FIXME right value */ + // desc_callback.ddpfPixelFormat.dwRBitMask = 0x7C00; /* red bitmask */ + // desc_callback.ddpfPixelFormat.dwGBitMask = 0x3E0; /* Green bitmask */ + // desc_callback.ddpfPixelFormat.dwBBitMask = 0x1F; /* Blue bitmask */ + // break; - case 16: - desc_callback.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - desc_callback.ddpfPixelFormat.dwFlags = DDPF_RGB; - desc_callback.ddpfPixelFormat.dwFourCC = 0; - desc_callback.ddpfPixelFormat.dwRGBBitCount=16; - /* FIXME right value */ - desc_callback.ddpfPixelFormat.dwRBitMask = 0xF800; /* red bitmask */ - desc_callback.ddpfPixelFormat.dwGBitMask = 0x7E0; /* Green bitmask */ - desc_callback.ddpfPixelFormat.dwBBitMask = 0x1F; /* Blue bitmask */ - break; + // case 16: + // desc_callback.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); + // desc_callback.ddpfPixelFormat.dwFlags = DDPF_RGB; + // desc_callback.ddpfPixelFormat.dwFourCC = 0; + // desc_callback.ddpfPixelFormat.dwRGBBitCount=16; + // /* FIXME right value */ + // desc_callback.ddpfPixelFormat.dwRBitMask = 0xF800; /* red bitmask */ + // desc_callback.ddpfPixelFormat.dwGBitMask = 0x7E0; /* Green bitmask */ + // desc_callback.ddpfPixelFormat.dwBBitMask = 0x1F; /* Blue bitmask */ + // break; - case 24: - desc_callback.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - desc_callback.ddpfPixelFormat.dwFlags = DDPF_RGB; - desc_callback.ddpfPixelFormat.dwFourCC = 0; - desc_callback.ddpfPixelFormat.dwRGBBitCount=24; - /* FIXME right value */ - desc_callback.ddpfPixelFormat.dwRBitMask = 0xFF0000; /* red bitmask */ - desc_callback.ddpfPixelFormat.dwGBitMask = 0x00FF00; /* Green bitmask */ - desc_callback.ddpfPixelFormat.dwBBitMask = 0x0000FF; /* Blue bitmask */ - break; + // case 24: + // desc_callback.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); + // desc_callback.ddpfPixelFormat.dwFlags = DDPF_RGB; + // desc_callback.ddpfPixelFormat.dwFourCC = 0; + // desc_callback.ddpfPixelFormat.dwRGBBitCount=24; + // /* FIXME right value */ + // desc_callback.ddpfPixelFormat.dwRBitMask = 0xFF0000; /* red bitmask */ + // desc_callback.ddpfPixelFormat.dwGBitMask = 0x00FF00; /* Green bitmask */ + // desc_callback.ddpfPixelFormat.dwBBitMask = 0x0000FF; /* Blue bitmask */ + // break; - case 32: - desc_callback.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - desc_callback.ddpfPixelFormat.dwFlags = DDPF_RGB; - desc_callback.ddpfPixelFormat.dwFourCC = 0; - desc_callback.ddpfPixelFormat.dwRGBBitCount=8; - /* FIXME right value */ - desc_callback.ddpfPixelFormat.dwRBitMask = 0xFF0000; /* red bitmask */ - desc_callback.ddpfPixelFormat.dwGBitMask = 0x00FF00; /* Green bitmask */ - desc_callback.ddpfPixelFormat.dwBBitMask = 0x0000FF; /* Blue bitmask */ - break; + // case 32: + // desc_callback.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); + // desc_callback.ddpfPixelFormat.dwFlags = DDPF_RGB; + // desc_callback.ddpfPixelFormat.dwFourCC = 0; + // desc_callback.ddpfPixelFormat.dwRGBBitCount=8; + // /* FIXME right value */ + // desc_callback.ddpfPixelFormat.dwRBitMask = 0xFF0000; /* red bitmask */ + // desc_callback.ddpfPixelFormat.dwGBitMask = 0x00FF00; /* Green bitmask */ + // desc_callback.ddpfPixelFormat.dwBBitMask = 0x0000FF; /* Blue bitmask */ + // break; - default: - break; - } - desc_callback.ddsCaps.dwCaps = 0; - if (desc_callback.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) - { - /* FIXME srt DDCS Caps flag */ - desc_callback.ddsCaps.dwCaps |= DDSCAPS_PALETTE; - } - } - - if (DevMode.dmBitsPerPel==15) - { - desc_callback.lPitch = DevMode.dmPelsWidth + (8 - ( DevMode.dmPelsWidth % 8)) % 8; - } - else - { - desc_callback.lPitch = DevMode.dmPelsWidth * (DevMode.dmBitsPerPel / 8); - desc_callback.lPitch = desc_callback.lPitch + (8 - (desc_callback.lPitch % 8)) % 8; - } - - if (callback(&desc_callback, context) == DDENUMRET_CANCEL) - { - return DD_OK; - } - - iMode++; - } + // default: + // break; + // } + // desc_callback.ddsCaps.dwCaps = 0; + // if (desc_callback.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) + // { + // /* FIXME srt DDCS Caps flag */ + // desc_callback.ddsCaps.dwCaps |= DDSCAPS_PALETTE; + // } + // } + // + // if (DevMode.dmBitsPerPel==15) + // { + // desc_callback.lPitch = DevMode.dmPelsWidth + (8 - ( DevMode.dmPelsWidth % 8)) % 8; + // } + // else + // { + // desc_callback.lPitch = DevMode.dmPelsWidth * (DevMode.dmBitsPerPel / 8); + // desc_callback.lPitch = desc_callback.lPitch + (8 - (desc_callback.lPitch % 8)) % 8; + // } + // + // if (callback(&desc_callback, context) == DDENUMRET_CANCEL) + // { + // return DD_OK; + // } + // + // iMode++; + // } - return DD_OK; + // return DD_OK; } /* @@ -945,11 +952,13 @@ HRESULT WINAPI Main_DirectDraw_GetCaps(LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps, LPDDCAPS pHELCaps) { - DX_WINDBG_trace(); + DDSCAPS2 ddscaps = {0}; DWORD status = DD_FALSE; IDirectDrawImpl *This = (IDirectDrawImpl *)iface; + + DX_WINDBG_trace(); if (pDriverCaps != NULL) { @@ -984,11 +993,11 @@ Main_DirectDraw_GetCaps(LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps, * Status ok */ HRESULT WINAPI Main_DirectDraw_GetDisplayMode(LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD) -{ - DX_WINDBG_trace(); - +{ IDirectDrawImpl *This = (IDirectDrawImpl *)iface; + DX_WINDBG_trace(); + if (pDDSD == NULL) { return DD_FALSE; @@ -1048,11 +1057,11 @@ Main_DirectDraw_GetGDISurface(LPDIRECTDRAW7 iface, */ HRESULT WINAPI Main_DirectDraw_GetMonitorFrequency(LPDIRECTDRAW7 iface,LPDWORD freq) -{ - DX_WINDBG_trace(); - +{ IDirectDrawImpl *This = (IDirectDrawImpl *)iface; + DX_WINDBG_trace(); + if (freq == NULL) { return DD_FALSE; @@ -1068,11 +1077,10 @@ Main_DirectDraw_GetMonitorFrequency(LPDIRECTDRAW7 iface,LPDWORD freq) */ HRESULT WINAPI Main_DirectDraw_GetScanLine(LPDIRECTDRAW7 iface, LPDWORD lpdwScanLine) -{ +{ + IDirectDrawImpl* This = (IDirectDrawImpl*)iface; DX_WINDBG_trace(); - - IDirectDrawImpl* This = (IDirectDrawImpl*)iface; *lpdwScanLine = 0; @@ -1111,10 +1119,10 @@ Main_DirectDraw_GetVerticalBlankStatus(LPDIRECTDRAW7 iface, LPBOOL status) HRESULT WINAPI Main_DirectDraw_Initialize (LPDIRECTDRAW7 iface, LPGUID lpGUID) -{ - DX_WINDBG_trace(); - +{ IDirectDrawImpl* This = (IDirectDrawImpl*)iface; + + DX_WINDBG_trace(); if (iface==NULL) { @@ -1158,10 +1166,12 @@ Main_DirectDraw_SetCooperativeLevel (LPDIRECTDRAW7 iface, HWND hwnd, DWORD coopl // for now we always asume it is the active dirver that should be use. // - allow more Flags - DX_WINDBG_trace(); + IDirectDrawImpl* This = (IDirectDrawImpl*)iface; DDHAL_SETEXCLUSIVEMODEDATA SetExclusiveMode; + + DX_WINDBG_trace(); // check the parameters if ((This->cooperative_level == cooplevel) && ((HWND)This->mDDrawGlobal.lpExclusiveOwner->hWnd == hwnd)) @@ -1217,7 +1227,7 @@ HRESULT WINAPI Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags) { - DX_WINDBG_trace(); + IDirectDrawImpl* This = (IDirectDrawImpl*)iface; BOOL dummy = TRUE; @@ -1226,6 +1236,8 @@ Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidth, DWORD dwHeig int Width=0; int Height=0; int BPP=0; + + DX_WINDBG_trace(); /* FIXME check the refresrate if it same if it not same do the mode switch */ if ((This->mDDrawGlobal.vmiData.dwDisplayHeight == dwHeight) && @@ -1289,9 +1301,9 @@ HRESULT WINAPI Main_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7 iface, DWORD dwFlags, HANDLE h) { - DX_WINDBG_trace(); - + IDirectDrawImpl* This = (IDirectDrawImpl*)iface; + DX_WINDBG_trace(); if (This->mDdWaitForVerticalBlank.WaitForVerticalBlank == NULL) { @@ -1317,11 +1329,12 @@ Main_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7 iface, DWORD dwFlags, HRESULT WINAPI Main_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7 iface, LPDDSCAPS2 ddscaps, LPDWORD total, LPDWORD free) -{ - DX_WINDBG_trace(); +{ DDHAL_GETAVAILDRIVERMEMORYDATA mem; IDirectDrawImpl* This = (IDirectDrawImpl*)iface; + + DX_WINDBG_trace(); /* Only Hal version exists acodring msdn */ if (!(This->mDDrawGlobal.lpDDCBtmp->HALDDMiscellaneous.dwFlags & DDHAL_MISCCB32_GETAVAILDRIVERMEMORY)) diff --git a/reactos/dll/directx/ddraw/main/surface_main.c b/reactos/dll/directx/ddraw/main/surface_main.c index 245dfe22b1e..5defc755fe3 100644 --- a/reactos/dll/directx/ddraw/main/surface_main.c +++ b/reactos/dll/directx/ddraw/main/surface_main.c @@ -8,7 +8,7 @@ * */ -#include "rosdraw.h" +#include "../rosdraw.h" /* FIXME adding hal and hel stub @@ -60,10 +60,10 @@ Main_DDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7 iface, REFIID riid, HRESULT WINAPI Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rdst, LPDIRECTDRAWSURFACE7 src, LPRECT rsrc, DWORD dwFlags, LPDDBLTFX lpbltfx) -{ - DX_WINDBG_trace(); - +{ IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; + + DX_WINDBG_trace(); if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_BLT) @@ -77,11 +77,11 @@ HRESULT WINAPI Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rdst, HRESULT WINAPI Main_DDrawSurface_Lock (LPDIRECTDRAWSURFACE7 iface, LPRECT prect, LPDDSURFACEDESC2 pDDSD, DWORD flags, HANDLE event) -{ - DX_WINDBG_trace(); - +{ IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; + DX_WINDBG_trace(); + if (event != NULL) { return DDERR_INVALIDPARAMS; @@ -96,11 +96,11 @@ HRESULT WINAPI Main_DDrawSurface_Lock (LPDIRECTDRAWSURFACE7 iface, LPRECT prect, } HRESULT WINAPI Main_DDrawSurface_Unlock (LPDIRECTDRAWSURFACE7 iface, LPRECT pRect) -{ - DX_WINDBG_trace(); - +{ IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; + DX_WINDBG_trace(); + if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_LOCK) { return Hal_DDrawSurface_Unlock( iface, pRect); @@ -113,12 +113,12 @@ HRESULT WINAPI Main_DDrawSurface_AddAttachedSurface(LPDIRECTDRAWSURFACE7 iface, LPDIRECTDRAWSURFACE7 pAttach) { - DWORD ret; - DX_WINDBG_trace(); - + DWORD ret; IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; IDirectDrawSurfaceImpl* That = (IDirectDrawSurfaceImpl*)pAttach; + DX_WINDBG_trace(); + if (pAttach==NULL) { return DDERR_CANNOTATTACHSURFACE; @@ -273,11 +273,11 @@ Main_DDrawSurface_EnumOverlayZOrders(LPDIRECTDRAWSURFACE7 iface, HRESULT WINAPI Main_DDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface, LPDIRECTDRAWSURFACE7 override, DWORD dwFlags) -{ - DX_WINDBG_trace(); - +{ IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; + DX_WINDBG_trace(); + if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_FLIP) { return Hal_DDrawSurface_Flip(iface, override, dwFlags); @@ -362,11 +362,11 @@ Main_DDrawSurface_GetAttachedSurface(LPDIRECTDRAWSURFACE7 iface, HRESULT WINAPI Main_DDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags) -{ - DX_WINDBG_trace(); - +{ IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; + DX_WINDBG_trace(); + if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_FLIP) { return Hal_DDrawSurface_GetBltStatus( iface, dwFlags); @@ -377,11 +377,11 @@ Main_DDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags) HRESULT WINAPI Main_DDrawSurface_GetCaps(LPDIRECTDRAWSURFACE7 iface, LPDDSCAPS2 pCaps) -{ - DX_WINDBG_trace(); - +{ IDirectDrawSurfaceImpl* This; + DX_WINDBG_trace(); + if (iface == NULL) { return DDERR_INVALIDOBJECT; @@ -421,10 +421,10 @@ Main_DDrawSurface_GetColorKey(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags, HRESULT WINAPI Main_DDrawSurface_GetDC(LPDIRECTDRAWSURFACE7 iface, HDC *phDC) { - DX_WINDBG_trace(); - IDirectDrawSurfaceImpl* This; + DX_WINDBG_trace(); + if (iface == NULL) { return DDERR_INVALIDOBJECT; @@ -527,10 +527,9 @@ HRESULT WINAPI Main_DDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface, LPDDSURFACEDESC2 pDDSD) { - DWORD dwSize; - DX_WINDBG_trace(); - + DWORD dwSize; IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + DX_WINDBG_trace(); dwSize = pDDSD->dwSize; @@ -584,10 +583,9 @@ Main_DDrawSurface_PageUnlock(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags) HRESULT WINAPI Main_DDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE7 iface, HDC hDC) -{ - DX_WINDBG_trace(); - - IDirectDrawSurfaceImpl* This; +{ + IDirectDrawSurfaceImpl* This; + DX_WINDBG_trace(); if (iface == NULL) { @@ -625,11 +623,11 @@ Main_DDrawSurface_SetClipper (LPDIRECTDRAWSURFACE7 iface, HRESULT WINAPI Main_DDrawSurface_SetColorKey (LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags, LPDDCOLORKEY pCKey) -{ - DX_WINDBG_trace(); - +{ IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; + DX_WINDBG_trace(); + if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_SETCOLORKEY) { return Hal_DDrawSurface_SetColorKey (iface, dwFlags, pCKey); @@ -693,11 +691,11 @@ Main_DDrawSurface_UpdateOverlay (LPDIRECTDRAWSURFACE7 iface, HRESULT WINAPI Main_DDrawSurface_UpdateOverlayDisplay (LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags) -{ - DX_WINDBG_trace(); - +{ IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; + DX_WINDBG_trace(); + if (This->Owner->mCallbacks.HALDDSurface.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY) { return Hal_DDrawSurface_UpdateOverlayDisplay ( iface, dwFlags); diff --git a/reactos/dll/directx/ddraw/palette.c b/reactos/dll/directx/ddraw/palette.c index badab4000f5..5a406192cfc 100644 --- a/reactos/dll/directx/ddraw/palette.c +++ b/reactos/dll/directx/ddraw/palette.c @@ -12,12 +12,12 @@ ULONG WINAPI DirectDrawPalette_Release( LPDIRECTDRAWPALETTE iface) -{ - DX_WINDBG_trace(); - +{ IDirectDrawPaletteImpl* This = (IDirectDrawPaletteImpl*)iface; ULONG ref=0; + DX_WINDBG_trace(); + if (iface!=NULL) { ref = InterlockedDecrement( (PLONG) &This->DDPalette.dwRefCnt); @@ -39,12 +39,11 @@ DirectDrawPalette_Release( LPDIRECTDRAWPALETTE iface) ULONG WINAPI DirectDrawPalette_AddRef( LPDIRECTDRAWPALETTE iface) -{ - DX_WINDBG_trace(); - - IDirectDrawPaletteImpl * This = (IDirectDrawPaletteImpl*)iface; - +{ + IDirectDrawPaletteImpl * This = (IDirectDrawPaletteImpl*)iface; ULONG ref=0; + + DX_WINDBG_trace(); if (iface!=NULL) { diff --git a/reactos/dll/directx/ddraw/rosdraw.h b/reactos/dll/directx/ddraw/rosdraw.h index c9196621c74..15964b763ce 100644 --- a/reactos/dll/directx/ddraw/rosdraw.h +++ b/reactos/dll/directx/ddraw/rosdraw.h @@ -25,6 +25,9 @@ VOID Cleanup(LPDIRECTDRAW7 iface); /******** Main Object ********/ /* Public interface */ +VOID WINAPI AcquireDDThreadLock(); +VOID WINAPI ReleaseDDThreadLock(); + HRESULT WINAPI Main_DirectDraw_QueryInterface (LPDIRECTDRAW7 iface, REFIID id, LPVOID *obj); ULONG WINAPI Main_DirectDraw_AddRef (LPDIRECTDRAW7 iface); ULONG WINAPI Main_DirectDraw_Release (LPDIRECTDRAW7 iface); @@ -317,6 +320,7 @@ DWORD CALLBACK HelDdFlipToGDISurface(LPDDHAL_FLIPTOGDISURFACEDATA lpFlipToGDISu /*********** Macros ***********/ #define DX_STUB \ +{ \ static BOOL firstcall = TRUE; \ if (firstcall) \ { \ @@ -325,9 +329,11 @@ DWORD CALLBACK HelDdFlipToGDISurface(LPDDHAL_FLIPTOGDISURFACEDATA lpFlipToGDISu OutputDebugStringA(buffer); \ firstcall = FALSE; \ } \ +} \ return DDERR_UNSUPPORTED; #define DX_STUB_DD_OK \ +{ \ static BOOL firstcall = TRUE; \ if (firstcall) \ { \ @@ -336,6 +342,7 @@ DWORD CALLBACK HelDdFlipToGDISurface(LPDDHAL_FLIPTOGDISURFACEDATA lpFlipToGDISu OutputDebugStringA(buffer); \ firstcall = FALSE; \ } \ +} \ return DD_OK; diff --git a/reactos/dll/directx/ddraw/soft/surface_callbacks_hel.c b/reactos/dll/directx/ddraw/soft/surface_callbacks_hel.c index 1538d00b9fb..774deb24941 100644 --- a/reactos/dll/directx/ddraw/soft/surface_callbacks_hel.c +++ b/reactos/dll/directx/ddraw/soft/surface_callbacks_hel.c @@ -8,7 +8,7 @@ * */ -#include "rosdraw.h" +#include "../rosdraw.h" extern DDPIXELFORMAT pixelformats[]; diff --git a/reactos/dll/directx/ddraw/soft/surface_hel.c b/reactos/dll/directx/ddraw/soft/surface_hel.c index a5913cb1ab2..79636d8b86a 100644 --- a/reactos/dll/directx/ddraw/soft/surface_hel.c +++ b/reactos/dll/directx/ddraw/soft/surface_hel.c @@ -8,7 +8,7 @@ * */ -#include "rosdraw.h" +#include "../rosdraw.h" diff --git a/reactos/dll/directx/ddraw/startup.c b/reactos/dll/directx/ddraw/startup.c index fdb860f2d50..ed36a202241 100644 --- a/reactos/dll/directx/ddraw/startup.c +++ b/reactos/dll/directx/ddraw/startup.c @@ -53,7 +53,19 @@ StartDirectDraw(LPDIRECTDRAW* iface) This->mpModeInfos[0].lPitch = (devmode.dmPelsWidth*devmode.dmBitsPerPel)/8; This->mpModeInfos[0].wRefreshRate = (WORD)devmode.dmDisplayFrequency; - This->hdc = CreateDCW(L"DISPLAY",L"DISPLAY",NULL,NULL); + if ( This->devicetype <3 ) + { + /* Create HDC for default, hal and hel driver */ + This->hdc = CreateDCW(L"DISPLAY",L"DISPLAY",NULL,NULL); + } + else + { + /* FIXME : need getting driver from the GUID that have been pass in from + the register. we do not support that yet + */ + This->hdc = NULL ; + } + if (This->hdc == NULL) { @@ -222,6 +234,7 @@ HRESULT WINAPI StartDirectDrawHal(LPDIRECTDRAW* iface) { IDirectDrawImpl* This = (IDirectDrawImpl*)iface; + DDHAL_GETDRIVERINFODATA DriverInfo; /* HAL Startup process */ BOOL newmode = FALSE; @@ -354,7 +367,7 @@ StartDirectDrawHal(LPDIRECTDRAW* iface) //DeleteDC(This->hdc); - DDHAL_GETDRIVERINFODATA DriverInfo; + memset(&DriverInfo,0, sizeof(DDHAL_GETDRIVERINFODATA)); DriverInfo.dwSize = sizeof(DDHAL_GETDRIVERINFODATA); DriverInfo.dwContext = This->mDDrawGlobal.hDD; @@ -425,15 +438,22 @@ Create_DirectDraw (LPGUID pGUID, REFIID id, BOOL ex) { - IDirectDrawImpl* This = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl)); + IDirectDrawImpl* This; DX_WINDBG_trace(); + + //AcquireDDThreadLock(); + + This = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl)); + if (This == NULL) { + ReleaseDDThreadLock(); return E_OUTOFMEMORY; } + ZeroMemory(This,sizeof(IDirectDrawImpl)); This->lpVtbl = &DirectDraw7_Vtable; @@ -442,29 +462,39 @@ Create_DirectDraw (LPGUID pGUID, This->lpVtbl_v4 = &DDRAW_IDirectDraw4_VTable; *pIface = (LPDIRECTDRAW)This; - - This->devicetype = 0; - - if (pGUID == (LPGUID) DDCREATE_HARDWAREONLY) + + if (pGUID == 0) { - This->devicetype = 1; /* hal only */ + This->devicetype = 0; /* both hal and hel default driver "DISPLAY" */ + } + else if (pGUID == (LPGUID) DDCREATE_HARDWAREONLY) + { + This->devicetype = 1; /* hal only default driver "DISPLAY" */ } - if (pGUID == (LPGUID) DDCREATE_EMULATIONONLY) + else if (pGUID == (LPGUID) DDCREATE_EMULATIONONLY) { - This->devicetype = 2; /* hel only */ + This->devicetype = 2; /* hel only default driver "DISPLAY" */ } + else + { + This->devicetype = 3; /* Read from the register which driver it should be */ + } + if(This->lpVtbl->QueryInterface ((LPDIRECTDRAW7)This, id, (void**)&pIface) != S_OK) { + ReleaseDDThreadLock(); return DDERR_INVALIDPARAMS; } if (StartDirectDraw((LPDIRECTDRAW*)This) == DD_OK); { + //ReleaseDDThreadLock(); return This->lpVtbl->Initialize ((LPDIRECTDRAW7)This, pGUID); } + //ReleaseDDThreadLock(); return DDERR_INVALIDPARAMS; } diff --git a/reactos/dll/directx/ddraw/thunks/ddraw_thunk.c b/reactos/dll/directx/ddraw/thunks/ddraw_thunk.c index a779f38a82a..576ac598e0e 100644 --- a/reactos/dll/directx/ddraw/thunks/ddraw_thunk.c +++ b/reactos/dll/directx/ddraw/thunks/ddraw_thunk.c @@ -22,7 +22,7 @@ * */ -#include "winedraw.h" +#include "../winedraw.h" static HRESULT WINAPI diff --git a/reactos/dll/directx/ddraw/thunks/surface_thunk.c b/reactos/dll/directx/ddraw/thunks/surface_thunk.c index fb8022cde23..bf7abde3311 100644 --- a/reactos/dll/directx/ddraw/thunks/surface_thunk.c +++ b/reactos/dll/directx/ddraw/thunks/surface_thunk.c @@ -22,7 +22,7 @@ * */ -#include "winedraw.h" +#include "../winedraw.h" #define CONVERT(pdds) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, \ IDirectDrawSurface3, \