Author: gbrunmar
Date: Sun Mar 2 15:12:24 2008
New Revision: 32542
URL:
http://svn.reactos.org/svn/reactos?rev=3D32542&view=3Drev
Log:
* Implemented IDirect3D::CheckDeviceFormatConversion()
* Replaced all LocalAlloc() with HeapAlloc() and LocalFree() with HeapFree(=
) on recommendation from GreatLord
Modified:
trunk/reactos/dll/directx/d3d9/adapter.c
trunk/reactos/dll/directx/d3d9/d3d9_create.c
trunk/reactos/dll/directx/d3d9/d3d9_helpers.c
trunk/reactos/dll/directx/d3d9/d3d9_impl.c
trunk/reactos/dll/directx/d3d9/d3d9_private.h
trunk/reactos/dll/directx/d3d9/format.c
trunk/reactos/dll/directx/d3d9/format.h
Modified: trunk/reactos/dll/directx/d3d9/adapter.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/adap=
ter.c?rev=3D32542&r1=3D32541&r2=3D32542&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/reactos/dll/directx/d3d9/adapter.c (original)
+++ trunk/reactos/dll/directx/d3d9/adapter.c Sun Mar 2 15:12:24 2008
@@ -86,7 +86,7 @@
if (DriverFileSize > 0)
{
VS_FIXEDFILEINFO* FixedFileInfo =3D NULL;
- LPVOID pBlock =3D LocalAlloc(LMEM_ZEROINIT, DriverFileSize);
+ LPVOID pBlock =3D HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Dr=
iverFileSize);
=
if (TRUE =3D=3D GetFileVersionInfoA(pIdentifier->Driver, 0, Driver=
FileSize, pBlock))
{
@@ -97,7 +97,7 @@
}
}
=
- LocalFree(pBlock);
+ HeapFree(GetProcessHeap(), 0, pBlock);
}
=
if (bIsWow64)
@@ -292,7 +292,7 @@
return Format;
}
=
- pBitmapInfo =3D LocalAlloc(LMEM_ZEROINIT, sizeof(BITMAPINFOHEADER) + 4=
* sizeof(RGBQUAD));
+ pBitmapInfo =3D HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(B=
ITMAPINFOHEADER) + 4 * sizeof(RGBQUAD));
if (NULL =3D=3D pBitmapInfo)
{
DeleteObject(hBitmap);
@@ -316,7 +316,7 @@
}
}
=
- LocalFree(pBitmapInfo);
+ HeapFree(GetProcessHeap(), 0, pBitmapInfo);
DeleteObject(hBitmap);
DeleteDC(hDC);
=
Modified: trunk/reactos/dll/directx/d3d9/d3d9_create.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9=
_create.c?rev=3D32542&r1=3D32541&r2=3D32542&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/reactos/dll/directx/d3d9/d3d9_create.c (original)
+++ trunk/reactos/dll/directx/d3d9/d3d9_create.c Sun Mar 2 15:12:24 2008
@@ -65,7 +65,7 @@
if (NULL =3D=3D (hDC =3D CreateDCA(NULL, pDisplayAdapter->szDeviceName=
, NULL, NULL)))
return FALSE;
=
- pDeviceData =3D LocalAlloc(LMEM_ZEROINIT, sizeof(D3D9_DEVICEDATA));
+ pDeviceData =3D HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(D=
3D9_DEVICEDATA));
if (NULL =3D=3D pDeviceData)
{
DPRINT1("Out of memory, could not initialize Direct3D adapter");
Modified: trunk/reactos/dll/directx/d3d9/d3d9_helpers.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9=
_helpers.c?rev=3D32542&r1=3D32541&r2=3D32542&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/reactos/dll/directx/d3d9/d3d9_helpers.c (original)
+++ trunk/reactos/dll/directx/d3d9/d3d9_helpers.c Sun Mar 2 15:12:24 2008
@@ -64,7 +64,7 @@
=
dwSize +=3D MEM_ALIGNMENT;
=
- AlignedPtr =3D (CHAR *)LocalAlloc(LMEM_ZEROINIT, dwSize);
+ AlignedPtr =3D (CHAR *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, d=
wSize);
=
if (AlignedPtr =3D=3D 0)
return DDERR_OUTOFMEMORY;
@@ -91,5 +91,5 @@
=
NonAlignedPtr -=3D *(AlignedPtr - 1);
=
- LocalFree(NonAlignedPtr);
+ HeapFree(GetProcessHeap(), 0, NonAlignedPtr);
}
Modified: trunk/reactos/dll/directx/d3d9/d3d9_impl.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9=
_impl.c?rev=3D32542&r1=3D32541&r2=3D32542&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/reactos/dll/directx/d3d9/d3d9_impl.c (original)
+++ trunk/reactos/dll/directx/d3d9/d3d9_impl.c Sun Mar 2 15:12:24 2008
@@ -640,12 +640,79 @@
return D3D_OK;
}
=
+
+/*++
+* @name IDirect3D9::CheckDeviceFormatConversion
+* @implemented
+*
+* The function IDirect3D9Impl_CheckDeviceFormatConversion checks if a spec=
ific D3DFORMAT
+* can be converted to another on the specified display adapter.
+*
+* @param LPDIRECT3D iface
+* Pointer to the IDirect3D object returned from Direct3DCreate9()
+*
+* @param UINT Adapter
+* Adapter index to get information about. D3DADAPTER_DEFAULT is the primar=
y display.
+* The maximum value for this is the value returned by IDirect3D::GetAdapte=
rCount().
+*
+* @param D3DDEVTYPE DeviceType
+* One of the D3DDEVTYPE enum members. Only D3DDEVTYPE_HAL can potentially =
return D3D_OK.
+*
+* @param D3DFORMAT SourceFormat
+* One of the D3DFORMAT enum members except D3DFMT_UNKNOWN for the display =
adapter mode to be converted from.
+*
+* @param D3DFORMAT TargetFormat
+* One of the D3DFORMAT enum members except D3DFMT_UNKNOWN for the display =
adapter mode to be converted to.
+*
+* @return HRESULT
+* If the SourceFormat can be converted to the TargetFormat, the method ret=
urns D3D_OK.
+* If the SourceFormat can NOT be converted to the TargetFormat, the method=
returns D3DERR_NOTAVAILABLE.
+* If Adapter is out of range, DeviceType is invalid,
+* SourceFormat or TargetFormat is invalid, the method returns D3DERR_INVAL=
IDCALL.
+*
+*/
static HRESULT WINAPI IDirect3D9Impl_CheckDeviceFormatConversion(LPDIRECT3=
D9 iface, UINT Adapter, D3DDEVTYPE DeviceType,
D3DFORMAT=
SourceFormat, D3DFORMAT TargetFormat)
{
- UNIMPLEMENTED
-
- return D3D_OK;
+ HRESULT hResult;
+ LPDIRECT3D9_INT This =3D impl_from_IDirect3D9(iface);
+ LOCK_D3D9();
+
+ if (Adapter >=3D This->NumDisplayAdapters)
+ {
+ DPRINT1("Invalid Adapter number specified");
+ UNLOCK_D3D9();
+ return D3DERR_INVALIDCALL;
+ }
+
+ if (DeviceType !=3D D3DDEVTYPE_HAL &&
+ DeviceType !=3D D3DDEVTYPE_REF &&
+ DeviceType !=3D D3DDEVTYPE_SW)
+ {
+ DPRINT1("Invalid DeviceType specified");
+ UNLOCK_D3D9();
+ return D3DERR_INVALIDCALL;
+ }
+
+ if (SourceFormat =3D=3D D3DFMT_UNKNOWN ||
+ TargetFormat =3D=3D D3DFMT_UNKNOWN)
+ {
+ DPRINT1("Invalid D3DFORMAT specified");
+ UNLOCK_D3D9();
+ return D3DERR_NOTAVAILABLE;
+ }
+
+ if (DeviceType =3D=3D D3DDEVTYPE_HAL)
+ {
+ hResult =3D CheckDeviceFormatConversion(&This->DisplayAdapters[Ada=
pter].DriverCaps, SourceFormat, TargetFormat);
+ }
+ else
+ {
+ hResult =3D D3DERR_NOTAVAILABLE;
+ }
+
+ UNLOCK_D3D9();
+ return hResult;
}
=
=
Modified: trunk/reactos/dll/directx/d3d9/d3d9_private.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9=
_private.h?rev=3D32542&r1=3D32541&r2=3D32542&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/reactos/dll/directx/d3d9/d3d9_private.h (original)
+++ trunk/reactos/dll/directx/d3d9/d3d9_private.h Sun Mar 2 15:12:24 2008
@@ -89,7 +89,7 @@
/* 0x0220 */ CHAR szDeviceName[CCHDEVICENAME];
/* 0x0240 */ HDC hDC;
/* 0x0244 */ GUID DisplayGuid;
-/* 0x0254 */ LPDWORD pUnknown0254; //D3D9_Unknown6BC_INT* pUnknown6BC; =
// hDirectDrawLocal =
+/* 0x0254 */ LPDWORD pUnknown0254; //D3D9_Unknown6BC_INT* pUnknown6BC;
/* 0x0258 */ D3DDEVTYPE DeviceType;
/* 0x025c */ HMODULE hD3DRefDll;
/* 0x0260 */ DWORD unknown0152;
@@ -103,7 +103,7 @@
/* 0x0118 */ BOOL bInUseFlag;
/* 0x011c */ DWORD MasterAdapterIndex;
/* 0x0120 */ DWORD AdapterIndexInGroup;
-/* 0x0124 */ DWORD NumAdaptersInGroup; /* 0x00000001 */
+/* 0x0124 */ DWORD NumAdaptersInGroup;
/* 0x0128 */ DWORD NumSupportedD3DFormats;
/* 0x012c */ DWORD NumSupportedD3DExtendedFormats;
/* 0x0130 */ D3DDISPLAYMODE* pSupportedD3DFormats;
@@ -116,7 +116,7 @@
=
typedef struct _tagDIRECT3D9_INT_
{
-/* 0x0000 */ struct IDirect3D9Vtbl *lpVtbl; /* LPDIRECTD3D9 functoions =
table */
+/* 0x0000 */ struct IDirect3D9Vtbl *lpVtbl; /* LPDIRECTD3D9 function ta=
ble */
/* 0x0004 */ CRITICAL_SECTION d3d9_cs;
/* 0x001c */ DWORD unknown000007; /* 0x00000001 */
/* 0x0020 */ DWORD dwProcessId;
Modified: trunk/reactos/dll/directx/d3d9/format.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/form=
at.c?rev=3D32542&r1=3D32541&r2=3D32542&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/reactos/dll/directx/d3d9/format.c (original)
+++ trunk/reactos/dll/directx/d3d9/format.c Sun Mar 2 15:12:24 2008
@@ -31,6 +31,20 @@
BOOL IsMultiElementFormat(D3DFORMAT Format)
{
return (Format =3D=3D D3DFMT_MULTI2_ARGB8);
+}
+
+BOOL IsFourCCFormat(D3DFORMAT Format)
+{
+ CHAR* cFormat =3D (CHAR*)&Format;
+ if (isalnum(cFormat[0]) &&
+ isalnum(cFormat[1]) &&
+ isalnum(cFormat[2]) &&
+ isalnum(cFormat[3]))
+ {
+ return TRUE;
+ }
+
+ return FALSE;
}
=
BOOL IsSupportedFormatOp(LPD3D9_DRIVERCAPS pDriverCaps, D3DFORMAT DisplayF=
ormat, DWORD FormatOp)
@@ -321,3 +335,47 @@
=
return D3DERR_NOTAVAILABLE;
}
+
+HRESULT CheckDeviceFormatConversion(LPD3D9_DRIVERCAPS pDriverCaps, D3DFORM=
AT SourceFormat, D3DFORMAT TargetFormat)
+{
+ D3DFORMAT NonAlphaSourceFormat;
+ D3DFORMAT NonAlphaTargetFormat;
+
+ NonAlphaSourceFormat =3D RemoveAlphaChannel(SourceFormat);
+ NonAlphaTargetFormat =3D RemoveAlphaChannel(TargetFormat);
+
+ if (NonAlphaSourceFormat =3D=3D NonAlphaTargetFormat)
+ {
+ return D3D_OK;
+ }
+
+ if (FALSE =3D=3D IsFourCCFormat(SourceFormat))
+ {
+ switch (SourceFormat)
+ {
+ case D3DFMT_A8R8G8B8:
+ case D3DFMT_X8R8G8B8:
+ case D3DFMT_R5G6B5:
+ case D3DFMT_X1R5G5B5:
+ case D3DFMT_A1R5G5B5:
+ case D3DFMT_A2R10G10B10:
+ /* Do nothing, valid SourceFormat */
+ break;
+
+ default:
+ return D3DERR_NOTAVAILABLE;
+ }
+ }
+ else if (pDriverCaps->DriverCaps9.DevCaps2 =3D=3D 0)
+ {
+ return D3D_OK;
+ }
+
+ if (FALSE =3D=3D IsSupportedFormatOp(pDriverCaps, SourceFormat, D3DFOR=
MAT_OP_CONVERT_TO_ARGB) ||
+ FALSE =3D=3D IsSupportedFormatOp(pDriverCaps, TargetFormat, D3DFOR=
MAT_MEMBEROFGROUP_ARGB))
+ {
+ return D3DERR_NOTAVAILABLE;
+ }
+
+ return D3D_OK;
+}
Modified: trunk/reactos/dll/directx/d3d9/format.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/form=
at.h?rev=3D32542&r1=3D32541&r2=3D32542&view=3Ddiff
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/reactos/dll/directx/d3d9/format.h (original)
+++ trunk/reactos/dll/directx/d3d9/format.h Sun Mar 2 15:12:24 2008
@@ -33,4 +33,6 @@
=
HRESULT CheckDeviceFormat(LPD3D9_DRIVERCAPS pDriverCaps, D3DFORMAT Adapter=
Format, DWORD Usage, D3DRESOURCETYPE RType, D3DFORMAT CheckFormat);
=
+HRESULT CheckDeviceFormatConversion(LPD3D9_DRIVERCAPS pDriverCaps, D3DFORM=
AT SourceFormat, D3DFORMAT TargetFormat);
+
#endif // _FORMAT_H_