Stefan Dösinger : wined3d: Set the display mode before creating the context.
Alexandre Julliard
julliard at winehq.org
Wed Nov 7 06:45:53 CST 2007
Module: wine
Branch: master
Commit: 45ebea1f47bcdfac5466d6821cca47c2a0376512
URL: http://source.winehq.org/git/wine.git/?a=commit;h=45ebea1f47bcdfac5466d6821cca47c2a0376512
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Fri Oct 26 02:16:03 2007 +0200
wined3d: Set the display mode before creating the context.
---
dlls/wined3d/device.c | 74 +++++++++++++++++++++++++++++++++----------------
1 files changed, 50 insertions(+), 24 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index a595840..6aa58cd 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1358,6 +1358,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevic
IWineD3DSwapChainImpl *object; /** NOTE: impl ref allowed since this is a create function **/
HRESULT hr = WINED3D_OK;
IUnknown *bufferParent;
+ BOOL displaymode_set = FALSE;
TRACE("(%p) : Created Aditional Swap Chain\n", This);
@@ -1450,30 +1451,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevic
goto error;
}
- /**
- * Create an opengl context for the display visual
- * NOTE: the visual is chosen as the window is created and the glcontext cannot
- * use different properties after that point in time. FIXME: How to handle when requested format
- * doesn't match actual visual? Cannot choose one here - code removed as it ONLY works if the one
- * it chooses is identical to the one already being used!
- **********************************/
- /** FIXME: Handle stencil appropriately via EnableAutoDepthStencil / AutoDepthStencilFormat **/
-
- object->context = HeapAlloc(GetProcessHeap(), 0, sizeof(object->context));
- if(!object->context)
- return E_OUTOFMEMORY;
- object->num_contexts = 1;
-
- object->context[0] = CreateContext(This, (IWineD3DSurfaceImpl *) object->frontBuffer, object->win_handle, FALSE /* pbuffer */, pPresentationParameters);
- if (!object->context[0]) {
- ERR("Failed to create a new context\n");
- hr = WINED3DERR_NOTAVAILABLE;
- goto error;
- } else {
- TRACE("Context created (HWND=%p, glContext=%p)\n",
- object->win_handle, object->context[0]->glCtx);
- }
-
/*********************
* Windowed / Fullscreen
*******************/
@@ -1504,6 +1481,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevic
devmode.dmPelsWidth = pPresentationParameters->BackBufferWidth;
devmode.dmPelsHeight = pPresentationParameters->BackBufferHeight;
ChangeDisplaySettingsExW(This->adapter->DeviceName, &devmode, NULL, CDS_FULLSCREEN, NULL);
+ displaymode_set = TRUE;
/* For GetDisplayMode */
This->ddraw_width = devmode.dmPelsWidth;
@@ -1517,6 +1495,30 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevic
ClipCursor(&clip_rc);
}
+ /**
+ * Create an opengl context for the display visual
+ * NOTE: the visual is chosen as the window is created and the glcontext cannot
+ * use different properties after that point in time. FIXME: How to handle when requested format
+ * doesn't match actual visual? Cannot choose one here - code removed as it ONLY works if the one
+ * it chooses is identical to the one already being used!
+ **********************************/
+ /** FIXME: Handle stencil appropriately via EnableAutoDepthStencil / AutoDepthStencilFormat **/
+
+ object->context = HeapAlloc(GetProcessHeap(), 0, sizeof(object->context));
+ if(!object->context)
+ return E_OUTOFMEMORY;
+ object->num_contexts = 1;
+
+ object->context[0] = CreateContext(This, (IWineD3DSurfaceImpl *) object->frontBuffer, object->win_handle, FALSE /* pbuffer */, pPresentationParameters);
+ if (!object->context[0]) {
+ ERR("Failed to create a new context\n");
+ hr = WINED3DERR_NOTAVAILABLE;
+ goto error;
+ } else {
+ TRACE("Context created (HWND=%p, glContext=%p)\n",
+ object->win_handle, object->context[0]->glCtx);
+ }
+
/*********************
* Create the back, front and stencil buffers
*******************/
@@ -1594,6 +1596,30 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevic
return WINED3D_OK;
error:
+ if (displaymode_set) {
+ DEVMODEW devmode;
+ HDC hdc;
+ int bpp = 0;
+ RECT clip_rc;
+
+ SetRect(&clip_rc, 0, 0, object->orig_width, object->orig_height);
+ ClipCursor(NULL);
+
+ /* Get info on the current display setup */
+ hdc = GetDC(0);
+ bpp = GetDeviceCaps(hdc, BITSPIXEL);
+ ReleaseDC(0, hdc);
+
+ /* Change the display settings */
+ memset(&devmode, 0, sizeof(devmode));
+ devmode.dmSize = sizeof(devmode);
+ devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
+ devmode.dmBitsPerPel = (bpp >= 24) ? 32 : bpp; /* Stupid XVidMode cannot change bpp */
+ devmode.dmPelsWidth = object->orig_width;
+ devmode.dmPelsHeight = object->orig_height;
+ ChangeDisplaySettingsExW(This->adapter->DeviceName, &devmode, NULL, CDS_FULLSCREEN, NULL);
+ }
+
if (object->backBuffer) {
int i;
for(i = 0; i < object->presentParms.BackBufferCount; i++) {
More information about the wine-cvs
mailing list