Commit 34d06a5e authored by Roderick Colenbrander's avatar Roderick Colenbrander Committed by Alexandre Julliard

wined3d: Also use WineD3D_ChoosePixelFormat for pbuffers.

parent a38e5a95
...@@ -249,52 +249,25 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar ...@@ -249,52 +249,25 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
if(create_pbuffer) { if(create_pbuffer) {
HDC hdc_parent = GetDC(win_handle); HDC hdc_parent = GetDC(win_handle);
int iPixelFormat = 0; int iPixelFormat = 0;
short redBits, greenBits, blueBits, alphaBits, colorBits;
short depthBits, stencilBits;
IWineD3DSurface *StencilSurface = This->stencilBufferTarget; IWineD3DSurface *StencilSurface = This->stencilBufferTarget;
WINED3DFORMAT StencilBufferFormat = (NULL != StencilSurface) ? ((IWineD3DSurfaceImpl *) StencilSurface)->resource.format : 0; WINED3DFORMAT StencilBufferFormat = (NULL != StencilSurface) ? ((IWineD3DSurfaceImpl *) StencilSurface)->resource.format : 0;
int attribs[256]; /* Try to find a pixel format with pbuffer support. */
int nAttribs = 0; iPixelFormat = WineD3D_ChoosePixelFormat(This, hdc_parent, target->resource.format, StencilBufferFormat, FALSE /* auxBuffers */, TRUE /* PBUFFER */, FALSE /* findCompatible */);
unsigned int nFormats; if(!iPixelFormat) {
TRACE("Trying to locate a compatible pixel format because an exact match failed.\n");
/* Retrieve the specifications for the pixelformat from the backbuffer / stencilbuffer */
getColorBits(target->resource.format, &redBits, &greenBits, &blueBits, &alphaBits, &colorBits); /* For some reason we weren't able to find a format, try to find something instead of crashing.
getDepthStencilBits(StencilBufferFormat, &depthBits, &stencilBits); * A reason for failure could have been wglChoosePixelFormatARB strictness. */
PUSH2(WGL_DRAW_TO_PBUFFER_ARB, 1); /* We need pbuffer support; doublebuffering isn't needed */ iPixelFormat = WineD3D_ChoosePixelFormat(This, hdc_parent, target->resource.format, StencilBufferFormat, FALSE /* auxBuffer */, TRUE /* PBUFFER */, TRUE /* findCompatible */);
PUSH2(WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB); /* Make sure we don't get a float or color index format */ }
PUSH2(WGL_COLOR_BITS_ARB, colorBits);
PUSH2(WGL_RED_BITS_ARB, redBits); /* This shouldn't happen as ChoosePixelFormat always returns something */
PUSH2(WGL_GREEN_BITS_ARB, greenBits); if(!iPixelFormat) {
PUSH2(WGL_BLUE_BITS_ARB, blueBits); ERR("Unable to locate a pixel format for a pbuffer\n");
PUSH2(WGL_ALPHA_BITS_ARB, alphaBits); ReleaseDC(win_handle, hdc_parent);
PUSH2(WGL_DEPTH_BITS_ARB, depthBits); goto out;
PUSH2(WGL_STENCIL_BITS_ARB, stencilBits);
PUSH1(0); /* end the list */
/* 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)))
{
PIXELFORMATDESCRIPTOR pfd;
TRACE("Falling back to ChoosePixelFormat as wglChoosePixelFormatARB failed\n");
ZeroMemory(&pfd, sizeof(pfd));
pfd.nSize = sizeof(pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER_DONTCARE | PFD_DRAW_TO_WINDOW;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = colorBits;
pfd.cDepthBits = depthBits;
pfd.cStencilBits = stencilBits;
pfd.iLayerType = PFD_MAIN_PLANE;
iPixelFormat = ChoosePixelFormat(hdc_parent, &pfd);
if(!iPixelFormat) {
/* If this happens something is very wrong as ChoosePixelFormat barely fails */
ERR("Can't find a suitable iPixelFormat for the pbuffer\n");
}
} }
TRACE("Creating a pBuffer drawable for the new context\n"); TRACE("Creating a pBuffer drawable for the new context\n");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment