wined3d: Handle destruction of a context's current render target.
This commit is contained in:
parent
028b763f2f
commit
0047c55e86
|
@ -594,6 +594,8 @@ void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource
|
||||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||||
struct fbo_entry *entry, *entry2;
|
struct fbo_entry *entry, *entry2;
|
||||||
|
|
||||||
|
if (context->current_rt == (IWineD3DSurface *)resource) context->current_rt = NULL;
|
||||||
|
|
||||||
ENTER_GL();
|
ENTER_GL();
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry)
|
LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry)
|
||||||
|
@ -1716,7 +1718,6 @@ static inline WineD3DContext *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurf
|
||||||
struct WineD3DContext *current_context = context_get_current();
|
struct WineD3DContext *current_context = context_get_current();
|
||||||
BOOL oldRenderOffscreen = This->render_offscreen;
|
BOOL oldRenderOffscreen = This->render_offscreen;
|
||||||
const struct StateEntry *StateTable = This->StateTable;
|
const struct StateEntry *StateTable = This->StateTable;
|
||||||
const struct GlPixelFormatDesc *old, *new;
|
|
||||||
struct WineD3DContext *context;
|
struct WineD3DContext *context;
|
||||||
|
|
||||||
if (current_context && current_context->destroyed) current_context = NULL;
|
if (current_context && current_context->destroyed) current_context = NULL;
|
||||||
|
@ -1724,6 +1725,7 @@ static inline WineD3DContext *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurf
|
||||||
if (!target)
|
if (!target)
|
||||||
{
|
{
|
||||||
if (current_context
|
if (current_context
|
||||||
|
&& current_context->current_rt
|
||||||
&& ((IWineD3DSurfaceImpl *)current_context->surface)->resource.wineD3DDevice == This)
|
&& ((IWineD3DSurfaceImpl *)current_context->surface)->resource.wineD3DDevice == This)
|
||||||
{
|
{
|
||||||
target = current_context->current_rt;
|
target = current_context->current_rt;
|
||||||
|
@ -1833,15 +1835,23 @@ retry:
|
||||||
|
|
||||||
/* To compensate the lack of format switching with some offscreen rendering methods and on onscreen buffers
|
/* To compensate the lack of format switching with some offscreen rendering methods and on onscreen buffers
|
||||||
* the alpha blend state changes with different render target formats. */
|
* the alpha blend state changes with different render target formats. */
|
||||||
old = ((IWineD3DSurfaceImpl *)context->current_rt)->resource.format_desc;
|
if (!context->current_rt)
|
||||||
new = ((IWineD3DSurfaceImpl *)target)->resource.format_desc;
|
|
||||||
if (old->format != new->format)
|
|
||||||
{
|
{
|
||||||
/* Disable blending when the alpha mask has changed and when a format doesn't support blending. */
|
Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
|
||||||
if ((old->alpha_mask && !new->alpha_mask) || (!old->alpha_mask && new->alpha_mask)
|
}
|
||||||
|| !(new->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING))
|
else
|
||||||
|
{
|
||||||
|
const struct GlPixelFormatDesc *old = ((IWineD3DSurfaceImpl *)context->current_rt)->resource.format_desc;
|
||||||
|
const struct GlPixelFormatDesc *new = ((IWineD3DSurfaceImpl *)target)->resource.format_desc;
|
||||||
|
|
||||||
|
if (old->format != new->format)
|
||||||
{
|
{
|
||||||
Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
|
/* Disable blending when the alpha mask has changed and when a format doesn't support blending. */
|
||||||
|
if ((old->alpha_mask && !new->alpha_mask) || (!old->alpha_mask && new->alpha_mask)
|
||||||
|
|| !(new->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING))
|
||||||
|
{
|
||||||
|
Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1871,7 +1881,7 @@ retry:
|
||||||
* After that, the outer ActivateContext(which calls PreLoad) can activate the new
|
* After that, the outer ActivateContext(which calls PreLoad) can activate the new
|
||||||
* target for the new thread
|
* target for the new thread
|
||||||
*/
|
*/
|
||||||
if (readTexture && context->current_rt != target)
|
if (readTexture && context->current_rt && context->current_rt != target)
|
||||||
{
|
{
|
||||||
BOOL oldInDraw = This->isInDraw;
|
BOOL oldInDraw = This->isInDraw;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue