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
This commit is contained in:
Magnus Olsen 2006-11-05 21:19:53 +00:00
parent 556dd785d7
commit 5b6863ed96
16 changed files with 361 additions and 260 deletions

View file

@ -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)
{

View file

@ -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);

View file

@ -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

View file

@ -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)
{

View file

@ -8,7 +8,7 @@
*
*/
#include "rosdraw.h"
#include "../rosdraw.h"

View file

@ -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);

View file

@ -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;
}

View file

@ -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))

View file

@ -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);

View file

@ -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)
{

View file

@ -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;

View file

@ -8,7 +8,7 @@
*
*/
#include "rosdraw.h"
#include "../rosdraw.h"
extern DDPIXELFORMAT pixelformats[];

View file

@ -8,7 +8,7 @@
*
*/
#include "rosdraw.h"
#include "../rosdraw.h"

View file

@ -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;
}

View file

@ -22,7 +22,7 @@
*
*/
#include "winedraw.h"
#include "../winedraw.h"
static HRESULT WINAPI

View file

@ -22,7 +22,7 @@
*
*/
#include "winedraw.h"
#include "../winedraw.h"
#define CONVERT(pdds) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, \
IDirectDrawSurface3, \