[ros-diffs] [gbrunmar] 32562: Implemented IDirect3D::CheckDepthStencilMatch()

gbrunmar at svn.reactos.org gbrunmar at svn.reactos.org
Sun Mar 9 12:33:22 CET 2008


Author: gbrunmar
Date: Tue Mar  4 18:39:33 2008
New Revision: 32562

URL: http://svn.reactos.org/svn/reactos?rev=3D32562&view=3Drev
Log:
Implemented IDirect3D::CheckDepthStencilMatch()

Modified:
    trunk/reactos/dll/directx/d3d9/d3d9_impl.c
    trunk/reactos/dll/directx/d3d9/format.c
    trunk/reactos/dll/directx/d3d9/format.h

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=3D32562&r1=3D32561&r2=3D32562&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 Tue Mar  4 18:39:33 2008
@@ -504,7 +504,7 @@
     {
         DPRINT1("Invalid D3DFORMAT specified");
         UNLOCK_D3D9();
-        return D3DERR_NOTAVAILABLE;
+        return D3DERR_INVALIDCALL;
     }
 =

     if ((Usage & (D3DUSAGE_DONOTCLIP | D3DUSAGE_NPATCHES | D3DUSAGE_POINTS=
 | D3DUSAGE_RTPATCHES | D3DUSAGE_TEXTAPI | D3DUSAGE_WRITEONLY)) !=3D 0)
@@ -631,13 +631,81 @@
     return D3D_OK;
 }
 =

+
+/*++
+* @name IDirect3D9::CheckDepthStencilMatch
+* @implemented
+*
+* The function IDirect3D9Impl_CheckDepthStencilMatch checks if a specific =
combination
+* of a render target D3DFORMAT and a depth-stencil D3DFORMAT can be used w=
ith a specified
+* D3DFORMAT 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.
+*
+* @param D3DFORMAT AdapterFormat
+* One of the D3DFORMAT enum members except D3DFMT_UNKNOWN that the display=
 adapter mode where the test should occurr.
+*
+* @param D3DFORMAT RenderTargetFormat
+* One of the D3DFORMAT enum members except D3DFMT_UNKNOWN for the display =
adapter mode's render target format to be tested.
+*
+* @param D3DFORMAT DepthStencilFormat
+* One of the D3DFORMAT enum members except D3DFMT_UNKNOWN for the display =
adapter mode's depth-stencil format to be tested.
+*
+* @return HRESULT
+* If the DepthStencilFormat can be used with the RenderTargetFormat under =
the specified AdapterFormat,
+* the method returns D3D_OK.
+* If the DepthStencilFormat can NOT used with the RenderTargetFormat under=
 the specified AdapterFormat,
+* the method returns D3DERR_NOTAVAILABLE.
+* If Adapter is out of range, DeviceType is invalid,
+* AdapterFormat, RenderTargetFormat or DepthStencilFormat is invalid, the =
method returns D3DERR_INVALIDCALL.
+*
+*/
 static HRESULT WINAPI IDirect3D9Impl_CheckDepthStencilMatch(LPDIRECT3D9 if=
ace, UINT Adapter, D3DDEVTYPE DeviceType,
                                                             D3DFORMAT Adap=
terFormat, D3DFORMAT RenderTargetFormat,
                                                             D3DFORMAT Dept=
hStencilFormat)
 {
-    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 (AdapterFormat =3D=3D D3DFMT_UNKNOWN ||
+        RenderTargetFormat =3D=3D D3DFMT_UNKNOWN ||
+        DepthStencilFormat =3D=3D D3DFMT_UNKNOWN)
+    {
+        DPRINT1("Invalid D3DFORMAT specified");
+        UNLOCK_D3D9();
+        return D3DERR_INVALIDCALL;
+    }
+
+    hResult =3D CheckDepthStencilMatch(&This->DisplayAdapters[Adapter].Dri=
verCaps, AdapterFormat, RenderTargetFormat, DepthStencilFormat);
+
+    UNLOCK_D3D9();
+    return hResult;
 }
 =

 =


Modified: trunk/reactos/dll/directx/d3d9/format.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/form=
at.c?rev=3D32562&r1=3D32561&r2=3D32562&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 Tue Mar  4 18:39:33 2008
@@ -45,6 +45,161 @@
     }
 =

     return FALSE;
+}
+
+BOOL IsStencilFormat(D3DFORMAT Format)
+{
+    switch (Format)
+    {
+    case D3DFMT_D15S1:
+    case D3DFMT_D24S8:
+    case D3DFMT_D24X4S4:
+    case D3DFMT_D24FS8:
+        return TRUE;
+
+    default:
+        return FALSE;
+    }
+}
+
+DWORD GetBytesPerPixel(D3DFORMAT Format)
+{
+    switch (Format)
+    {
+    case D3DFMT_R3G3B2:
+    case D3DFMT_A8:
+        return 1;
+
+    case D3DFMT_R5G6B5:
+    case D3DFMT_X1R5G5B5:
+    case D3DFMT_A1R5G5B5:
+    case D3DFMT_A4R4G4B4:
+    case D3DFMT_A8R3G3B2:
+    case D3DFMT_X4R4G4B4:
+        return 2;
+
+    case D3DFMT_R8G8B8:
+        return 3;
+
+    case D3DFMT_A8R8G8B8:
+    case D3DFMT_X8R8G8B8:
+    case D3DFMT_A2B10G10R10:
+    case D3DFMT_A8B8G8R8:
+    case D3DFMT_X8B8G8R8:
+    case D3DFMT_G16R16:
+    case D3DFMT_A2R10G10B10:
+        return 4;
+
+    case D3DFMT_A16B16G16R16:
+        return 8;
+
+
+    case D3DFMT_P8:
+    case D3DFMT_L8:
+    case D3DFMT_A4L4:
+        return 1;
+
+    case D3DFMT_A8P8:
+    case D3DFMT_A8L8:
+        return 2;
+
+
+    case D3DFMT_V8U8:
+    case D3DFMT_L6V5U5:
+        return 2;
+
+    case D3DFMT_X8L8V8U8:
+    case D3DFMT_Q8W8V8U8:
+    case D3DFMT_V16U16:
+    case D3DFMT_A2W10V10U10:
+        return 4;
+
+
+    case D3DFMT_S8_LOCKABLE:
+        return 1;
+
+    case D3DFMT_D16_LOCKABLE:
+    case D3DFMT_D15S1:
+    case D3DFMT_D16:
+        return 2;
+
+    case D3DFMT_D32:
+    case D3DFMT_D24S8:
+    case D3DFMT_D24X8:
+    case D3DFMT_D24X4S4:
+    case D3DFMT_D32F_LOCKABLE:
+    case D3DFMT_D24FS8:
+    case D3DFMT_D32_LOCKABLE:
+        return 4;
+
+
+    case D3DFMT_L16:
+        return 2;
+
+    /* TODO: Handle D3DFMT_VERTEXDATA? */
+    case D3DFMT_INDEX16:
+        return 2;
+    case D3DFMT_INDEX32:
+        return 4;
+
+
+    case D3DFMT_Q16W16V16U16:
+        return 8;
+
+
+    case D3DFMT_R16F:
+        return 2;
+    case D3DFMT_G16R16F:
+        return 4;
+    case D3DFMT_A16B16G16R16F:
+        return 8;
+
+
+    case D3DFMT_R32F:
+        return 4;
+    case D3DFMT_G32R32F:
+        return 8;
+    case D3DFMT_A32B32G32R32F:
+        return 16;
+
+    case D3DFMT_CxV8U8:
+        return 2;
+
+
+    /* Known FourCC formats */
+    case D3DFMT_UYVY:
+    case D3DFMT_R8G8_B8G8:
+    case D3DFMT_YUY2:
+    case D3DFMT_G8R8_G8B8:
+        return 2;
+
+    case D3DFMT_DXT1:
+        return 0xFFFFFFF8;
+
+    case D3DFMT_DXT2:
+    case D3DFMT_DXT3:
+    case D3DFMT_DXT4:
+    case D3DFMT_DXT5:
+        return 0xFFFFFFF0;
+
+    case D3DFMT_MULTI2_ARGB8:
+        return 8;
+
+    default:
+        return 0;
+    }
+}
+
+DWORD GetPixelStride(D3DFORMAT Format)
+{
+    DWORD Bpp =3D GetBytesPerPixel(Format);
+
+    if (0 =3D=3D Bpp)
+    {
+        /* TODO: Handle unknown formats here */
+    }
+
+    return Bpp;
 }
 =

 BOOL IsSupportedFormatOp(LPD3D9_DRIVERCAPS pDriverCaps, D3DFORMAT DisplayF=
ormat, DWORD FormatOp)
@@ -379,3 +534,74 @@
 =

     return D3D_OK;
 }
+
+HRESULT CheckDepthStencilMatch(LPD3D9_DRIVERCAPS pDriverCaps, D3DFORMAT Ad=
apterFormat, D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat)
+{
+    const DWORD NumFormatOps =3D pDriverCaps->NumSupportedFormatOps;
+    BOOL bRenderTargetAvailable =3D FALSE;
+    BOOL bDepthStencilAvailable =3D FALSE;
+    BOOL bForceSameDepthStencilBits =3D FALSE;
+    DWORD FormatIndex;
+
+    if (FALSE =3D=3D IsSupportedFormatOp(pDriverCaps, AdapterFormat, D3DFO=
RMAT_OP_DISPLAYMODE | D3DFORMAT_OP_3DACCELERATION))
+    {
+        return D3DERR_NOTAVAILABLE;
+    }
+   =

+    if (DepthStencilFormat !=3D D3DFMT_D16_LOCKABLE &&
+        DepthStencilFormat !=3D D3DFMT_D32F_LOCKABLE)
+    {
+        if (TRUE =3D=3D IsStencilFormat(DepthStencilFormat))
+        {
+            bForceSameDepthStencilBits =3D TRUE;
+        }
+    }
+
+    if (FALSE =3D=3D bForceSameDepthStencilBits &&
+        (DepthStencilFormat =3D=3D D3DFMT_D32 || DepthStencilFormat =3D=3D=
 D3DFMT_D24X8))
+    {
+        bForceSameDepthStencilBits =3D TRUE;
+    }
+
+    DepthStencilFormat =3D GetStencilFormat(pDriverCaps, DepthStencilForma=
t);
+
+    /* Observe the multiple conditions */
+    for (FormatIndex =3D 0; FormatIndex < NumFormatOps && (bRenderTargetAv=
ailable =3D=3D FALSE || bDepthStencilAvailable =3D=3D FALSE); FormatIndex++)
+    {
+        const LPDDSURFACEDESC pSurfaceDesc =3D &pDriverCaps->pSupportedFor=
matOps[FormatIndex];
+        const DWORD FourCC =3D pSurfaceDesc->ddpfPixelFormat.dwFourCC;
+        const DWORD FormatOperations =3D pSurfaceDesc->ddpfPixelFormat.dwO=
perations;
+
+        if (FALSE =3D=3D bRenderTargetAvailable &&
+            FourCC =3D=3D RenderTargetFormat &&
+            (FormatOperations & D3DFORMAT_OP_SAME_FORMAT_RENDERTARGET) !=
=3D 0)
+        {
+            bRenderTargetAvailable =3D TRUE;
+        }
+
+        if (FALSE =3D=3D bDepthStencilAvailable &&
+            FourCC =3D=3D DepthStencilFormat &&
+            (FormatOperations & D3DFORMAT_OP_ZSTENCIL) !=3D 0)
+        {
+            bDepthStencilAvailable =3D TRUE;
+
+            if ((FormatOperations & D3DFORMAT_OP_ZSTENCIL_WITH_ARBITRARY_C=
OLOR_DEPTH) !=3D 0)
+            {
+                bForceSameDepthStencilBits =3D FALSE;
+            }
+        }
+    }
+
+    if (FALSE =3D=3D bRenderTargetAvailable || FALSE =3D=3D bDepthStencilA=
vailable)
+    {
+        return D3DERR_INVALIDCALL;
+    }
+
+    if (TRUE =3D=3D bForceSameDepthStencilBits)
+    {
+        if (GetPixelStride(RenderTargetFormat) !=3D GetPixelStride(DepthSt=
encilFormat))
+            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=3D32562&r1=3D32561&r2=3D32562&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 Tue Mar  4 18:39:33 2008
@@ -35,4 +35,6 @@
 =

 HRESULT CheckDeviceFormatConversion(LPD3D9_DRIVERCAPS pDriverCaps, D3DFORM=
AT SourceFormat, D3DFORMAT TargetFormat);
 =

+HRESULT CheckDepthStencilMatch(LPD3D9_DRIVERCAPS pDriverCaps, D3DFORMAT Ad=
apterFormat, D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat);
+
 #endif // _FORMAT_H_




More information about the Ros-diffs mailing list