[dx48] cleanup

Raphaël Junqueira fenix at club-internet.fr
Sun Jun 1 10:10:14 CDT 2003


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,

Changelog:
 - some cleanup and warning fixes
 - split of CreateDevice gl/gxl detection code into FillGLCaps
 - implementation of resolution change (using ChangeDisplaySettings) but 
desctived as ChangeDisplaySettings don't seem to work well
 - begin of swap chain support (now need to split/clean gxlpbuffer/glxpixmap 
code for swap chain use)

Regards,
Raphael
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)

iD4DBQE+2hdWp7NA3AmQTU4RAlB4AJicmNrZ+TSLmlY/ATYhYdMIdfOuAJoC97ut
FncDUTsfp+zyFS+M7q4rsw==
=DRjS
-----END PGP SIGNATURE-----
-------------- next part --------------
diff -u /cvs-src/wine-pending/d3d8_47/d3d8_private.h dlls/d3d8/d3d8_private.h
--- /cvs-src/wine-pending/d3d8_47/d3d8_private.h	2003-06-01 13:36:23.000000000 +0200
+++ dlls/d3d8/d3d8_private.h	2003-06-01 14:26:08.000000000 +0200
@@ -394,18 +394,12 @@
     GLXContext                    glCtx;
     XVisualInfo                  *visInfo;
     Display                      *display;
+    HWND                          win_handle;
     Window                        win;
     GLXContext                    render_ctx;
     Drawable                      drawable;
 
     /* OpenGL Extension related */
-#if 0
-    BOOL                          isMultiTexture;
-    BOOL                          isDot3;
-    UINT                          TextureUnits;
-    UINT                          clipPlanes;
-    UINT                          maxLights;
-#endif
 
     /* Cursor management */
     BOOL                          bCursorVisible;
@@ -590,7 +584,13 @@
     /* IDirect3DSwapChain8 fields */
     IDirect3DSurface8Impl  *frontBuffer;
     IDirect3DSurface8Impl  *backBuffer;
+    IDirect3DSurface8Impl  *depthStencilBuffer;
     D3DPRESENT_PARAMETERS   PresentParms;
+
+    /* OpenGL/GLX related */
+    GLXContext              swap_ctx;
+    Drawable                swap_drawable;
+    
 };
 
 /* IUnknown: */
diff -u /cvs-src/wine-pending/d3d8_47/device.c dlls/d3d8/device.c
--- /cvs-src/wine-pending/d3d8_47/device.c	2003-06-01 13:36:23.000000000 +0200
+++ dlls/d3d8/device.c	2003-06-01 14:27:50.000000000 +0200
@@ -1186,9 +1186,68 @@
     return D3D_OK;
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_CreateAdditionalSwapChain(LPDIRECT3DDEVICE8 iface, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DSwapChain8** pSwapChain) {
+    IDirect3DSwapChain8Impl* object;
     ICOM_THIS(IDirect3DDevice8Impl,iface);
     FIXME("(%p) : stub\n", This);
-    *pSwapChain = NULL;
+
+    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DDevice8Impl));
+    if (NULL == object) {
+      return D3DERR_OUTOFVIDEOMEMORY;
+    }
+    object->lpVtbl = &Direct3DSwapChain8_Vtbl;
+    object->ref = 1;
+
+    TRACE("(%p)->(DepthStencil:(%u,%s), BackBufferFormat:(%u,%s))\n", This, 
+	  pPresentationParameters->AutoDepthStencilFormat, debug_d3dformat(pPresentationParameters->AutoDepthStencilFormat),
+	  pPresentationParameters->BackBufferFormat, debug_d3dformat(pPresentationParameters->BackBufferFormat));
+
+    if (pPresentationParameters->Windowed && ((pPresentationParameters->BackBufferWidth  == 0) ||
+                                              (pPresentationParameters->BackBufferHeight == 0))) {
+      RECT Rect;
+      
+      GetClientRect(This->win_handle, &Rect);
+      
+      if (pPresentationParameters->BackBufferWidth == 0) {
+	pPresentationParameters->BackBufferWidth = Rect.right;
+	TRACE("Updating width to %d\n", pPresentationParameters->BackBufferWidth);
+      }
+      if (pPresentationParameters->BackBufferHeight == 0) {
+	pPresentationParameters->BackBufferHeight = Rect.bottom;
+	TRACE("Updating height to %d\n", pPresentationParameters->BackBufferHeight);
+      }
+    }
+    
+    /* Save the presentation parms now filled in correctly */
+    memcpy(&object->PresentParms, pPresentationParameters, sizeof(D3DPRESENT_PARAMETERS));
+
+    IDirect3DDevice8Impl_CreateRenderTarget((LPDIRECT3DDEVICE8) object,
+                                            pPresentationParameters->BackBufferWidth,
+                                            pPresentationParameters->BackBufferHeight,
+                                            pPresentationParameters->BackBufferFormat,
+					    pPresentationParameters->MultiSampleType,
+					    TRUE,
+                                            (LPDIRECT3DSURFACE8*) &object->frontBuffer);
+    
+    IDirect3DDevice8Impl_CreateRenderTarget((LPDIRECT3DDEVICE8) object,
+                                            pPresentationParameters->BackBufferWidth,
+                                            pPresentationParameters->BackBufferHeight,
+                                            pPresentationParameters->BackBufferFormat,
+					    pPresentationParameters->MultiSampleType,
+					    TRUE,
+                                            (LPDIRECT3DSURFACE8*) &object->backBuffer);
+
+    if (pPresentationParameters->EnableAutoDepthStencil) {
+       IDirect3DDevice8Impl_CreateDepthStencilSurface((LPDIRECT3DDEVICE8) object,
+	  					      pPresentationParameters->BackBufferWidth,
+						      pPresentationParameters->BackBufferHeight,
+						      pPresentationParameters->AutoDepthStencilFormat,
+						      D3DMULTISAMPLE_NONE,
+						      (LPDIRECT3DSURFACE8*) &object->depthStencilBuffer);
+    } else {
+      object->depthStencilBuffer = NULL;
+    }
+
+    *pSwapChain = (IDirect3DSwapChain8*) object;
     return D3D_OK;
 }
 HRESULT  WINAPI  IDirect3DDevice8Impl_Reset(LPDIRECT3DDEVICE8 iface, D3DPRESENT_PARAMETERS* pPresentationParameters) {
diff -u /cvs-src/wine-pending/d3d8_47/directx.c dlls/d3d8/directx.c
--- /cvs-src/wine-pending/d3d8_47/directx.c	2003-06-01 13:36:23.000000000 +0200
+++ dlls/d3d8/directx.c	2003-06-01 16:59:12.000000000 +0200
@@ -27,6 +27,7 @@
 #include "winuser.h"
 #include "wingdi.h"
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 #include "d3d8_private.h"
 
@@ -241,7 +242,7 @@
         switch (bpp) {
         case  8: pMode->Format = D3DFMT_R3G3B2;   break;
         case 16: pMode->Format = D3DFMT_R5G6B5;   break;
-        case 24: /* pMode->Format = D3DFMT_R5G6B5;   break;*/ /* Make 24bit appear as 16 bit */
+        case 24: /* pMode->Format = D3DFMT_R5G6B5;   break;*/ /* Make 24bit appear as 32 bit */
         case 32: pMode->Format = D3DFMT_A8R8G8B8; break;
         default: pMode->Format = D3DFMT_UNKNOWN;
         }
@@ -278,7 +279,7 @@
         switch (bpp) {
         case  8: pMode->Format       = D3DFMT_R3G3B2;   break;
         case 16: pMode->Format       = D3DFMT_R5G6B5;   break;
-        case 24: /*pMode->Format       = D3DFMT_R5G6B5;   break;*/ /* Make 24bit appear as 16 bit */
+        case 24: /*pMode->Format       = D3DFMT_R5G6B5;   break;*/ /* Make 24bit appear as 32 bit */
         case 32: pMode->Format       = D3DFMT_A8R8G8B8; break;
         default: pMode->Format       = D3DFMT_UNKNOWN;
         }
@@ -339,9 +340,9 @@
     return D3D_OK;
 }
 
-HRESULT  WINAPI  IDirect3D8Impl_CheckDeviceMultiSampleType (LPDIRECT3D8 iface,
-                                                            UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SurfaceFormat,
-                                                            BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType) {
+HRESULT  WINAPI  IDirect3D8Impl_CheckDeviceMultiSampleType(LPDIRECT3D8 iface,
+							   UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SurfaceFormat,
+							   BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType) {
     ICOM_THIS(IDirect3D8Impl,iface);
     FIXME("(%p)->(Adptr:%d, DevType:(%x,%s), SurfFmt:(%x,%s), Win?%d, MultiSamp:%x)\n", 
 	  This, 
@@ -356,9 +357,9 @@
     return D3DERR_NOTAVAILABLE;
 }
 
-HRESULT  WINAPI  IDirect3D8Impl_CheckDepthStencilMatch     (LPDIRECT3D8 iface,
-                                                            UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat,
-                                                            D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat) {
+HRESULT  WINAPI  IDirect3D8Impl_CheckDepthStencilMatch(LPDIRECT3D8 iface, 
+						       UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat,
+						       D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat) {
     ICOM_THIS(IDirect3D8Impl,iface);
     FIXME("(%p)->(Adptr:%d, DevType:(%x,%s), AdptFmt:(%x,%s), RendrTgtFmt:(%x,%s), DepthStencilFmt:(%x,%s))\n", 
 	  This, 
@@ -386,8 +387,7 @@
     return D3D_OK;
 }
 
-HRESULT  WINAPI  IDirect3D8Impl_GetDeviceCaps              (LPDIRECT3D8 iface,
-                                                            UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS8* pCaps) {
+HRESULT  WINAPI  IDirect3D8Impl_GetDeviceCaps(LPDIRECT3D8 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS8* pCaps) {
     ICOM_THIS(IDirect3D8Impl,iface);
     TRACE("(%p)->(Adptr:%d, DevType: %x, pCaps: %p)\n", This, Adapter, DeviceType, pCaps);
 
@@ -622,13 +622,164 @@
     return D3D_OK;
 }
 
-HMONITOR WINAPI  IDirect3D8Impl_GetAdapterMonitor          (LPDIRECT3D8 iface,
-                                                            UINT Adapter) {
+HMONITOR WINAPI  IDirect3D8Impl_GetAdapterMonitor(LPDIRECT3D8 iface, UINT Adapter) {
     ICOM_THIS(IDirect3D8Impl,iface);
     FIXME("(%p)->(Adptr:%d)\n", This, Adapter);
     return D3D_OK;
 }
 
+
+static void IDirect3D8Impl_FillGLCaps(LPDIRECT3D8 iface, Display* display) {
+    const char *GL_Extensions = NULL;
+    const char *GLX_Extensions = NULL;
+    GLint gl_max;
+    ICOM_THIS(IDirect3D8Impl,iface);
+
+    /* 
+     * Initialize openGL extension related variables
+     *  with Default values 
+     */
+    memset(&This->gl_info.supported, 0, sizeof(This->gl_info.supported));
+    This->gl_info.max_textures   = 1;
+    This->gl_info.ps_arb_version = PS_VERSION_NOT_SUPPORTED;
+    This->gl_info.vs_arb_version = VS_VERSION_NOT_SUPPORTED;
+    This->gl_info.vs_nv_version  = VS_VERSION_NOT_SUPPORTED;
+    This->gl_info.vs_ati_version = VS_VERSION_NOT_SUPPORTED;
+
+    /* Retrieve opengl defaults */
+    glGetIntegerv(GL_MAX_CLIP_PLANES, &gl_max);
+    This->gl_info.max_clipplanes = min(MAX_CLIPPLANES, gl_max);
+    TRACE("ClipPlanes support - num Planes=%d\n", gl_max);
+
+    glGetIntegerv(GL_MAX_LIGHTS, &gl_max);
+    This->gl_info.max_lights = min(MAX_ACTIVE_LIGHTS, gl_max);
+    TRACE("Lights support - max lights=%d\n", gl_max);
+
+    /* Parse the gl supported features, in theory enabling parts of our code appropriately */
+    GL_Extensions = glGetString(GL_EXTENSIONS);
+    FIXME("GL_Extensions reported:\n");  
+    
+    if (NULL == GL_Extensions) {
+      ERR("   GL_Extensions returns NULL\n");      
+    } else {
+      while (*GL_Extensions != 0x00) {
+        const char *Start = GL_Extensions;
+        char ThisExtn[256];
+
+        memset(ThisExtn, 0x00, sizeof(ThisExtn));
+        while (*GL_Extensions != ' ' && *GL_Extensions != 0x00) {
+	  GL_Extensions++;
+        }
+        memcpy(ThisExtn, Start, (GL_Extensions - Start));
+        FIXME("- %s\n", ThisExtn);
+
+	/**
+	 * ARB 
+	 */
+	if (strcmp(ThisExtn, "GL_ARB_fragment_program") == 0) {
+	  This->gl_info.ps_arb_version = PS_VERSION_11;
+	  FIXME(" FOUND: ARB Pixel Shader support - version=%02x\n", This->gl_info.ps_arb_version);
+	  This->gl_info.supported[ARB_FRAGMENT_PROGRAM] = TRUE;
+        } else if (strcmp(ThisExtn, "GL_ARB_multisample") == 0) {
+	  FIXME(" FOUND: ARB Multisample support\n");
+	  This->gl_info.supported[ARB_MULTISAMPLE] = TRUE;
+	} else if (strcmp(ThisExtn, "GL_ARB_multitexture") == 0) {
+	  glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &gl_max);
+	  FIXME(" FOUND: ARB Multitexture support - GL_MAX_TEXTURE_UNITS_ARB=%u\n", gl_max);
+	  This->gl_info.supported[ARB_MULTITEXTURE] = TRUE;
+	  This->gl_info.max_textures = min(8, gl_max);
+        } else if (strcmp(ThisExtn, "GL_ARB_texture_cube_map") == 0) {
+	  FIXME(" FOUND: ARB Texture Cube Map support\n");
+	  This->gl_info.supported[ARB_TEXTURE_CUBE_MAP] = TRUE;
+        } else if (strcmp(ThisExtn, "GL_ARB_texture_compression") == 0) {
+	  FIXME(" FOUND: ARB Texture Compression support\n");
+	  This->gl_info.supported[ARB_TEXTURE_COMPRESSION] = TRUE;
+        } else if (strcmp(ThisExtn, "GL_ARB_texture_env_dot3") == 0) {
+	  FIXME(" FOUND: EXT Dot3 support\n");
+	  This->gl_info.supported[ARB_TEXTURE_ENV_DOT3] = TRUE;
+	} else if (strstr(ThisExtn, "GL_ARB_vertex_program")) {
+	  This->gl_info.vs_arb_version = VS_VERSION_11;
+	  FIXME(" FOUND: ARB Vertex Shader support - version=%02x\n", This->gl_info.vs_arb_version);
+	  This->gl_info.supported[ARB_VERTEX_PROGRAM] = TRUE;
+
+	/**
+	 * EXT
+	 */
+        } else if (strcmp(ThisExtn, "GL_EXT_fog_coord") == 0) {
+	  FIXME(" FOUND: EXT Fog coord support\n");
+	  This->gl_info.supported[EXT_FOG_COORD] = TRUE;
+        } else if (strcmp(ThisExtn, "GL_EXT_paletted_texture") == 0) {
+	  /* handle paletted texture extensions */
+	  FIXME(" FOUND: EXT Paletted texture support\n");
+	  This->gl_info.supported[EXT_PALETTED_TEXTURE] = TRUE;
+	} else if (strcmp(ThisExtn, "GL_EXT_secondary_color") == 0) {
+	  FIXME(" FOUND: EXT Secondary coord support\n");
+	  This->gl_info.supported[EXT_SECONDARY_COLOR] = TRUE;
+	} else if (strcmp(ThisExtn, "GL_EXT_texture_compression_s3tc") == 0) {
+	  FIXME(" FOUND: EXT Texture S3TC compression support\n");
+	  This->gl_info.supported[EXT_TEXTURE_COMPRESSION_S3TC] = TRUE;
+	} else if (strcmp(ThisExtn, "GL_EXT_texture_filter_anisotropic") == 0) {
+	  FIXME(" FOUND: EXT Texture Anisotropic filter support\n");
+	  This->gl_info.supported[EXT_TEXTURE_FILTER_ANISOTROPIC] = TRUE;
+	} else if (strcmp(ThisExtn, "GL_EXT_texture_lod") == 0) {
+	  FIXME(" FOUND: EXT Texture LOD support\n");
+	  This->gl_info.supported[EXT_TEXTURE_LOD] = TRUE;
+	} else if (strcmp(ThisExtn, "GL_EXT_texture_lod_bias") == 0) {
+	  FIXME(" FOUND: EXT Texture LOD bias support\n");
+	  This->gl_info.supported[EXT_TEXTURE_LOD_BIAS] = TRUE;
+	} else if (strcmp(ThisExtn, "GL_EXT_vertex_weighting") == 0) {
+	  FIXME(" FOUND: EXT Vertex weighting support\n");
+	  This->gl_info.supported[EXT_VERTEX_WEIGHTING] = TRUE;
+
+	/**
+	 * NVIDIA 
+	 */
+	} else if (strstr(ThisExtn, "GL_NV_fragment_program")) {
+	  This->gl_info.ps_nv_version = PS_VERSION_11;
+	  FIXME(" FOUND: NVIDIA (NV) Pixel Shader support - version=%02x\n", This->gl_info.ps_nv_version);
+	  This->gl_info.supported[NV_FRAGMENT_PROGRAM] = TRUE;
+	} else if (strstr(ThisExtn, "GL_NV_vertex_program")) {
+	  This->gl_info.vs_nv_version = max(This->gl_info.vs_nv_version, (0 == strcmp(ThisExtn, "GL_NV_vertex_program1_1")) ? VS_VERSION_11 : VS_VERSION_10);
+	  This->gl_info.vs_nv_version = max(This->gl_info.vs_nv_version, (0 == strcmp(ThisExtn, "GL_NV_vertex_program2"))   ? VS_VERSION_20 : VS_VERSION_10);
+	  FIXME(" FOUND: NVIDIA (NV) Vertex Shader support - version=%02x\n", This->gl_info.vs_nv_version);
+	  This->gl_info.supported[NV_VERTEX_PROGRAM] = TRUE;
+
+	/**
+	 * ATI
+	 */
+	/** TODO */
+	} else if (strcmp(ThisExtn, "GL_EXT_vertex_shader") == 0) {
+	  This->gl_info.vs_ati_version = VS_VERSION_11;
+	  FIXME(" FOUND: ATI (EXT) Vertex Shader support - version=%02x\n", This->gl_info.vs_ati_version);
+	  This->gl_info.supported[EXT_VERTEX_SHADER] = TRUE;
+	}
+
+
+        if (*GL_Extensions == ' ') GL_Extensions++;
+      }
+    }
+
+    GLX_Extensions = glXQueryExtensionsString(display, DefaultScreen(display));
+    FIXME("GLX_Extensions reported:\n");  
+    
+    if (NULL == GLX_Extensions) {
+      ERR("   GLX_Extensions returns NULL\n");      
+    } else {
+      while (*GLX_Extensions != 0x00) {
+        const char *Start = GLX_Extensions;
+        char ThisExtn[256];
+	
+        memset(ThisExtn, 0x00, sizeof(ThisExtn));
+        while (*GLX_Extensions != ' ' && *GLX_Extensions != 0x00) {
+	  GLX_Extensions++;
+        }
+        memcpy(ThisExtn, Start, (GLX_Extensions - Start));
+        FIXME("- %s\n", ThisExtn);
+        if (*GLX_Extensions == ' ') GLX_Extensions++;
+      }
+    }
+}
+
 HRESULT  WINAPI  IDirect3D8Impl_CreateDevice               (LPDIRECT3D8 iface,
                                                             UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow,
                                                             DWORD BehaviourFlags, D3DPRESENT_PARAMETERS* pPresentationParameters,
@@ -637,9 +788,6 @@
     HWND whichHWND;
     int num;
     XVisualInfo template;
-    const char *GL_Extensions = NULL;
-    const char *GLX_Extensions = NULL;
-    GLint gl_max;
 
     ICOM_THIS(IDirect3D8Impl,iface);
     TRACE("(%p)->(Adptr:%d, DevType: %x, FocusHwnd: %p, BehFlags: %lx, PresParms: %p, RetDevInt: %p)\n", This, Adapter, DeviceType,
@@ -690,6 +838,7 @@
            if (!whichHWND) {
                whichHWND = hFocusWindow;
            }
+	   object->win_handle = whichHWND;
            object->win     = (Window)GetPropA( whichHWND, "__wine_x11_client_window" );
 /*
  *      } else {
@@ -774,9 +923,26 @@
     /* If not windowed, need to go fullscreen, and resize the HWND to the appropriate  */
     /*        dimensions                                                               */
     if (!pPresentationParameters->Windowed) {
+#if 0
+	DEVMODEW devmode;
+	HDC hdc;
+        int bpp = 0;
+	memset(&devmode, 0, sizeof(DEVMODEW));
+	devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; 
+	MultiByteToWideChar(CP_ACP, 0, "Gamers CG", -1, devmode.dmDeviceName, CCHDEVICENAME);
+        hdc = CreateDCA("DISPLAY", NULL, NULL, NULL);
+        bpp = GetDeviceCaps(hdc, BITSPIXEL);
+        DeleteDC(hdc);
+	devmode.dmBitsPerPel = (bpp >= 24) ? 32 : bpp;/*Stupid XVidMode cannot change bpp D3DFmtGetBpp(object, pPresentationParameters->BackBufferFormat);*/
+	devmode.dmPelsWidth  = pPresentationParameters->BackBufferWidth;
+	devmode.dmPelsHeight = pPresentationParameters->BackBufferHeight;
+	ChangeDisplaySettingsExW(devmode.dmDeviceName, &devmode, object->win_handle, CDS_FULLSCREEN, NULL);
+#else
         FIXME("Requested full screen support not implemented, expect windowed operation\n");
-        SetWindowPos(whichHWND, HWND_TOP, 0, 0, pPresentationParameters->BackBufferWidth,
-                     pPresentationParameters->BackBufferHeight, SWP_SHOWWINDOW);
+#endif
+        SetWindowPos(object->win_handle, HWND_TOP, 0, 0, 
+		     pPresentationParameters->BackBufferWidth,
+                     pPresentationParameters->BackBufferHeight, SWP_SHOWWINDOW | SWP_FRAMECHANGED);
     }
 
     TRACE("Creating back buffer\n");
@@ -840,20 +1006,8 @@
       IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) object->stencilBufferTarget);
     }
 
-    /* Now override the surface's Flip method (if in double buffering) ?COPIED from DDRAW!?
-    ((x11_ds_private *) surface->private)->opengl_flip = TRUE;
-    {
-    int i;
-    struct _surface_chain *chain = surface->s.chain;
-    for (i=0;i<chain->nrofsurfaces;i++)
-      if (chain->surfaces[i]->s.surface_desc.ddsCaps.dwCaps & DDSCAPS_FLIP)
-          ((x11_ds_private *) chain->surfaces[i]->private)->opengl_flip = TRUE;
-    }
-    */
-
     ENTER_GL();
 
-    /*TRACE("hereeee. %x %x %x\n", object->display, object->win, object->glCtx);*/
     if (glXMakeCurrent(object->display, object->win, object->glCtx) == False) {
       ERR("Error in setting current context (context %p drawable %ld)!\n", object->glCtx, object->win);
     }
@@ -881,145 +1035,7 @@
      * Initialize openGL extension related variables
      *  with Default values 
      */
-    memset(&This->gl_info.supported, 0, sizeof(This->gl_info.supported));
-    This->gl_info.max_textures   = 1;
-    This->gl_info.ps_arb_version = PS_VERSION_NOT_SUPPORTED;
-    This->gl_info.vs_arb_version = VS_VERSION_NOT_SUPPORTED;
-    This->gl_info.vs_nv_version  = VS_VERSION_NOT_SUPPORTED;
-    This->gl_info.vs_ati_version = VS_VERSION_NOT_SUPPORTED;
-
-    /* Retrieve opengl defaults */
-    glGetIntegerv(GL_MAX_CLIP_PLANES, &gl_max);
-    This->gl_info.max_clipplanes = min(MAX_CLIPPLANES, gl_max);
-    TRACE("ClipPlanes support - num Planes=%d\n", gl_max);
-
-    glGetIntegerv(GL_MAX_LIGHTS, &gl_max);
-    This->gl_info.max_lights = min(MAX_ACTIVE_LIGHTS, gl_max);
-    TRACE("Lights support - max lights=%d\n", gl_max);
-
-    /* Parse the gl supported features, in theory enabling parts of our code appropriately */
-    GL_Extensions = glGetString(GL_EXTENSIONS);
-    FIXME("GL_Extensions reported:\n");  
-    
-    if (NULL == GL_Extensions) {
-      ERR("   GL_Extensions returns NULL\n");      
-    } else {
-      while (*GL_Extensions != 0x00) {
-        const char *Start = GL_Extensions;
-        char ThisExtn[256];
-
-        memset(ThisExtn, 0x00, sizeof(ThisExtn));
-        while (*GL_Extensions != ' ' && *GL_Extensions != 0x00) {
-	  GL_Extensions++;
-        }
-        memcpy(ThisExtn, Start, (GL_Extensions - Start));
-        FIXME("- %s\n", ThisExtn);
-
-	/**
-	 * ARB 
-	 */
-	if (strcmp(ThisExtn, "GL_ARB_fragment_program") == 0) {
-	  This->gl_info.ps_arb_version = PS_VERSION_11;
-	  FIXME(" FOUND: ARB Pixel Shader support - version=%02x\n", This->gl_info.ps_arb_version);
-	  This->gl_info.supported[ARB_FRAGMENT_PROGRAM] = TRUE;
-        } else if (strcmp(ThisExtn, "GL_ARB_multisample") == 0) {
-	  FIXME(" FOUND: ARB Multisample support\n");
-	  This->gl_info.supported[ARB_MULTISAMPLE] = TRUE;
-	} else if (strcmp(ThisExtn, "GL_ARB_multitexture") == 0) {
-	  glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &gl_max);
-	  FIXME(" FOUND: ARB Multitexture support - GL_MAX_TEXTURE_UNITS_ARB=%u\n", gl_max);
-	  This->gl_info.supported[ARB_MULTITEXTURE] = TRUE;
-	  This->gl_info.max_textures = min(8, gl_max);
-        } else if (strcmp(ThisExtn, "GL_ARB_texture_cube_map") == 0) {
-	  FIXME(" FOUND: ARB Texture Cube Map support\n");
-	  This->gl_info.supported[ARB_TEXTURE_CUBE_MAP] = TRUE;
-        } else if (strcmp(ThisExtn, "GL_ARB_texture_compression") == 0) {
-	  FIXME(" FOUND: ARB Texture Compression support\n");
-	  This->gl_info.supported[ARB_TEXTURE_COMPRESSION] = TRUE;
-        } else if (strcmp(ThisExtn, "GL_ARB_texture_env_dot3") == 0) {
-	  FIXME(" FOUND: EXT Dot3 support\n");
-	  This->gl_info.supported[ARB_TEXTURE_ENV_DOT3] = TRUE;
-	} else if (strstr(ThisExtn, "GL_ARB_vertex_program")) {
-	  This->gl_info.vs_arb_version = VS_VERSION_11;
-	  FIXME(" FOUND: ARB Vertex Shader support - version=%02x\n", This->gl_info.vs_arb_version);
-	  This->gl_info.supported[ARB_VERTEX_PROGRAM] = TRUE;
-
-	/**
-	 * EXT
-	 */
-        } else if (strcmp(ThisExtn, "GL_EXT_fog_coord") == 0) {
-	  FIXME(" FOUND: EXT Fog coord support\n");
-	  This->gl_info.supported[EXT_FOG_COORD] = TRUE;
-        } else if (strcmp(ThisExtn, "GL_EXT_paletted_texture") == 0) {
-	  /* handle paletted texture extensions */
-	  FIXME(" FOUND: EXT Paletted texture support\n");
-	  This->gl_info.supported[EXT_PALETTED_TEXTURE] = TRUE;
-	} else if (strcmp(ThisExtn, "GL_EXT_secondary_color") == 0) {
-	  FIXME(" FOUND: EXT Secondary coord support\n");
-	  This->gl_info.supported[EXT_SECONDARY_COLOR] = TRUE;
-	} else if (strcmp(ThisExtn, "GL_EXT_texture_compression_s3tc") == 0) {
-	  FIXME(" FOUND: EXT Texture S3TC compression support\n");
-	  This->gl_info.supported[EXT_TEXTURE_COMPRESSION_S3TC] = TRUE;
-	} else if (strcmp(ThisExtn, "GL_EXT_texture_filter_anisotropic") == 0) {
-	  FIXME(" FOUND: EXT Texture Anisotropic filter support\n");
-	  This->gl_info.supported[EXT_TEXTURE_FILTER_ANISOTROPIC] = TRUE;
-	} else if (strcmp(ThisExtn, "GL_EXT_texture_lod") == 0) {
-	  FIXME(" FOUND: EXT Texture LOD support\n");
-	  This->gl_info.supported[EXT_TEXTURE_LOD] = TRUE;
-	} else if (strcmp(ThisExtn, "GL_EXT_texture_lod_bias") == 0) {
-	  FIXME(" FOUND: EXT Texture LOD bias support\n");
-	  This->gl_info.supported[EXT_TEXTURE_LOD_BIAS] = TRUE;
-	} else if (strcmp(ThisExtn, "GL_EXT_vertex_weighting") == 0) {
-	  FIXME(" FOUND: EXT Vertex weighting support\n");
-	  This->gl_info.supported[EXT_VERTEX_WEIGHTING] = TRUE;
-
-	/**
-	 * NVIDIA 
-	 */
-	} else if (strstr(ThisExtn, "GL_NV_fragment_program")) {
-	  This->gl_info.ps_nv_version = PS_VERSION_11;
-	  FIXME(" FOUND: NVIDIA (NV) Pixel Shader support - version=%02x\n", This->gl_info.ps_nv_version);
-	  This->gl_info.supported[NV_FRAGMENT_PROGRAM] = TRUE;
-	} else if (strstr(ThisExtn, "GL_NV_vertex_program")) {
-	  This->gl_info.vs_nv_version = max(This->gl_info.vs_nv_version, (0 == strcmp(ThisExtn, "GL_NV_vertex_program1_1")) ? VS_VERSION_11 : VS_VERSION_10);
-	  This->gl_info.vs_nv_version = max(This->gl_info.vs_nv_version, (0 == strcmp(ThisExtn, "GL_NV_vertex_program2"))   ? VS_VERSION_20 : VS_VERSION_10);
-	  FIXME(" FOUND: NVIDIA (NV) Vertex Shader support - version=%02x\n", This->gl_info.vs_nv_version);
-	  This->gl_info.supported[NV_VERTEX_PROGRAM] = TRUE;
-
-	/**
-	 * ATI
-	 */
-	/** TODO */
-	} else if (strcmp(ThisExtn, "GL_EXT_vertex_shader") == 0) {
-	  This->gl_info.vs_ati_version = VS_VERSION_11;
-	  FIXME(" FOUND: ATI (EXT) Vertex Shader support - version=%02x\n", This->gl_info.vs_ati_version);
-	  This->gl_info.supported[EXT_VERTEX_SHADER] = TRUE;
-	}
-
-
-        if (*GL_Extensions == ' ') GL_Extensions++;
-      }
-    }
-
-    GLX_Extensions = glXQueryExtensionsString(object->display, DefaultScreen(object->display));
-    TRACE("GLX_Extensions reported:\n");  
-    
-    if (NULL == GLX_Extensions) {
-      ERR("   GLX_Extensions returns NULL\n");      
-    } else {
-      while (*GLX_Extensions != 0x00) {
-        const char *Start = GLX_Extensions;
-        char ThisExtn[256];
-	
-        memset(ThisExtn, 0x00, sizeof(ThisExtn));
-        while (*GLX_Extensions != ' ' && *GLX_Extensions != 0x00) {
-	  GLX_Extensions++;
-        }
-        memcpy(ThisExtn, Start, (GLX_Extensions - Start));
-        TRACE ("- %s\n", ThisExtn);
-        if (*GLX_Extensions == ' ') GLX_Extensions++;
-      }
-    }
+    IDirect3D8Impl_FillGLCaps(iface, object->display);
 
     /* Setup all the devices defaults */
     IDirect3DDeviceImpl_InitStartupStateBlock(object);
diff -u /cvs-src/wine-pending/d3d8_47/surface.c dlls/d3d8/surface.c
--- /cvs-src/wine-pending/d3d8_47/surface.c	2003-06-01 13:36:23.000000000 +0200
+++ dlls/d3d8/surface.c	2003-06-01 13:46:45.000000000 +0200
@@ -208,7 +208,7 @@
 			 1,
 			 D3DFmt2GLFmt(This->Device, This->myDesc.Format), 
                          D3DFmt2GLType(This->Device, This->myDesc.Format), 
-                         pLockedRect->pBits + (pLockedRect->Pitch * (j-This->lockedRect.top)));
+                         ((BYTE*) pLockedRect->pBits) + (pLockedRect->Pitch * (j - This->lockedRect.top)));
 	    vcheckGLcall("glReadPixels");
 	  }
 	}
@@ -243,19 +243,6 @@
 	
 	if (SUCCEEDED(hr) && NULL != cont) {
 	  IDirect3DBaseTexture8Impl_SetDirty(cont, TRUE);
-#if 0
-	  /* Now setup the texture appropraitly */
-	  D3DRESOURCETYPE containerType = IDirect3DBaseTexture8Impl_GetType(cont);
-	  if (containerType == D3DRTYPE_TEXTURE) {
-            IDirect3DTexture8Impl* pTexture = (IDirect3DTexture8Impl*) cont;
-            pTexture->Dirty = TRUE;
-	  } else if (containerType == D3DRTYPE_CUBETEXTURE) {
-            IDirect3DCubeTexture8Impl* pTexture = (IDirect3DCubeTexture8Impl*) cont;
-            pTexture->Dirty = TRUE;
-	  } else {
-            FIXME("Set dirty on container type %d\n", containerType);
-	  }
-#endif
 	  IDirect3DBaseTexture8_Release(cont);
 	  cont = NULL;
 	}
diff -u /cvs-src/wine-pending/d3d8_47/swapchain.c dlls/d3d8/swapchain.c
--- /cvs-src/wine-pending/d3d8_47/swapchain.c	2003-06-01 13:36:23.000000000 +0200
+++ dlls/d3d8/swapchain.c	2003-06-01 14:20:55.000000000 +0200
@@ -56,8 +56,9 @@
     ICOM_THIS(IDirect3DSwapChain8Impl,iface);
     ULONG ref = --This->ref;
     TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref);
-    if (ref == 0)
+    if (ref == 0) {
         HeapFree(GetProcessHeap(), 0, This);
+    }
     return ref;
 }
 
@@ -67,10 +68,19 @@
     FIXME("(%p) : stub\n", This);
     return D3D_OK;
 }
-HRESULT WINAPI IDirect3DSwapChain8Impl_GetBackBuffer(LPDIRECT3DSWAPCHAIN8 iface, UINT BackBuffer, D3DBACKBUFFER_TYPE Type,IDirect3DSurface8** ppBackBuffer) {
+
+HRESULT WINAPI IDirect3DSwapChain8Impl_GetBackBuffer(LPDIRECT3DSWAPCHAIN8 iface, UINT BackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface8** ppBackBuffer) {
     ICOM_THIS(IDirect3DSwapChain8Impl,iface);
-    FIXME("(%p) : stub\n", This);    
-    *ppBackBuffer = NULL;
+    *ppBackBuffer = (LPDIRECT3DSURFACE8) This->backBuffer;
+    TRACE("(%p) : BackBuf %d Type %d returning %p\n", This, BackBuffer, Type, *ppBackBuffer);
+
+    if (BackBuffer > This->PresentParms.BackBufferCount - 1) {
+        FIXME("Only one backBuffer currently supported\n");
+        return D3DERR_INVALIDCALL;
+    }
+
+    /* Note inc ref on returned surface */
+    IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) *ppBackBuffer);
     return D3D_OK;
 }
 


More information about the wine-patches mailing list