Roderick Colenbrander : wined3d: Improve pixelformat selection code.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Aug 27 06:07:37 CDT 2007
Module: wine
Branch: master
Commit: 318f6068699e7d8b548f1753c014244effe2f746
URL: http://source.winehq.org/git/wine.git/?a=commit;h=318f6068699e7d8b548f1753c014244effe2f746
Author: Roderick Colenbrander <thunderbird2k at gmx.net>
Date: Sat Aug 25 00:18:54 2007 +0200
wined3d: Improve pixelformat selection code.
---
dlls/wined3d/context.c | 78 ++++++++++++++++++++++++++++++------------------
1 files changed, 49 insertions(+), 29 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 2507835..ab1d91c 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -131,6 +131,8 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
TRACE("(%p): Creating a %s context for render target %p\n", This, create_pbuffer ? "offscreen" : "onscreen", target);
+#define PUSH1(att) attribs[nAttribs++] = (att);
+#define PUSH2(att,value) attribs[nAttribs++] = (att); attribs[nAttribs++] = (value);
if(create_pbuffer) {
HDC hdc_parent = GetDC(win_handle);
int iPixelFormat = 0;
@@ -144,9 +146,6 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
int nAttribs = 0;
unsigned int nFormats;
-#define PUSH1(att) attribs[nAttribs++] = (att);
-#define PUSH2(att,value) attribs[nAttribs++] = (att); attribs[nAttribs++] = (value);
-
/* Retrieve the specifications for the pixelformat from the backbuffer / stencilbuffer */
getColorBits(target->resource.format, &red, &green, &blue, &alphaBits, &colorBits);
getDepthStencilBits(StencilBufferFormat, &depthBits, &stencilBits);
@@ -158,9 +157,6 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
PUSH2(WGL_STENCIL_BITS_ARB, stencilBits);
PUSH1(0); /* end the list */
-#undef PUSH1
-#undef PUSH2
-
/* Try to find a pixelformat that matches exactly. If that fails let ChoosePixelFormat try to find a close match */
if(!GL_EXTCALL(wglChoosePixelFormatARB(hdc_parent, (const int*)&attribs, NULL, 1, &iPixelFormat, &nFormats)))
{
@@ -205,10 +201,12 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
} else {
PIXELFORMATDESCRIPTOR pfd;
int iPixelFormat;
- short red, green, blue, alpha;
- short colorBits;
- short depthBits, stencilBits;
+ short redBits, greenBits, blueBits, alphaBits, colorBits;
+ short depthBits=0, stencilBits=0;
int res;
+ int attribs[256];
+ int nAttribs = 0;
+ unsigned int nFormats;
hdc = GetDC(win_handle);
if(hdc == NULL) {
@@ -217,36 +215,56 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
}
/* PixelFormat selection */
- /* TODO: fill cColorBits/cDepthBits with target->resource.format */
- ZeroMemory(&pfd, sizeof(pfd));
- pfd.nSize = sizeof(pfd);
- pfd.nVersion = 1;
- pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW;/*PFD_GENERIC_ACCELERATED*/
- pfd.iPixelType = PFD_TYPE_RGBA;
- pfd.cColorBits = 32;
- 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;
+ PUSH2(WGL_DRAW_TO_WINDOW_ARB, GL_TRUE); /* We want to draw to a window */
+ PUSH2(WGL_DOUBLE_BUFFER_ARB, GL_TRUE);
+ PUSH2(WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB); /* Make sure we don't get a float or color index format */
+
+ if(!getColorBits(target->resource.format, &redBits, &greenBits, &blueBits, &alphaBits, &colorBits)) {
+ ERR("Unable to get color bits for format %#x!\n", target->resource.format);
+ return FALSE;
+ }
+ PUSH2(WGL_COLOR_BITS_ARB, colorBits);
+ PUSH2(WGL_RED_BITS_ARB, redBits);
+ PUSH2(WGL_GREEN_BITS_ARB, greenBits);
+ PUSH2(WGL_BLUE_BITS_ARB, blueBits);
+ PUSH2(WGL_ALPHA_BITS_ARB, alphaBits);
/* 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;
+ if(!getDepthStencilBits(pPresentParms->AutoDepthStencilFormat, &depthBits, &stencilBits)) {
+ ERR("Unable to get depth / stencil bits for AutoDepthStencilFormat %#x!\n", pPresentParms->AutoDepthStencilFormat);
+ return FALSE;
}
+ PUSH2(WGL_DEPTH_BITS_ARB, depthBits);
+ PUSH2(WGL_STENCIL_BITS_ARB, stencilBits);
}
+ PUSH1(0); /* end the list */
iPixelFormat = ChoosePixelFormat(hdc, &pfd);
- if(!iPixelFormat) {
- /* If this happens something is very wrong as ChoosePixelFormat barely fails */
- ERR("Can't find a suitable iPixelFormat\n");
+
+ /* In case of failure hope that standard ChooosePixelFormat will find something suitable */
+ if(!GL_EXTCALL(wglChoosePixelFormatARB(hdc, (const int*)&attribs, NULL, 1, &iPixelFormat, &nFormats)))
+ {
+ /* PixelFormat selection */
+ ZeroMemory(&pfd, sizeof(pfd));
+ pfd.nSize = sizeof(pfd);
+ pfd.nVersion = 1;
+ pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW;/*PFD_GENERIC_ACCELERATED*/
+ pfd.iPixelType = PFD_TYPE_RGBA;
+ pfd.cAlphaBits = alphaBits;
+ pfd.cColorBits = colorBits;
+ pfd.cDepthBits = depthBits;
+ pfd.cStencilBits = stencilBits;
+ pfd.iLayerType = PFD_MAIN_PLANE;
+
+ iPixelFormat = ChoosePixelFormat(hdc, &pfd);
+ if(!iPixelFormat) {
+ /* If this happens something is very wrong as ChoosePixelFormat barely fails */
+ ERR("Can't find a suitable iPixelFormat\n");
+ }
}
DescribePixelFormat(hdc, iPixelFormat, sizeof(pfd), &pfd);
@@ -265,6 +283,8 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
}
}
}
+#undef PUSH1
+#undef PUSH2
ctx = pwglCreateContext(hdc);
if(This->numContexts) pwglShareLists(This->contexts[0]->glCtx, ctx);
More information about the wine-cvs
mailing list