[PATCH 05/10] wined3d: Kill pbuffer offscreen rendering support.
Henri Verbeet
hverbeet at codeweavers.com
Sun Mar 14 15:53:23 CDT 2010
Our pbuffer support is broken, nobody cares.
---
dlls/wined3d/context.c | 342 ++++++++++++++--------------------------
dlls/wined3d/device.c | 17 +--
dlls/wined3d/directx.c | 48 ++----
dlls/wined3d/surface.c | 2 -
dlls/wined3d/swapchain.c | 6 +-
dlls/wined3d/wined3d_gl.h | 26 ---
dlls/wined3d/wined3d_main.c | 5 -
dlls/wined3d/wined3d_private.h | 12 +-
8 files changed, 139 insertions(+), 319 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 0878985..5f2167a 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -772,15 +772,7 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
ERR("Failed to disable GL context.\n");
}
- if (context->pbuffer)
- {
- GL_EXTCALL(wglReleasePbufferDCARB(context->pbuffer, context->hdc));
- GL_EXTCALL(wglDestroyPbufferARB(context->pbuffer));
- }
- else
- {
- ReleaseDC(context->win_handle, context->hdc);
- }
+ ReleaseDC(context->win_handle, context->hdc);
if (!pwglDeleteContext(context->glCtx))
{
@@ -941,11 +933,10 @@ static void Context_MarkStateDirty(struct wined3d_context *context, DWORD state,
* This: Device to add the context for
* hdc: device context
* glCtx: WGL context to add
- * pbuffer: optional pbuffer used with this context
*
*****************************************************************************/
static struct wined3d_context *AddContextToArray(IWineD3DDeviceImpl *This,
- HWND win_handle, HDC hdc, HGLRC glCtx, HPBUFFERARB pbuffer)
+ HWND win_handle, HDC hdc, HGLRC glCtx)
{
struct wined3d_context **oldArray = This->contexts;
DWORD state;
@@ -970,7 +961,6 @@ static struct wined3d_context *AddContextToArray(IWineD3DDeviceImpl *This,
This->contexts[This->numContexts]->hdc = hdc;
This->contexts[This->numContexts]->glCtx = glCtx;
- This->contexts[This->numContexts]->pbuffer = pbuffer;
This->contexts[This->numContexts]->win_handle = win_handle;
HeapFree(GetProcessHeap(), 0, oldArray);
@@ -989,7 +979,7 @@ static struct wined3d_context *AddContextToArray(IWineD3DDeviceImpl *This,
/* This function takes care of WineD3D pixel format selection. */
static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc,
const struct GlPixelFormatDesc *color_format_desc, const struct GlPixelFormatDesc *ds_format_desc,
- BOOL auxBuffers, int numSamples, BOOL pbuffer, BOOL findCompatible)
+ BOOL auxBuffers, int numSamples, BOOL findCompatible)
{
int iPixelFormat=0;
unsigned int matchtry;
@@ -1019,9 +1009,9 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc,
int i = 0;
int nCfgs = This->adapter->nCfgs;
- TRACE("ColorFormat=%s, DepthStencilFormat=%s, auxBuffers=%d, numSamples=%d, pbuffer=%d, findCompatible=%d\n",
+ TRACE("ColorFormat=%s, DepthStencilFormat=%s, auxBuffers=%d, numSamples=%d, findCompatible=%d\n",
debug_d3dformat(color_format_desc->format), debug_d3dformat(ds_format_desc->format),
- auxBuffers, numSamples, pbuffer, findCompatible);
+ auxBuffers, numSamples, findCompatible);
if (!getColorBits(color_format_desc, &redBits, &greenBits, &blueBits, &alphaBits, &colorBits))
{
@@ -1059,18 +1049,14 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc,
if(cfg->iPixelType != WGL_TYPE_RGBA_ARB)
continue;
- /* In window mode (!pbuffer) we need a window drawable format and double buffering. */
- if(!pbuffer && !(cfg->windowDrawable && cfg->doubleBuffer))
+ /* In window mode we need a window drawable format and double buffering. */
+ if(!(cfg->windowDrawable && cfg->doubleBuffer))
continue;
/* We like to have aux buffers in backbuffer mode */
if(auxBuffers && !cfg->auxBuffers && matches[matchtry].require_aux)
continue;
- /* In pbuffer-mode we need a pbuffer-capable format but we don't want double buffering */
- if(pbuffer && (!cfg->pbufferDrawable || cfg->doubleBuffer))
- continue;
-
if(matches[matchtry].exact_color) {
if(cfg->redSize != redBits)
continue;
@@ -1167,173 +1153,143 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc,
/*****************************************************************************
* context_create
*
- * Creates a new context for a window, or a pbuffer context.
+ * Creates a new context.
*
* * Params:
* This: Device to activate the context for
* 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
*
*****************************************************************************/
struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target,
- HWND win_handle, BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *pPresentParms)
+ HWND win_handle, const WINED3DPRESENT_PARAMETERS *pPresentParms)
{
const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
+ const struct GlPixelFormatDesc *color_format_desc;
+ const struct GlPixelFormatDesc *ds_format_desc;
struct wined3d_context *ret = NULL;
- HPBUFFERARB pbuffer = NULL;
+ PIXELFORMATDESCRIPTOR pfd;
+ BOOL auxBuffers = FALSE;
+ int numSamples = 0;
+ int pixel_format;
unsigned int s;
HGLRC ctx;
HDC hdc;
+ int res;
- TRACE("(%p): Creating a %s context for render target %p\n", This, create_pbuffer ? "offscreen" : "onscreen", target);
-
- if(create_pbuffer) {
- HDC hdc_parent = GetDC(win_handle);
- int iPixelFormat = 0;
+ TRACE("device %p, target %p, window %p, present parameters %p.\n",
+ This, target, win_handle, pPresentParms);
- IWineD3DSurface *StencilSurface = This->stencilBufferTarget;
- const struct GlPixelFormatDesc *ds_format_desc = StencilSurface
- ? ((IWineD3DSurfaceImpl *)StencilSurface)->resource.format_desc
- : getFormatDescEntry(WINED3DFMT_UNKNOWN, &This->adapter->gl_info);
+ if (!(hdc = GetDC(win_handle)))
+ {
+ ERR("Failed to retrieve a device context.\n");
+ goto out;
+ }
- /* Try to find a pixel format with pbuffer support. */
- iPixelFormat = WineD3D_ChoosePixelFormat(This, hdc_parent, target->resource.format_desc,
- ds_format_desc, FALSE /* auxBuffers */, 0 /* numSamples */, TRUE /* PBUFFER */,
- FALSE /* findCompatible */);
- if(!iPixelFormat) {
- TRACE("Trying to locate a compatible pixel format because an exact match failed.\n");
+ ds_format_desc = getFormatDescEntry(WINED3DFMT_UNKNOWN, gl_info);
+ color_format_desc = target->resource.format_desc;
- /* For some reason we weren't able to find a format, try to find something instead of crashing.
- * A reason for failure could have been wglChoosePixelFormatARB strictness. */
- iPixelFormat = WineD3D_ChoosePixelFormat(This, hdc_parent, target->resource.format_desc,
- ds_format_desc, FALSE /* auxBuffer */, 0 /* numSamples */, TRUE /* PBUFFER */,
- TRUE /* findCompatible */);
- }
+ /* In case of ORM_BACKBUFFER, make sure to request an alpha component for
+ * X4R4G4B4/X8R8G8B8 as we might need it for the backbuffer. */
+ if (wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER)
+ {
+ auxBuffers = TRUE;
- /* This shouldn't happen as ChoosePixelFormat always returns something */
- if(!iPixelFormat) {
- ERR("Unable to locate a pixel format for a pbuffer\n");
- ReleaseDC(win_handle, hdc_parent);
- goto out;
- }
+ if (color_format_desc->format == WINED3DFMT_B4G4R4X4_UNORM)
+ color_format_desc = getFormatDescEntry(WINED3DFMT_B4G4R4A4_UNORM, &This->adapter->gl_info);
+ else if (color_format_desc->format == WINED3DFMT_B8G8R8X8_UNORM)
+ color_format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, &This->adapter->gl_info);
+ }
- TRACE("Creating a pBuffer drawable for the new context\n");
- pbuffer = GL_EXTCALL(wglCreatePbufferARB(hdc_parent, iPixelFormat, target->currentDesc.Width, target->currentDesc.Height, 0));
- if(!pbuffer) {
- ERR("Cannot create a pbuffer\n");
- ReleaseDC(win_handle, hdc_parent);
- goto out;
- }
+ /* DirectDraw supports 8bit paletted render targets and these are used by
+ * old games like Starcraft and C&C. Most modern hardware doesn't support
+ * 8bit natively so we perform some form of 8bit -> 32bit conversion. The
+ * conversion (ab)uses the alpha component for storing the palette index.
+ * For this reason we require a format with 8bit alpha, so request
+ * A8R8G8B8. */
+ if (color_format_desc->format == WINED3DFMT_P8_UINT)
+ color_format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, &This->adapter->gl_info);
- /* In WGL a pbuffer is 'wrapped' inside a HDC to 'fool' wglMakeCurrent */
- hdc = GL_EXTCALL(wglGetPbufferDCARB(pbuffer));
- if(!hdc) {
- ERR("Cannot get a HDC for pbuffer (%p)\n", pbuffer);
- GL_EXTCALL(wglDestroyPbufferARB(pbuffer));
- ReleaseDC(win_handle, hdc_parent);
- goto out;
- }
- ReleaseDC(win_handle, hdc_parent);
- } else {
- PIXELFORMATDESCRIPTOR pfd;
- int iPixelFormat;
- int res;
- const struct GlPixelFormatDesc *color_format_desc = target->resource.format_desc;
- const struct GlPixelFormatDesc *ds_format_desc = getFormatDescEntry(WINED3DFMT_UNKNOWN,
- &This->adapter->gl_info);
- BOOL auxBuffers = FALSE;
- int numSamples = 0;
-
- hdc = GetDC(win_handle);
- if(hdc == NULL) {
- ERR("Cannot retrieve a device context!\n");
- goto out;
- }
-
- /* In case of ORM_BACKBUFFER, make sure to request an alpha component for X4R4G4B4/X8R8G8B8 as we might need it for the backbuffer. */
- if(wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER) {
- auxBuffers = TRUE;
-
- if (color_format_desc->format == WINED3DFMT_B4G4R4X4_UNORM)
- color_format_desc = getFormatDescEntry(WINED3DFMT_B4G4R4A4_UNORM, &This->adapter->gl_info);
- else if (color_format_desc->format == WINED3DFMT_B8G8R8X8_UNORM)
- color_format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, &This->adapter->gl_info);
- }
-
- /* DirectDraw supports 8bit paletted render targets and these are used by old games like Starcraft and C&C.
- * Most modern hardware doesn't support 8bit natively so we perform some form of 8bit -> 32bit conversion.
- * The conversion (ab)uses the alpha component for storing the palette index. For this reason we require
- * a format with 8bit alpha, so request A8R8G8B8. */
- if (color_format_desc->format == WINED3DFMT_P8_UINT)
- color_format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, &This->adapter->gl_info);
+ /* 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("Auto depth stencil enabled, using format %s.\n",
+ debug_d3dformat(pPresentParms->AutoDepthStencilFormat));
+ ds_format_desc = getFormatDescEntry(pPresentParms->AutoDepthStencilFormat, &This->adapter->gl_info);
+ }
- /* 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));
- ds_format_desc = getFormatDescEntry(pPresentParms->AutoDepthStencilFormat, &This->adapter->gl_info);
+ /* D3D only allows multisampling when SwapEffect is set to WINED3DSWAPEFFECT_DISCARD. */
+ if (pPresentParms->MultiSampleType && (pPresentParms->SwapEffect == WINED3DSWAPEFFECT_DISCARD))
+ {
+ if (!gl_info->supported[ARB_MULTISAMPLE])
+ WARN("The application is requesting multisampling without support.\n");
+ else
+ {
+ TRACE("Requesting multisample type %#x.\n", pPresentParms->MultiSampleType);
+ numSamples = pPresentParms->MultiSampleType;
}
+ }
- /* D3D only allows multisampling when SwapEffect is set to WINED3DSWAPEFFECT_DISCARD */
- if(pPresentParms->MultiSampleType && (pPresentParms->SwapEffect == WINED3DSWAPEFFECT_DISCARD)) {
- if (!gl_info->supported[ARB_MULTISAMPLE])
- ERR("The program is requesting multisampling without support!\n");
- else
- {
- TRACE("Requesting multisample type %#x.\n", pPresentParms->MultiSampleType);
- numSamples = pPresentParms->MultiSampleType;
- }
- }
+ /* Try to find a pixel format which matches our requirements. */
+ pixel_format = WineD3D_ChoosePixelFormat(This, hdc, color_format_desc, ds_format_desc,
+ auxBuffers, numSamples, FALSE /* findCompatible */);
- /* Try to find a pixel format which matches our requirements */
- iPixelFormat = WineD3D_ChoosePixelFormat(This, hdc, color_format_desc, ds_format_desc,
- auxBuffers, numSamples, FALSE /* PBUFFER */, FALSE /* findCompatible */);
+ /* Try to locate a compatible format if we weren't able to find anything. */
+ if (!pixel_format)
+ {
+ TRACE("Trying to locate a compatible pixel format because an exact match failed.\n");
+ pixel_format = WineD3D_ChoosePixelFormat(This, hdc, color_format_desc, ds_format_desc,
+ auxBuffers, 0 /* numSamples */, TRUE /* findCompatible */);
+ }
- /* Try to locate a compatible format if we weren't able to find anything */
- if(!iPixelFormat) {
- TRACE("Trying to locate a compatible pixel format because an exact match failed.\n");
- iPixelFormat = WineD3D_ChoosePixelFormat(This, hdc, color_format_desc, ds_format_desc,
- auxBuffers, 0 /* numSamples */, FALSE /* PBUFFER */, TRUE /* findCompatible */ );
- }
+ /* If we still don't have a pixel format, something is very wrong as ChoosePixelFormat barely fails */
+ if (!pixel_format)
+ {
+ ERR("Can't find a suitable pixel format.\n");
+ return NULL;
+ }
- /* If we still don't have a pixel format, something is very wrong as ChoosePixelFormat barely fails */
- if(!iPixelFormat) {
- ERR("Can't find a suitable iPixelFormat\n");
- return NULL;
- }
+ DescribePixelFormat(hdc, pixel_format, sizeof(pfd), &pfd);
+ res = SetPixelFormat(hdc, pixel_format, NULL);
+ if (!res)
+ {
+ int oldPixelFormat = GetPixelFormat(hdc);
- DescribePixelFormat(hdc, iPixelFormat, sizeof(pfd), &pfd);
- res = SetPixelFormat(hdc, iPixelFormat, NULL);
- if(!res) {
- int oldPixelFormat = GetPixelFormat(hdc);
+ /* By default WGL doesn't allow pixel format adjustments but we need
+ * it here. For this reason there is a WINE-specific wglSetPixelFormat
+ * which allows you to set the pixel format multiple times. Only use
+ * it when it is really needed. */
- /* By default WGL doesn't allow pixel format adjustments but we need it here.
- * For this reason there is a WINE-specific wglSetPixelFormat which allows you to
- * set the pixel format multiple times. Only use it when it is really needed. */
+ if (oldPixelFormat == pixel_format)
+ {
+ /* We don't have to do anything as the formats are the same :) */
+ }
+ else if (oldPixelFormat && gl_info->supported[WGL_WINE_PIXEL_FORMAT_PASSTHROUGH])
+ {
+ res = GL_EXTCALL(wglSetPixelFormatWINE(hdc, pixel_format, NULL));
- if(oldPixelFormat == iPixelFormat) {
- /* We don't have to do anything as the formats are the same :) */
- }
- else if (oldPixelFormat && gl_info->supported[WGL_WINE_PIXEL_FORMAT_PASSTHROUGH])
+ if (!res)
{
- res = GL_EXTCALL(wglSetPixelFormatWINE(hdc, iPixelFormat, NULL));
-
- if(!res) {
- ERR("wglSetPixelFormatWINE failed on HDC=%p for iPixelFormat=%d\n", hdc, iPixelFormat);
- return NULL;
- }
- } else if(oldPixelFormat) {
- /* OpenGL doesn't allow pixel format adjustments. Print an error and continue using the old format.
- * There's a big chance that the old format works although with a performance hit and perhaps rendering errors. */
- ERR("HDC=%p is already set to iPixelFormat=%d and OpenGL doesn't allow changes!\n", hdc, oldPixelFormat);
- } else {
- ERR("SetPixelFormat failed on HDC=%p for iPixelFormat=%d\n", hdc, iPixelFormat);
+ ERR("wglSetPixelFormatWINE failed on HDC %p for pixel_format %d.\n", hdc, pixel_format);
return NULL;
}
}
+ else if (oldPixelFormat)
+ {
+ /* OpenGL doesn't allow pixel format adjustments. Print an error
+ * and continue using the old format. There's a big chance that
+ * the old format works although with a performance hit and perhaps
+ * rendering errors. */
+ ERR("HDC %p is already set to pixel_format %d and OpenGL doesn't allow changes.\n", hdc, oldPixelFormat);
+ }
+ else
+ {
+ ERR("SetPixelFormat failed on HDC %p for pixel format %d.\n", hdc, pixel_format);
+ return NULL;
+ }
}
ctx = pwglCreateContext(hdc);
@@ -1349,13 +1305,9 @@ struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurface
if(!ctx) {
ERR("Failed to create a WGL context\n");
- if(create_pbuffer) {
- GL_EXTCALL(wglReleasePbufferDCARB(pbuffer, hdc));
- GL_EXTCALL(wglDestroyPbufferARB(pbuffer));
- }
goto out;
}
- ret = AddContextToArray(This, win_handle, hdc, ctx, pbuffer);
+ ret = AddContextToArray(This, win_handle, hdc, ctx);
if(!ret) {
ERR("Failed to add the newly created context to the context list\n");
if (!pwglDeleteContext(ctx))
@@ -1363,10 +1315,6 @@ struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurface
DWORD err = GetLastError();
ERR("wglDeleteContext(%p) failed, last error %#x.\n", ctx, err);
}
- if(create_pbuffer) {
- GL_EXTCALL(wglReleasePbufferDCARB(pbuffer, hdc));
- GL_EXTCALL(wglDestroyPbufferARB(pbuffer));
- }
goto out;
}
ret->valid = 1;
@@ -1922,78 +1870,26 @@ static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSur
old_render_offscreen = context->render_offscreen;
context->render_offscreen = surface_is_offscreen(target);
- /* The context != This->activeContext will catch a NOP context change. This can occur
- * if we are switching back to swapchain rendering in case of FBO or Back Buffer offscreen
- * rendering. No context change is needed in that case
- */
-
- if(wined3d_settings.offscreen_rendering_mode == ORM_PBUFFER) {
- if(This->pbufferContext && tid == This->pbufferContext->tid) {
- This->pbufferContext->tid = 0;
- }
- }
IWineD3DSwapChain_Release(swapchain);
}
else
{
TRACE("Rendering offscreen\n");
-retry:
- if (wined3d_settings.offscreen_rendering_mode == ORM_PBUFFER)
+ /* Stay with the currently active context. */
+ if (current_context && ((IWineD3DSurfaceImpl *)current_context->surface)->resource.device == This)
{
- IWineD3DSurfaceImpl *targetimpl = (IWineD3DSurfaceImpl *)target;
- if (!This->pbufferContext
- || This->pbufferWidth < targetimpl->currentDesc.Width
- || This->pbufferHeight < targetimpl->currentDesc.Height)
- {
- if (This->pbufferContext) context_destroy(This, This->pbufferContext);
-
- /* The display is irrelevant here, the window is 0. But
- * context_create() needs a valid X connection. Create the context
- * on the same server as the primary swapchain. The primary
- * swapchain is exists at this point. */
- This->pbufferContext = context_create(This, targetimpl,
- ((IWineD3DSwapChainImpl *)This->swapchains[0])->context[0]->win_handle,
- TRUE /* pbuffer */, &((IWineD3DSwapChainImpl *)This->swapchains[0])->presentParms);
- This->pbufferWidth = targetimpl->currentDesc.Width;
- This->pbufferHeight = targetimpl->currentDesc.Height;
- if (This->pbufferContext) context_release(This->pbufferContext);
- }
-
- if (This->pbufferContext)
- {
- if (This->pbufferContext->tid && This->pbufferContext->tid != tid)
- {
- FIXME("The PBuffer context is only supported for one thread for now!\n");
- }
- This->pbufferContext->tid = tid;
- context = This->pbufferContext;
- }
- else
- {
- ERR("Failed to create a buffer context and drawable, falling back to back buffer offscreen rendering.\n");
- wined3d_settings.offscreen_rendering_mode = ORM_BACKBUFFER;
- goto retry;
- }
+ context = current_context;
}
else
{
- /* Stay with the currently active context. */
- if (current_context
- && ((IWineD3DSurfaceImpl *)current_context->surface)->resource.device == This)
- {
- context = current_context;
- }
- else
- {
- /* This may happen if the app jumps straight into offscreen rendering
- * Start using the context of the primary swapchain. tid == 0 is no problem
- * for findThreadContextForSwapChain.
- *
- * Can also happen on thread switches - in that case findThreadContextForSwapChain
- * is perfect to call. */
- context = findThreadContextForSwapChain(This->swapchains[0], tid);
- }
+ /* This may happen if the app jumps straight into offscreen rendering
+ * Start using the context of the primary swapchain. tid == 0 is no problem
+ * for findThreadContextForSwapChain.
+ *
+ * Can also happen on thread switches - in that case findThreadContextForSwapChain
+ * is perfect to call. */
+ context = findThreadContextForSwapChain(This->swapchains[0], tid);
}
old_render_offscreen = context->render_offscreen;
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 6682aa4..2747517 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1583,10 +1583,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
This->offscreenBuffer = GL_COLOR_ATTACHMENT0;
break;
- case ORM_PBUFFER:
- This->offscreenBuffer = GL_BACK;
- break;
-
case ORM_BACKBUFFER:
{
if (context_get_current()->aux_buffers > 0)
@@ -1720,9 +1716,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface,
}
}
- /* Delete the pbuffer context if there is any */
- if(This->pbufferContext) context_destroy(This, This->pbufferContext);
-
/* Delete the mouse cursor texture */
if(This->cursorTexture) {
ENTER_GL();
@@ -6387,7 +6380,7 @@ HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChain *
}
target = (IWineD3DSurfaceImpl *)(swapchain->backBuffer ? swapchain->backBuffer[0] : swapchain->frontBuffer);
- context = context_create(This, target, swapchain->win_handle, FALSE, &swapchain->presentParms);
+ context = context_create(This, target, swapchain->win_handle, &swapchain->presentParms);
if (!context)
{
WARN("Failed to create context.\n");
@@ -7090,14 +7083,6 @@ void IWineD3DDeviceImpl_MarkStateDirty(IWineD3DDeviceImpl *This, DWORD state) {
}
}
-void get_drawable_size_pbuffer(struct wined3d_context *context, UINT *width, UINT *height)
-{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->current_rt)->resource.device;
- /* The drawable size of a pbuffer render target is the current pbuffer size. */
- *width = device->pbufferWidth;
- *height = device->pbufferHeight;
-}
-
void get_drawable_size_fbo(struct wined3d_context *context, UINT *width, UINT *height)
{
IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)context->current_rt;
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index abed2b6..a79eda6 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2522,10 +2522,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter)
ThisExtn[len] = '\0';
TRACE_(d3d_caps)("- %s\n", debugstr_a(ThisExtn));
- if (!strcmp(ThisExtn, "WGL_ARB_pbuffer")) {
- gl_info->supported[WGL_ARB_PBUFFER] = TRUE;
- TRACE_(d3d_caps)("FOUND: WGL_ARB_pbuffer support\n");
- }
if (!strcmp(ThisExtn, "WGL_ARB_pixel_format")) {
gl_info->supported[WGL_ARB_PIXEL_FORMAT] = TRUE;
TRACE_(d3d_caps)("FOUND: WGL_ARB_pixel_format support\n");
@@ -3204,23 +3200,9 @@ static BOOL CheckRenderTargetCapability(struct wined3d_adapter *adapter,
return TRUE;
}
}
- } else if(wined3d_settings.offscreen_rendering_mode == ORM_PBUFFER) {
- /* We can probably use this function in FBO mode too on some drivers to get some basic indication of the capabilities. */
- WineD3D_PixelFormat *cfgs = adapter->cfgs;
- int it;
-
- /* Check if there is a WGL pixel format matching the requirements, the pixel format should also be usable with pbuffers */
- for (it = 0; it < adapter->nCfgs; ++it)
- {
- if (cfgs[it].pbufferDrawable && IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info,
- &cfgs[it], check_format_desc))
- {
- TRACE_(d3d_caps)("iPixelFormat=%d is compatible with CheckFormat=%s\n",
- cfgs[it].iPixelFormat, debug_d3dformat(check_format_desc->format));
- return TRUE;
- }
- }
- } else if(wined3d_settings.offscreen_rendering_mode == ORM_FBO){
+ }
+ else if(wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
/* For now return TRUE for FBOs until we have some proper checks.
* Note that this function will only be called when the format is around for texturing. */
return TRUE;
@@ -5120,17 +5102,6 @@ BOOL InitAdapters(IWineD3DImpl *This)
cfgs->doubleBuffer = values[9];
cfgs->auxBuffers = values[10];
- cfgs->pbufferDrawable = FALSE;
- /* Check for pbuffer support when it is around as
- * wglGetPixelFormatAttribiv fails for unknown attributes. */
- if (gl_info->supported[WGL_ARB_PBUFFER])
- {
- int attrib = WGL_DRAW_TO_PBUFFER_ARB;
- int value;
- if(GL_EXTCALL(wglGetPixelFormatAttribivARB(hdc, iPixelFormat, 0, 1, &attrib, &value)))
- cfgs->pbufferDrawable = value;
- }
-
cfgs->numSamples = 0;
/* Check multisample support */
if (gl_info->supported[ARB_MULTISAMPLE])
@@ -5145,7 +5116,11 @@ BOOL InitAdapters(IWineD3DImpl *This)
}
}
- TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, depth=%d, stencil=%d, samples=%d, windowDrawable=%d, pbufferDrawable=%d\n", cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer, cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize, cfgs->depthSize, cfgs->stencilSize, cfgs->numSamples, cfgs->windowDrawable, cfgs->pbufferDrawable);
+ TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, "
+ "depth=%d, stencil=%d, samples=%d, windowDrawable=%d\n",
+ cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer,
+ cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize,
+ cfgs->depthSize, cfgs->stencilSize, cfgs->numSamples, cfgs->windowDrawable);
cfgs++;
}
}
@@ -5182,14 +5157,17 @@ BOOL InitAdapters(IWineD3DImpl *This)
cfgs->colorSize = ppfd.cColorBits;
cfgs->depthSize = ppfd.cDepthBits;
cfgs->stencilSize = ppfd.cStencilBits;
- cfgs->pbufferDrawable = 0;
cfgs->windowDrawable = (ppfd.dwFlags & PFD_DRAW_TO_WINDOW) ? 1 : 0;
cfgs->iPixelType = (ppfd.iPixelType == PFD_TYPE_RGBA) ? WGL_TYPE_RGBA_ARB : WGL_TYPE_COLORINDEX_ARB;
cfgs->doubleBuffer = (ppfd.dwFlags & PFD_DOUBLEBUFFER) ? 1 : 0;
cfgs->auxBuffers = ppfd.cAuxBuffers;
cfgs->numSamples = 0;
- TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, depth=%d, stencil=%d, windowDrawable=%d, pbufferDrawable=%d\n", cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer, cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize, cfgs->depthSize, cfgs->stencilSize, cfgs->windowDrawable, cfgs->pbufferDrawable);
+ TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, "
+ "depth=%d, stencil=%d, windowDrawable=%d\n",
+ cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer,
+ cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize,
+ cfgs->depthSize, cfgs->stencilSize, cfgs->windowDrawable);
cfgs++;
adapter->nCfgs++;
}
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index d17d35c..d6604fa 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -4306,7 +4306,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) {
if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) {
switch(wined3d_settings.offscreen_rendering_mode) {
case ORM_FBO: This->get_drawable_size = get_drawable_size_fbo; break;
- case ORM_PBUFFER: This->get_drawable_size = get_drawable_size_pbuffer; break;
case ORM_BACKBUFFER: This->get_drawable_size = get_drawable_size_backbuffer; break;
}
}
@@ -5107,7 +5106,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_SetContainer(IWineD3DSurface *iface, I
} else if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) {
switch(wined3d_settings.offscreen_rendering_mode) {
case ORM_FBO: This->get_drawable_size = get_drawable_size_fbo; break;
- case ORM_PBUFFER: This->get_drawable_size = get_drawable_size_pbuffer; break;
case ORM_BACKBUFFER: This->get_drawable_size = get_drawable_size_backbuffer; break;
}
}
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index cbdb961..c67ec1b 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -547,7 +547,7 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_SetDestWindowOverride(IWineD3DSwapCh
context_destroy(This->device, This->context[0]);
This->context[0] = context_create(This->device, (IWineD3DSurfaceImpl *)This->frontBuffer,
- This->win_handle, FALSE /* pbuffer */, &This->presentParms);
+ This->win_handle, &This->presentParms);
context_release(This->context[0]);
IWineD3DSurface_LockRect(This->backBuffer[0], &r, NULL, WINED3DLOCK_DISCARD);
@@ -817,7 +817,7 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
if (surface_type == SURFACE_OPENGL)
{
swapchain->context[0] = context_create(device, (IWineD3DSurfaceImpl *)swapchain->frontBuffer,
- window, FALSE /* pbuffer */, present_parameters);
+ window, present_parameters);
if (!swapchain->context[0])
{
WARN("Failed to create context.\n");
@@ -936,7 +936,7 @@ struct wined3d_context *swapchain_create_context_for_thread(IWineD3DSwapChain *i
TRACE("Creating a new context for swapchain %p, thread %d\n", This, GetCurrentThreadId());
ctx = context_create(This->device, (IWineD3DSurfaceImpl *)This->frontBuffer,
- This->context[0]->win_handle, FALSE /* pbuffer */, &This->presentParms);
+ This->context[0]->win_handle, &This->presentParms);
if (!ctx)
{
ERR("Failed to create a new context for the swapchain\n");
diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h
index f8097d6..9b46dd7 100644
--- a/dlls/wined3d/wined3d_gl.h
+++ b/dlls/wined3d/wined3d_gl.h
@@ -1829,7 +1829,6 @@ typedef enum wined3d_gl_extension
SGIS_GENERATE_MIPMAP,
SGI_VIDEO_SYNC,
/* WGL extensions */
- WGL_ARB_PBUFFER,
WGL_ARB_PIXEL_FORMAT,
WGL_WINE_PIXEL_FORMAT_PASSTHROUGH,
/* Internally used */
@@ -3680,26 +3679,6 @@ typedef const char *(WINAPI *WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc);
#define WGL_SAMPLES_ARB 0x2042
#endif
-/* WGL_ARB_pbuffer */
-#ifndef WGL_ARB_pbuffer
-#define WGL_ARB_pbuffer 1
-#define WGL_DRAW_TO_PBUFFER_ARB 0x202d
-#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202e
-#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202f
-#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
-#define WGL_PBUFFER_LARGEST_ARB 0x2033
-#define WGL_PBUFFER_WIDTH_ARB 0x2034
-#define WGL_PBUFFER_HEIGHT_ARB 0x2035
-#define WGL_PBUFFER_LOST_ARB 0x2036
-#endif
-DECLARE_HANDLE(HPBUFFERARB);
-typedef HPBUFFERARB (WINAPI *WINED3D_PFNWGLCREATEPBUFFERARBPROC)(HDC hDC, int iPixelFormat,
- int iWidth, int iHeight, const int *piAttribList);
-typedef HDC (WINAPI *WINED3D_PFNWGLGETPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer);
-typedef int (WINAPI *WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer, HDC hDC);
-typedef BOOL (WINAPI *WINED3D_PFNWGLDESTROYPBUFFERARBPROC)(HPBUFFERARB hPbuffer);
-typedef BOOL (WINAPI *WINED3D_PFNWGLQUERYPBUFFERARBPROC)(HPBUFFERARB hPbuffer, int iAttribute, int *piValue);
-
/* WGL_ARB_pixel_format */
#ifndef WGL_ARB_pixel_format
#define WGL_ARB_pixel_format 1
@@ -4489,11 +4468,6 @@ typedef BOOL (WINAPI *WINED3D_PFNWGLSETPIXELFORMATWINE)(HDC hdc, int iPixelForma
USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC, wglGetPixelFormatAttribivARB, 0, NULL) \
USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC, wglGetPixelFormatAttribfvARB, 0, NULL) \
USE_GL_FUNC(WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC, wglChoosePixelFormatARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLCREATEPBUFFERARBPROC, wglCreatePbufferARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLGETPBUFFERDCARBPROC, wglGetPbufferDCARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC, wglReleasePbufferDCARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLDESTROYPBUFFERARBPROC, wglDestroyPbufferARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLQUERYPBUFFERARBPROC, wglQueryPbufferARB, 0, NULL) \
USE_GL_FUNC(WINED3D_PFNWGLSETPIXELFORMATWINE, wglSetPixelFormatWINE, 0, NULL)
#endif /* __WINE_WINED3D_GL */
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index 39416e1..e226749 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -236,11 +236,6 @@ static BOOL wined3d_init(HINSTANCE hInstDLL)
TRACE("Using the backbuffer for offscreen rendering\n");
wined3d_settings.offscreen_rendering_mode = ORM_BACKBUFFER;
}
- else if (!strcmp(buffer,"pbuffer"))
- {
- TRACE("Using PBuffers for offscreen rendering\n");
- wined3d_settings.offscreen_rendering_mode = ORM_PBUFFER;
- }
else if (!strcmp(buffer,"fbo"))
{
TRACE("Using FBOs for offscreen rendering\n");
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 1d5cd97..3a54fe2 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -234,8 +234,7 @@ static inline float float_24_to_32(DWORD in)
#define VBO_HW 1
#define ORM_BACKBUFFER 0
-#define ORM_PBUFFER 1
-#define ORM_FBO 2
+#define ORM_FBO 1
#define SHADER_ARB 1
#define SHADER_GLSL 2
@@ -1089,7 +1088,6 @@ struct wined3d_context
HGLRC glCtx;
HWND win_handle;
HDC hdc;
- HPBUFFERARB pbuffer;
GLint aux_buffers;
/* FBOs */
@@ -1201,8 +1199,8 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context,
GLenum fbo_target, IWineD3DSurface *depth_stencil, BOOL use_render_buffer) DECLSPEC_HIDDEN;
void context_attach_surface_fbo(const struct wined3d_context *context,
GLenum fbo_target, DWORD idx, IWineD3DSurface *surface) DECLSPEC_HIDDEN;
-struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, HWND win,
- BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *present_parameters) DECLSPEC_HIDDEN;
+struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target,
+ HWND win, const WINED3DPRESENT_PARAMETERS *present_parameters) DECLSPEC_HIDDEN;
void context_destroy(IWineD3DDeviceImpl *This, struct wined3d_context *context) DECLSPEC_HIDDEN;
void context_free_event_query(struct wined3d_event_query *query) DECLSPEC_HIDDEN;
void context_free_occlusion_query(struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN;
@@ -1251,7 +1249,6 @@ typedef struct WineD3D_PixelFormat
int redSize, greenSize, blueSize, alphaSize, colorSize;
int depthSize, stencilSize;
BOOL windowDrawable;
- BOOL pbufferDrawable;
BOOL doubleBuffer;
int auxBuffers;
int numSamples;
@@ -1705,8 +1702,6 @@ struct IWineD3DDeviceImpl
/* Context management */
struct wined3d_context **contexts;
UINT numContexts;
- struct wined3d_context *pbufferContext; /* The context that has a pbuffer as drawable */
- DWORD pbufferWidth, pbufferHeight; /* Size of the buffer drawable */
/* High level patch management */
#define PATCHMAP_SIZE 43
@@ -2153,7 +2148,6 @@ const void *WINAPI IWineD3DBaseSurfaceImpl_GetData(IWineD3DSurface *iface) DECLS
void get_drawable_size_swapchain(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;
void get_drawable_size_backbuffer(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;
-void get_drawable_size_pbuffer(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;
void get_drawable_size_fbo(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;
void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back) DECLSPEC_HIDDEN;
--
1.6.4.4
More information about the wine-patches
mailing list