[WIN32SS] Implement D3DKMT{Create,Destroy}DCFromMemory. Brought to you by Sebastian...
authorAmine Khaldi <amine.khaldi@reactos.org>
Fri, 16 Jun 2017 18:38:08 +0000 (18:38 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Fri, 16 Jun 2017 18:38:08 +0000 (18:38 +0000)
svn path=/trunk/; revision=75059

12 files changed:
reactos/sdk/include/ddk/d3dkmthk.h [new file with mode: 0644]
reactos/sdk/include/psdk/d3dnthal.h
reactos/sdk/include/psdk/d3dukmdt.h [new file with mode: 0644]
reactos/sdk/include/psdk/ntgdi.h
reactos/win32ss/CMakeLists.txt
reactos/win32ss/gdi/gdi32/gdi32.spec
reactos/win32ss/gdi/gdi32/include/precomp.h
reactos/win32ss/gdi/gdi32/objects/dc.c
reactos/win32ss/reactx/ntddraw/d3dkmt.c [new file with mode: 0644]
reactos/win32ss/reactx/ntddraw/intddraw.h
reactos/win32ss/w32ksvc.db
reactos/win32ss/w32ksvc.h

diff --git a/reactos/sdk/include/ddk/d3dkmthk.h b/reactos/sdk/include/ddk/d3dkmthk.h
new file mode 100644 (file)
index 0000000..86ba3a1
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2016 Henri Verbeet for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __WINE_D3DKMTHK_H
+#define __WINE_D3DKMTHK_H
+
+#include <d3dukmdt.h>
+
+typedef struct _D3DKMT_CREATEDCFROMMEMORY
+{
+    void *pMemory;
+    D3DDDIFORMAT Format;
+    UINT Width;
+    UINT Height;
+    UINT Pitch;
+    HDC hDeviceDc;
+    PALETTEENTRY *pColorTable;
+    HDC hDc;
+    HANDLE hBitmap;
+} D3DKMT_CREATEDCFROMMEMORY;
+
+typedef struct _D3DKMT_DESTROYDCFROMMEMORY
+{
+    HDC hDc;
+    HANDLE hBitmap;
+} D3DKMT_DESTROYDCFROMMEMORY;
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+
+DWORD APIENTRY D3DKMTCreateDCFromMemory(_Inout_ D3DKMT_CREATEDCFROMMEMORY*);
+DWORD APIENTRY D3DKMTDestroyDCFromMemory(_In_ CONST D3DKMT_DESTROYDCFROMMEMORY*);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __WINE_D3DKMTHK_H */
index ff712a7..63335f5 100644 (file)
@@ -24,6 +24,7 @@
 #include <ddrawint.h>
 #include <d3dtypes.h>
 #include <d3dcaps.h>
+#include <d3dkmthk.h>
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/reactos/sdk/include/psdk/d3dukmdt.h b/reactos/sdk/include/psdk/d3dukmdt.h
new file mode 100644 (file)
index 0000000..a7be710
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2016 Henri Verbeet for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __WINE_D3DUKMDT_H
+#define __WINE_D3DUKMDT_H
+
+#ifndef MAKEFOURCC
+#define MAKEFOURCC(ch0, ch1, ch2, ch3) \
+        ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \
+        ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24))
+#endif /* MAKEFOURCC */
+
+typedef enum _D3DDDIFORMAT
+{
+    D3DDDIFMT_UNKNOWN                 = 0,
+    D3DDDIFMT_R8G8B8                  = 0x14,
+    D3DDDIFMT_A8R8G8B8                = 0x15,
+    D3DDDIFMT_X8R8G8B8                = 0x16,
+    D3DDDIFMT_R5G6B5                  = 0x17,
+    D3DDDIFMT_X1R5G5B5                = 0x18,
+    D3DDDIFMT_A1R5G5B5                = 0x19,
+    D3DDDIFMT_A4R4G4B4                = 0x1a,
+    D3DDDIFMT_R3G3B2                  = 0x1b,
+    D3DDDIFMT_A8                      = 0x1c,
+    D3DDDIFMT_A8R3G3B2                = 0x1d,
+    D3DDDIFMT_X4R4G4B4                = 0x1e,
+    D3DDDIFMT_A2B10G10R10             = 0x1f,
+    D3DDDIFMT_A8B8G8R8                = 0x20,
+    D3DDDIFMT_X8B8G8R8                = 0x21,
+    D3DDDIFMT_G16R16                  = 0x22,
+    D3DDDIFMT_A2R10G10B10             = 0x23,
+    D3DDDIFMT_A16B16G16R16            = 0x24,
+    D3DDDIFMT_A8P8                    = 0x28,
+    D3DDDIFMT_P8                      = 0x29,
+    D3DDDIFMT_L8                      = 0x32,
+    D3DDDIFMT_A8L8                    = 0x33,
+    D3DDDIFMT_A4L4                    = 0x34,
+    D3DDDIFMT_V8U8                    = 0x3c,
+    D3DDDIFMT_L6V5U5                  = 0x3d,
+    D3DDDIFMT_X8L8V8U8                = 0x3e,
+    D3DDDIFMT_Q8W8V8U8                = 0x3f,
+    D3DDDIFMT_V16U16                  = 0x40,
+    D3DDDIFMT_W11V11U10               = 0x41,
+    D3DDDIFMT_A2W10V10U10             = 0x43,
+    D3DDDIFMT_D16_LOCKABLE            = 0x46,
+    D3DDDIFMT_D32                     = 0x47,
+    D3DDDIFMT_S1D15                   = 0x48,
+    D3DDDIFMT_D15S1                   = 0x49,
+    D3DDDIFMT_S8D24                   = 0x4a,
+    D3DDDIFMT_D24S8                   = 0x4b,
+    D3DDDIFMT_X8D24                   = 0x4c,
+    D3DDDIFMT_D24X8                   = 0x4d,
+    D3DDDIFMT_X4S4D24                 = 0x4e,
+    D3DDDIFMT_D24X4S4                 = 0x4f,
+    D3DDDIFMT_D16                     = 0x50,
+    D3DDDIFMT_L16                     = 0x51,
+    D3DDDIFMT_D32F_LOCKABLE           = 0x52,
+    D3DDDIFMT_D24FS8                  = 0x53,
+    D3DDDIFMT_D32_LOCKABLE            = 0x54,
+    D3DDDIFMT_S8_LOCKABLE             = 0x55,
+    D3DDDIFMT_G8R8                    = 0x5b,
+    D3DDDIFMT_R8                      = 0x5c,
+    D3DDDIFMT_VERTEXDATA              = 0x64,
+    D3DDDIFMT_INDEX16                 = 0x65,
+    D3DDDIFMT_INDEX32                 = 0x66,
+    D3DDDIFMT_Q16W16V16U16            = 0x6e,
+    D3DDDIFMT_R16F                    = 0x6f,
+    D3DDDIFMT_G16R16F                 = 0x70,
+    D3DDDIFMT_A16B16G16R16F           = 0x71,
+    D3DDDIFMT_R32F                    = 0x72,
+    D3DDDIFMT_G32R32F                 = 0x73,
+    D3DDDIFMT_A32B32G32R32F           = 0x74,
+    D3DDDIFMT_CxV8U8                  = 0x75,
+    D3DDDIFMT_A1                      = 0x76,
+    D3DDDIFMT_A2B10G10R10_XR_BIAS     = 0x77,
+    D3DDDIFMT_DXVACOMPBUFFER_BASE     = 0x96,
+    D3DDDIFMT_PICTUREPARAMSDATA       = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0,
+    D3DDDIFMT_MACROBLOCKDATA          = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x01,
+    D3DDDIFMT_RESIDUALDIFFERENCEDATA  = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x02,
+    D3DDDIFMT_DEBLOCKINGDATA          = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x03,
+    D3DDDIFMT_INVERSEQUANTIZATIONDATA = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x04,
+    D3DDDIFMT_SLICECONTROLDATA        = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x05,
+    D3DDDIFMT_BITSTREAMDATA           = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x06,
+    D3DDDIFMT_MOTIONVECTORBUFFER      = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x07,
+    D3DDDIFMT_FILMGRAINBUFFER         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x08,
+    D3DDDIFMT_DXVA_RESERVED9          = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x09,
+    D3DDDIFMT_DXVA_RESERVED10         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x0a,
+    D3DDDIFMT_DXVA_RESERVED11         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x0b,
+    D3DDDIFMT_DXVA_RESERVED12         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x0c,
+    D3DDDIFMT_DXVA_RESERVED13         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x0d,
+    D3DDDIFMT_DXVA_RESERVED14         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x0e,
+    D3DDDIFMT_DXVA_RESERVED15         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x0f,
+    D3DDDIFMT_DXVA_RESERVED16         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x10,
+    D3DDDIFMT_DXVA_RESERVED17         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x11,
+    D3DDDIFMT_DXVA_RESERVED18         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x12,
+    D3DDDIFMT_DXVA_RESERVED19         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x13,
+    D3DDDIFMT_DXVA_RESERVED20         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x14,
+    D3DDDIFMT_DXVA_RESERVED21         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x15,
+    D3DDDIFMT_DXVA_RESERVED22         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x16,
+    D3DDDIFMT_DXVA_RESERVED23         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x17,
+    D3DDDIFMT_DXVA_RESERVED24         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x18,
+    D3DDDIFMT_DXVA_RESERVED25         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x19,
+    D3DDDIFMT_DXVA_RESERVED26         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x1a,
+    D3DDDIFMT_DXVA_RESERVED27         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x1b,
+    D3DDDIFMT_DXVA_RESERVED28         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x1c,
+    D3DDDIFMT_DXVA_RESERVED29         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x1d,
+    D3DDDIFMT_DXVA_RESERVED30         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x1e,
+    D3DDDIFMT_DXVA_RESERVED31         = D3DDDIFMT_DXVACOMPBUFFER_BASE + 0x1f,
+    D3DDDIFMT_DXVACOMPBUFFER_MAX      = D3DDDIFMT_DXVA_RESERVED31,
+    D3DDDIFMT_BINARYBUFFER            = 0xc7,
+    D3DDDIFMT_DXT1                    = MAKEFOURCC('D', 'X', 'T', '1'),
+    D3DDDIFMT_DXT2                    = MAKEFOURCC('D', 'X', 'T', '2'),
+    D3DDDIFMT_DXT3                    = MAKEFOURCC('D', 'X', 'T', '3'),
+    D3DDDIFMT_DXT4                    = MAKEFOURCC('D', 'X', 'T', '4'),
+    D3DDDIFMT_DXT5                    = MAKEFOURCC('D', 'X', 'T', '5'),
+    D3DDDIFMT_G8R8_G8B8               = MAKEFOURCC('G', 'R', 'G', 'B'),
+    D3DDDIFMT_MULTI2_ARGB8            = MAKEFOURCC('M', 'E', 'T', '1'),
+    D3DDDIFMT_R8G8_B8G8               = MAKEFOURCC('R', 'G', 'B', 'G'),
+    D3DDDIFMT_UYVY                    = MAKEFOURCC('U', 'Y', 'V', 'Y'),
+    D3DDDIFMT_YUY2                    = MAKEFOURCC('Y', 'U', 'Y', '2'),
+    D3DDDIFMT_FORCE_UINT              = 0x7fffffff,
+} D3DDDIFORMAT;
+
+#endif /* __WINE_D3DUKMDT_H */
index 6e6c7be..1087e8c 100644 (file)
@@ -916,6 +916,20 @@ NtGdiDdCreateSurfaceEx(
     _In_ HANDLE hSurface,
     _In_ DWORD dwSurfaceHandle);
 
+__kernel_entry
+W32KAPI
+DWORD
+APIENTRY
+NtGdiDdDDICreateDCFromMemory(
+    _Inout_ D3DKMT_CREATEDCFROMMEMORY *desc);
+
+__kernel_entry
+W32KAPI
+DWORD
+APIENTRY
+NtGdiDdDDIDestroyDCFromMemory(
+    _In_ CONST D3DKMT_DESTROYDCFROMMEMORY *desc);
+
 __kernel_entry
 W32KAPI
 DWORD
index fec1a74..bba1e6d 100644 (file)
@@ -96,6 +96,7 @@ list(APPEND SOURCE
     reactx/ntddraw/dd.c
     reactx/ntddraw/ddsurf.c
     reactx/ntddraw/d3d.c
+    reactx/ntddraw/d3dkmt.c
     reactx/ntddraw/dvp.c
     reactx/ntddraw/mocomp.c
     reactx/ntddraw/eng.c
index 0db97d3..53fd576 100644 (file)
 608 stdcall bMakePathNameW(wstr wstr wstr long)
 609 stdcall cGetTTFFromFOT(long long long long long long long)
 610 stdcall gdiPlaySpoolStream(long long long long long long)
+; FIXME: Wine DX Dlls need these
+@ stdcall D3DKMTCreateDCFromMemory(ptr)
+@ stdcall D3DKMTDestroyDCFromMemory(ptr)
index 3dae019..5f8614b 100644 (file)
@@ -44,6 +44,7 @@
 
 #include <ddrawi.h>
 #include <ddrawgdi.h>
+#include <d3dkmthk.h>
 
 /* Public Win32K Headers */
 #include <ntgdityp.h>
index 8505b77..72760a0 100644 (file)
@@ -1538,3 +1538,15 @@ SelectObject(
     return NULL;
 }
 
+/***********************************************************************
+ *           D3DKMTCreateDCFromMemory    (GDI32.@)
+ */
+DWORD WINAPI D3DKMTCreateDCFromMemory( D3DKMT_CREATEDCFROMMEMORY *desc )
+{
+    return NtGdiDdDDICreateDCFromMemory( desc );
+}
+
+DWORD WINAPI D3DKMTDestroyDCFromMemory( const D3DKMT_DESTROYDCFROMMEMORY *desc )
+{
+    return NtGdiDdDDIDestroyDCFromMemory( desc );
+}
diff --git a/reactos/win32ss/reactx/ntddraw/d3dkmt.c b/reactos/win32ss/reactx/ntddraw/d3dkmt.c
new file mode 100644 (file)
index 0000000..2dae7ba
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * COPYRIGHT:        See COPYING in the top level directory
+ * PROJECT:          ReactOS kernel
+ * PURPOSE:          Native DirectDraw implementation
+ * FILE:             win32ss/reactx/ntddraw/d3dkmt.c
+ * PROGRAMER:        Sebastian Gasiorek (sebastian.gasiorek@reactos.com)
+ */
+
+#include <win32k.h>
+#include <debug.h>
+
+DWORD
+APIENTRY
+NtGdiDdDDICreateDCFromMemory(D3DKMT_CREATEDCFROMMEMORY *desc)
+{
+    PSURFACE psurf;
+    HDC hDC;
+
+    const struct d3dddi_format_info
+    {
+        D3DDDIFORMAT format;
+        unsigned int bit_count;
+        DWORD compression;
+        unsigned int palette_size;
+        DWORD mask_r, mask_g, mask_b;
+    } *format = NULL;
+    unsigned int i;
+
+    static const struct d3dddi_format_info format_info[] =
+    {
+        { D3DDDIFMT_R8G8B8,   24, BI_RGB,       0,   0x00000000, 0x00000000, 0x00000000 },
+        { D3DDDIFMT_A8R8G8B8, 32, BI_RGB,       0,   0x00000000, 0x00000000, 0x00000000 },
+        { D3DDDIFMT_X8R8G8B8, 32, BI_RGB,       0,   0x00000000, 0x00000000, 0x00000000 },
+        { D3DDDIFMT_R5G6B5,   16, BI_BITFIELDS, 0,   0x0000f800, 0x000007e0, 0x0000001f },
+        { D3DDDIFMT_X1R5G5B5, 16, BI_BITFIELDS, 0,   0x00007c00, 0x000003e0, 0x0000001f },
+        { D3DDDIFMT_A1R5G5B5, 16, BI_BITFIELDS, 0,   0x00007c00, 0x000003e0, 0x0000001f },
+        { D3DDDIFMT_A4R4G4B4, 16, BI_BITFIELDS, 0,   0x00000f00, 0x000000f0, 0x0000000f },
+        { D3DDDIFMT_X4R4G4B4, 16, BI_BITFIELDS, 0,   0x00000f00, 0x000000f0, 0x0000000f },
+        { D3DDDIFMT_P8,       8,  BI_RGB,       256, 0x00000000, 0x00000000, 0x00000000 },
+    };
+
+    if (!desc) 
+        return STATUS_INVALID_PARAMETER;
+
+    if (!desc->pMemory) 
+        return STATUS_INVALID_PARAMETER;
+
+    for (i = 0; i < sizeof(format_info) / sizeof(*format_info); ++i)
+    {
+        if (format_info[i].format == desc->Format)
+        {
+            format = &format_info[i];
+            break;
+        }
+    }
+
+    if (!format) 
+        return STATUS_INVALID_PARAMETER;
+
+    if (desc->Width > (UINT_MAX & ~3) / (format->bit_count / 8) ||
+        !desc->Pitch || desc->Pitch < (((desc->Width * format->bit_count + 31) >> 3) & ~3) ||
+        !desc->Height || desc->Height > UINT_MAX / desc->Pitch)
+    {
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    if (!desc->hDeviceDc || !(hDC = NtGdiCreateCompatibleDC(desc->hDeviceDc)))
+    {
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* Allocate a surface */
+    psurf = SURFACE_AllocSurface(STYPE_BITMAP,
+                                 desc->Width,
+                                 desc->Height,
+                                 BitmapFormat(format->bit_count, format->compression),
+                                 BMF_TOPDOWN | BMF_NOZEROINIT,
+                                 desc->Pitch,
+                                 0,
+                                 desc->pMemory);
+
+    /* Mark as API bitmap */
+    psurf->flags |= (DDB_SURFACE | API_BITMAP);
+
+    desc->hDc = hDC;
+    /* Get the handle for the bitmap */
+    desc->hBitmap = (HBITMAP)psurf->SurfObj.hsurf;
+
+    /* Unlock the surface and return */
+    SURFACE_UnlockSurface(psurf);
+
+    NtGdiSelectBitmap(desc->hDc, desc->hBitmap);
+
+    return STATUS_SUCCESS;
+}
+
+DWORD
+APIENTRY
+NtGdiDdDDIDestroyDCFromMemory(const D3DKMT_DESTROYDCFROMMEMORY *desc)
+{
+    if (!desc) 
+        return STATUS_INVALID_PARAMETER;
+
+    if (GDI_HANDLE_GET_TYPE(desc->hDc)  != GDI_OBJECT_TYPE_DC ||
+        GDI_HANDLE_GET_TYPE(desc->hBitmap) != GDI_OBJECT_TYPE_BITMAP) 
+        return STATUS_INVALID_PARAMETER;
+
+    NtGdiDeleteObjectApp(desc->hBitmap);
+    NtGdiDeleteObjectApp(desc->hDc);
+
+    return STATUS_SUCCESS;
+}
index 9349003..c7924d1 100644 (file)
@@ -1,6 +1,7 @@
 #pragma once
 
 #include <ddrawint.h>
+#include <d3dkmthk.h>
 #include <ddkernel.h>
 #include <reactos/drivers/directx/directxint.h>
 #include <reactos/drivers/directx/dxg.h>
index 78ef367..f9b1cb7 100644 (file)
@@ -690,3 +690,8 @@ NtUserMonitorFromRect                   2
 NtUserMonitorFromWindow                 2
 NtUserSetScrollBarInfo                  3
 #
+
+# Vista+ Syscall add on for Wine DX
+NtGdiDdDDICreateDCFromMemory            1
+NtGdiDdDDIDestroyDCFromMemory           1
+#
\ No newline at end of file
index 8de74d0..1e50b31 100644 (file)
     SVC_(UserMonitorFromRect, 2)
     SVC_(UserMonitorFromWindow, 2)
     SVC_(UserSetScrollBarInfo, 3)
+// For Wine DX
+    SVC_(GdiDdDDICreateDCFromMemory, 1)
+    SVC_(GdiDdDDIDestroyDCFromMemory, 1)