Henri Verbeet : wined3d: Add fields from StaticPixelFormatDesc to struct GlPixelFormatDesc.

Alexandre Julliard julliard at winehq.org
Fri Mar 13 09:13:53 CDT 2009


Module: wine
Branch: master
Commit: 53bf5c26585a22bb4a988baaf071106d8c0cfbe3
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=53bf5c26585a22bb4a988baaf071106d8c0cfbe3

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Fri Mar 13 10:44:17 2009 +0100

wined3d: Add fields from StaticPixelFormatDesc to struct GlPixelFormatDesc.

The idea here is that we should lookup format information in struct
GlPixelFormatDesc, while StaticPixelFormatDesc and GlPixelFormatDescTemplate
will only be used to build the table.

---

 dlls/wined3d/directx.c               |    2 +
 dlls/wined3d/utils.c                 |   56 +++++++++++++++++++++++++++++----
 dlls/wined3d/wined3d_private.h       |   10 ++++++
 dlls/wined3d/wined3d_private_types.h |    1 +
 4 files changed, 62 insertions(+), 7 deletions(-)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 55b2b7e..fddc856 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -4458,6 +4458,8 @@ nogl_adapter:
         This->adapters[0].TextureRam = 8 * 1024 * 1024; /* This is plenty for a DDraw-only card */
     }
 
+    initPixelFormatsNoGL(&This->adapters[0].gl_info);
+
     This->adapter_count = 1;
     return FALSE;
 }
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index e6a6de0..7385654 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -365,6 +365,35 @@ static inline int getFmtIdx(WINED3DFORMAT fmt) {
     return -1;
 }
 
+BOOL initPixelFormatsNoGL(WineD3D_GL_Info *gl_info)
+{
+    UINT format_count = sizeof(formats) / sizeof(*formats);
+    UINT i;
+
+    gl_info->gl_formats = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, format_count * sizeof(*gl_info->gl_formats));
+    if (!gl_info->gl_formats)
+    {
+        ERR("Failed to allocate memory.\n");
+        return FALSE;
+    }
+
+    for (i = 0; i < format_count; ++i)
+    {
+        struct GlPixelFormatDesc *desc = &gl_info->gl_formats[i];
+        desc->format = formats[i].format;
+        desc->red_mask = formats[i].redMask;
+        desc->green_mask = formats[i].greenMask;
+        desc->blue_mask = formats[i].blueMask;
+        desc->alpha_mask = formats[i].alphaMask;
+        desc->byte_count = formats[i].bpp;
+        desc->depth_size = formats[i].depthSize;
+        desc->stencil_size = formats[i].stencilSize;
+        if (formats[i].isFourcc) desc->Flags |= WINED3DFMT_FLAG_FOURCC;
+    }
+
+    return TRUE;
+}
+
 #define GLINFO_LOCATION (*gl_info)
 BOOL initPixelFormats(WineD3D_GL_Info *gl_info)
 {
@@ -379,14 +408,27 @@ BOOL initPixelFormats(WineD3D_GL_Info *gl_info)
      * after this loop
      */
     for(src = 0; src < sizeof(gl_formats_template) / sizeof(gl_formats_template[0]); src++) {
+        struct GlPixelFormatDesc *desc;
         dst = getFmtIdx(gl_formats_template[src].fmt);
-        gl_info->gl_formats[dst].glInternal      = gl_formats_template[src].glInternal;
-        gl_info->gl_formats[dst].glGammaInternal = gl_formats_template[src].glGammaInternal;
-        gl_info->gl_formats[dst].glFormat        = gl_formats_template[src].glFormat;
-        gl_info->gl_formats[dst].glType          = gl_formats_template[src].glType;
-        gl_info->gl_formats[dst].color_fixup     = COLOR_FIXUP_IDENTITY;
-        gl_info->gl_formats[dst].Flags           = gl_formats_template[src].Flags;
-        gl_info->gl_formats[dst].heightscale     = 1.0;
+        desc = &gl_info->gl_formats[dst];
+
+        desc->format = formats[dst].format;
+        desc->red_mask = formats[dst].redMask;
+        desc->green_mask = formats[dst].greenMask;
+        desc->blue_mask = formats[dst].blueMask;
+        desc->alpha_mask = formats[dst].alphaMask;
+        desc->byte_count = formats[dst].bpp;
+        desc->depth_size = formats[dst].depthSize;
+        desc->stencil_size = formats[dst].stencilSize;
+        if (formats[dst].isFourcc) desc->Flags |= WINED3DFMT_FLAG_FOURCC;
+
+        desc->glInternal = gl_formats_template[src].glInternal;
+        desc->glGammaInternal = gl_formats_template[src].glGammaInternal;
+        desc->glFormat = gl_formats_template[src].glFormat;
+        desc->glType = gl_formats_template[src].glType;
+        desc->color_fixup = COLOR_FIXUP_IDENTITY;
+        desc->Flags |= gl_formats_template[src].Flags;
+        desc->heightscale = 1.0;
 
         if(wined3d_settings.offscreen_rendering_mode == ORM_FBO &&
            gl_formats_template[src].rtInternal != 0) {
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index b2cc872..eade311 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -939,6 +939,7 @@ struct WineD3DAdapter
 };
 
 extern BOOL initPixelFormats(WineD3D_GL_Info *gl_info);
+BOOL initPixelFormatsNoGL(WineD3D_GL_Info *gl_info);
 extern long WineD3DAdapterChangeGLRam(IWineD3DDeviceImpl *D3DDevice, long glram);
 extern void add_gl_compat_wrappers(WineD3D_GL_Info *gl_info);
 
@@ -2479,6 +2480,15 @@ extern WINED3DFORMAT pixelformat_for_depth(DWORD depth);
 
 struct GlPixelFormatDesc
 {
+    WINED3DFORMAT format;
+    DWORD red_mask;
+    DWORD green_mask;
+    DWORD blue_mask;
+    DWORD alpha_mask;
+    UINT byte_count;
+    WORD depth_size;
+    WORD stencil_size;
+
     GLint glInternal;
     GLint glGammaInternal;
     GLint rtInternal;
diff --git a/dlls/wined3d/wined3d_private_types.h b/dlls/wined3d/wined3d_private_types.h
index 343244e..e5b4c3d 100644
--- a/dlls/wined3d/wined3d_private_types.h
+++ b/dlls/wined3d/wined3d_private_types.h
@@ -29,6 +29,7 @@
 #define WINED3DFMT_FLAG_DEPTH                    0x4
 #define WINED3DFMT_FLAG_STENCIL                  0x8
 #define WINED3DFMT_FLAG_RENDERTARGET             0x10
+#define WINED3DFMT_FLAG_FOURCC                   0x20
 
 /** DCL usage masks **/
 #define WINED3DSP_DCL_USAGE_SHIFT 0




More information about the wine-cvs mailing list