Roderick Colenbrander : wined3d: Use the proper depth stencil format.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Aug 13 06:31:52 CDT 2007
Module: wine
Branch: master
Commit: 5754726aeb6397d6861ecc04c954f47574fcf72c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5754726aeb6397d6861ecc04c954f47574fcf72c
Author: Roderick Colenbrander <thunderbird2k at gmx.net>
Date: Sat Aug 11 12:17:56 2007 +0200
wined3d: Use the proper depth stencil format.
---
dlls/wined3d/context.c | 22 ++++++++++++++--------
dlls/wined3d/device.c | 2 +-
dlls/wined3d/swapchain.c | 4 ++--
dlls/wined3d/wined3d_private.h | 2 +-
4 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index eef4bd9..9edbd73 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -119,9 +119,10 @@ static WineD3DContext *AddContextToArray(IWineD3DDeviceImpl *This, HWND win_hand
* target: Surface this context will render to
* win_handle: handle to the window which we are drawing to
* create_pbuffer: tells whether to create a pbuffer or not
+ * pPresentParameters: contains the pixelformats to use for onscreen rendering
*
*****************************************************************************/
-WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, HWND win_handle, BOOL create_pbuffer) {
+WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, HWND win_handle, BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *pPresentParms) {
HDC oldDrawable, hdc;
HPBUFFERARB pbuffer = NULL;
HGLRC ctx = NULL, oldCtx;
@@ -222,18 +223,23 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW;/*PFD_GENERIC_ACCELERATED*/
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
- pfd.cDepthBits = 24;
- pfd.cStencilBits = 8;
+ pfd.cDepthBits = 0;
+ pfd.cStencilBits = 0;
pfd.iLayerType = PFD_MAIN_PLANE;
/* Try to match the colorBits of the d3d format */
if(getColorBits(target->resource.format, &red, &green, &blue, &alpha, &colorBits))
pfd.cColorBits = colorBits;
- /* TODO: get the depth/stencil format from auto depth stencil format */
- if(getDepthStencilBits(WINED3DFMT_D24S8, &depthBits, &stencilBits)) {
- pfd.cDepthBits = depthBits;
- pfd.cStencilBits = stencilBits;
+ /* Retrieve the depth stencil format from the present parameters.
+ * The choice of the proper format can give a nice performance boost
+ * in case of GPU limited programs. */
+ if(pPresentParms->EnableAutoDepthStencil) {
+ TRACE("pPresentParms->EnableAutoDepthStencil=enabled; using AutoDepthStencilFormat=%s\n", debug_d3dformat(pPresentParms->AutoDepthStencilFormat));
+ if(getDepthStencilBits(pPresentParms->AutoDepthStencilFormat, &depthBits, &stencilBits)) {
+ pfd.cDepthBits = depthBits;
+ pfd.cStencilBits = stencilBits;
+ }
}
iPixelFormat = ChoosePixelFormat(hdc, &pfd);
@@ -696,7 +702,7 @@ static inline WineD3DContext *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurf
*/
This->pbufferContext = CreateContext(This, targetimpl,
((IWineD3DSwapChainImpl *) This->swapchains[0])->context[0]->win_handle,
- TRUE /* pbuffer */);
+ TRUE /* pbuffer */, &((IWineD3DSwapChainImpl *)This->swapchains[0])->presentParms);
This->pbufferWidth = targetimpl->currentDesc.Width;
This->pbufferHeight = targetimpl->currentDesc.Height;
}
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 59bc35f..b0c0b20 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1302,7 +1302,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevic
object->num_contexts = 1;
ENTER_GL();
- object->context[0] = CreateContext(This, (IWineD3DSurfaceImpl *) object->frontBuffer, object->win_handle, FALSE /* pbuffer */);
+ object->context[0] = CreateContext(This, (IWineD3DSurfaceImpl *) object->frontBuffer, object->win_handle, FALSE /* pbuffer */, pPresentationParameters);
LEAVE_GL();
if (!object->context[0]) {
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 7741b37..5d1edbe 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -205,7 +205,7 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
IWineD3DSurface_UnlockRect(This->backBuffer[0]);
DestroyContext(This->wineD3DDevice, This->context[0]);
- This->context[0] = CreateContext(This->wineD3DDevice, (IWineD3DSurfaceImpl *) This->frontBuffer, This->win_handle, FALSE /* pbuffer */);
+ This->context[0] = CreateContext(This->wineD3DDevice, (IWineD3DSurfaceImpl *) This->frontBuffer, This->win_handle, FALSE /* pbuffer */, &This->presentParms);
IWineD3DSurface_LockRect(This->backBuffer[0], &r, NULL, WINED3DLOCK_DISCARD);
memcpy(r.pBits, mem, r.Pitch * ((IWineD3DSurfaceImpl *) This->backBuffer[0])->currentDesc.Height);
@@ -537,7 +537,7 @@ WineD3DContext *IWineD3DSwapChainImpl_CreateContextForThread(IWineD3DSwapChain *
TRACE("Creating a new context for swapchain %p, thread %d\n", This, GetCurrentThreadId());
ctx = CreateContext(This->wineD3DDevice, (IWineD3DSurfaceImpl *) This->frontBuffer,
- This->context[0]->win_handle, FALSE /* pbuffer */);
+ This->context[0]->win_handle, FALSE /* pbuffer */, &This->presentParms);
if(!ctx) {
ERR("Failed to create a new context for the swapchain\n");
return NULL;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index b2fe145..c996b23 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -535,7 +535,7 @@ typedef enum ContextUsage {
} ContextUsage;
void ActivateContext(IWineD3DDeviceImpl *device, IWineD3DSurface *target, ContextUsage usage);
-WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, HWND win, BOOL create_pbuffer);
+WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, HWND win, BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *pPresentParms);
void DestroyContext(IWineD3DDeviceImpl *This, WineD3DContext *context);
void apply_fbo_state(IWineD3DDevice *iface);
More information about the wine-cvs
mailing list