Commit 03dc612c authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

wined3d: Simply pass an IWineD3DSurfaceImpl pointer to surface_is_offscreen().

parent efb3993a
...@@ -1353,7 +1353,7 @@ struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3 ...@@ -1353,7 +1353,7 @@ struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3
ret->current_rt = (IWineD3DSurface *)target; ret->current_rt = (IWineD3DSurface *)target;
ret->tid = GetCurrentThreadId(); ret->tid = GetCurrentThreadId();
ret->render_offscreen = surface_is_offscreen((IWineD3DSurface *) target); ret->render_offscreen = surface_is_offscreen(target);
ret->draw_buffer_dirty = TRUE; ret->draw_buffer_dirty = TRUE;
ret->valid = 1; ret->valid = 1;
...@@ -1881,7 +1881,7 @@ static void context_apply_draw_buffer(struct wined3d_context *context, BOOL blit ...@@ -1881,7 +1881,7 @@ static void context_apply_draw_buffer(struct wined3d_context *context, BOOL blit
IWineD3DDeviceImpl *device; IWineD3DDeviceImpl *device;
device = ((IWineD3DSurfaceImpl *)rt)->resource.device; device = ((IWineD3DSurfaceImpl *)rt)->resource.device;
if (!surface_is_offscreen(rt)) if (!surface_is_offscreen((IWineD3DSurfaceImpl *)rt))
{ {
ENTER_GL(); ENTER_GL();
glDrawBuffer(surface_get_gl_buffer(rt)); glDrawBuffer(surface_get_gl_buffer(rt));
...@@ -2099,7 +2099,7 @@ static void context_setup_target(IWineD3DDeviceImpl *device, struct wined3d_cont ...@@ -2099,7 +2099,7 @@ static void context_setup_target(IWineD3DDeviceImpl *device, struct wined3d_cont
if (!target) return; if (!target) return;
else if (context->current_rt == target) return; else if (context->current_rt == target) return;
render_offscreen = surface_is_offscreen(target); render_offscreen = surface_is_offscreen((IWineD3DSurfaceImpl *)target);
context_set_render_offscreen(context, StateTable, render_offscreen); context_set_render_offscreen(context, StateTable, render_offscreen);
......
...@@ -4378,7 +4378,7 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfac ...@@ -4378,7 +4378,7 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfac
context = context_acquire(This, (IWineD3DSurface *)target, CTXUSAGE_CLEAR); context = context_acquire(This, (IWineD3DSurface *)target, CTXUSAGE_CLEAR);
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
{ {
if (!surface_is_offscreen((IWineD3DSurface *)target)) if (!surface_is_offscreen(target))
{ {
TRACE("Surface %p is onscreen\n", target); TRACE("Surface %p is onscreen\n", target);
...@@ -5441,7 +5441,7 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface, ...@@ -5441,7 +5441,7 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface,
if (rect) IWineD3DSurface_LoadLocation(surface, SFLAG_INDRAWABLE, NULL); if (rect) IWineD3DSurface_LoadLocation(surface, SFLAG_INDRAWABLE, NULL);
IWineD3DSurface_ModifyLocation(surface, SFLAG_INDRAWABLE, TRUE); IWineD3DSurface_ModifyLocation(surface, SFLAG_INDRAWABLE, TRUE);
if (!surface_is_offscreen(surface)) if (!surface_is_offscreen((IWineD3DSurfaceImpl *)surface))
{ {
TRACE("Surface %p is onscreen\n", surface); TRACE("Surface %p is onscreen\n", surface);
...@@ -5463,12 +5463,11 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface, ...@@ -5463,12 +5463,11 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface,
if (rect) { if (rect) {
glEnable(GL_SCISSOR_TEST); glEnable(GL_SCISSOR_TEST);
if(surface_is_offscreen(surface)) { if (surface_is_offscreen((IWineD3DSurfaceImpl *)surface))
glScissor(rect->x1, rect->y1, rect->x2 - rect->x1, rect->y2 - rect->y1); glScissor(rect->x1, rect->y1, rect->x2 - rect->x1, rect->y2 - rect->y1);
} else { else
glScissor(rect->x1, ((IWineD3DSurfaceImpl *)surface)->currentDesc.Height - rect->y2, glScissor(rect->x1, ((IWineD3DSurfaceImpl *)surface)->currentDesc.Height - rect->y2,
rect->x2 - rect->x1, rect->y2 - rect->y1); rect->x2 - rect->x1, rect->y2 - rect->y1);
}
checkGLcall("glScissor"); checkGLcall("glScissor");
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SCISSORRECT); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SCISSORRECT);
} else { } else {
...@@ -5742,8 +5741,8 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, const ...@@ -5742,8 +5741,8 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, const
IWineD3DSurface_LoadLocation(src_surface, SFLAG_INDRAWABLE, NULL); IWineD3DSurface_LoadLocation(src_surface, SFLAG_INDRAWABLE, NULL);
IWineD3DSurface_LoadLocation(dst_surface, SFLAG_INDRAWABLE, NULL); IWineD3DSurface_LoadLocation(dst_surface, SFLAG_INDRAWABLE, NULL);
if (!surface_is_offscreen(src_surface)) context = context_acquire(This, src_surface, CTXUSAGE_RESOURCELOAD); if (!surface_is_offscreen((IWineD3DSurfaceImpl *)src_surface)) context = context_acquire(This, src_surface, CTXUSAGE_RESOURCELOAD);
else if (!surface_is_offscreen(dst_surface)) context = context_acquire(This, dst_surface, CTXUSAGE_RESOURCELOAD); else if (!surface_is_offscreen((IWineD3DSurfaceImpl *)dst_surface)) context = context_acquire(This, dst_surface, CTXUSAGE_RESOURCELOAD);
else context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD); else context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
if (!context->valid) if (!context->valid)
...@@ -5755,7 +5754,7 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, const ...@@ -5755,7 +5754,7 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, const
gl_info = context->gl_info; gl_info = context->gl_info;
if (!surface_is_offscreen(src_surface)) if (!surface_is_offscreen((IWineD3DSurfaceImpl *)src_surface))
{ {
GLenum buffer = surface_get_gl_buffer(src_surface); GLenum buffer = surface_get_gl_buffer(src_surface);
...@@ -5791,7 +5790,7 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, const ...@@ -5791,7 +5790,7 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, const
LEAVE_GL(); LEAVE_GL();
/* Attach dst surface to dst fbo */ /* Attach dst surface to dst fbo */
if (!surface_is_offscreen(dst_surface)) if (!surface_is_offscreen((IWineD3DSurfaceImpl *)dst_surface))
{ {
GLenum buffer = surface_get_gl_buffer(dst_surface); GLenum buffer = surface_get_gl_buffer(dst_surface);
......
...@@ -730,8 +730,7 @@ static void surface_upload_data(IWineD3DSurfaceImpl *This, const struct wined3d_ ...@@ -730,8 +730,7 @@ static void surface_upload_data(IWineD3DSurfaceImpl *This, const struct wined3d_
{ {
internal = format_desc->glGammaInternal; internal = format_desc->glGammaInternal;
} }
else if (This->resource.usage & WINED3DUSAGE_RENDERTARGET else if (This->resource.usage & WINED3DUSAGE_RENDERTARGET && surface_is_offscreen(This))
&& surface_is_offscreen((IWineD3DSurface *)This))
{ {
internal = format_desc->rtInternal; internal = format_desc->rtInternal;
} }
...@@ -811,8 +810,7 @@ static void surface_allocate_surface(IWineD3DSurfaceImpl *This, const struct win ...@@ -811,8 +810,7 @@ static void surface_allocate_surface(IWineD3DSurfaceImpl *This, const struct win
{ {
internal = format_desc->glGammaInternal; internal = format_desc->glGammaInternal;
} }
else if (This->resource.usage & WINED3DUSAGE_RENDERTARGET else if (This->resource.usage & WINED3DUSAGE_RENDERTARGET && surface_is_offscreen(This))
&& surface_is_offscreen((IWineD3DSurface *)This))
{ {
internal = format_desc->rtInternal; internal = format_desc->rtInternal;
} }
...@@ -1280,7 +1278,7 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, v ...@@ -1280,7 +1278,7 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, v
* There is no need to keep track of the current read buffer or reset it, every part of the code * There is no need to keep track of the current read buffer or reset it, every part of the code
* that reads sets the read buffer as desired. * that reads sets the read buffer as desired.
*/ */
if (surface_is_offscreen((IWineD3DSurface *) This)) if (surface_is_offscreen(This))
{ {
/* Locking the primary render target which is not on a swapchain(=offscreen render target). /* Locking the primary render target which is not on a swapchain(=offscreen render target).
* Read from the back buffer * Read from the back buffer
...@@ -1512,7 +1510,7 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb) ...@@ -1512,7 +1510,7 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb)
* There is no need to keep track of the current read buffer or reset it, every part of the code * There is no need to keep track of the current read buffer or reset it, every part of the code
* that reads sets the read buffer as desired. * that reads sets the read buffer as desired.
*/ */
if (!surface_is_offscreen((IWineD3DSurface *)This)) if (!surface_is_offscreen(This))
{ {
GLenum buffer = surface_get_gl_buffer((IWineD3DSurface *)This); GLenum buffer = surface_get_gl_buffer((IWineD3DSurface *)This);
TRACE("Locking %#x buffer\n", buffer); TRACE("Locking %#x buffer\n", buffer);
...@@ -1771,7 +1769,7 @@ static void flush_to_framebuffer_drawpixels(IWineD3DSurfaceImpl *This, GLenum fm ...@@ -1771,7 +1769,7 @@ static void flush_to_framebuffer_drawpixels(IWineD3DSurfaceImpl *This, GLenum fm
ENTER_GL(); ENTER_GL();
if (!surface_is_offscreen((IWineD3DSurface *)This)) if (!surface_is_offscreen(This))
{ {
GLenum buffer = surface_get_gl_buffer((IWineD3DSurface *)This); GLenum buffer = surface_get_gl_buffer((IWineD3DSurface *)This);
TRACE("Unlocking %#x buffer.\n", buffer); TRACE("Unlocking %#x buffer.\n", buffer);
...@@ -2989,7 +2987,8 @@ static inline void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *This, IWineD3D ...@@ -2989,7 +2987,8 @@ static inline void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *This, IWineD3D
/* Bind the target texture */ /* Bind the target texture */
glBindTexture(This->texture_target, This->texture_name); glBindTexture(This->texture_target, This->texture_name);
checkGLcall("glBindTexture"); checkGLcall("glBindTexture");
if(surface_is_offscreen(SrcSurface)) { if (surface_is_offscreen(Src))
{
TRACE("Reading from an offscreen target\n"); TRACE("Reading from an offscreen target\n");
upsidedown = !upsidedown; upsidedown = !upsidedown;
glReadBuffer(device->offscreenBuffer); glReadBuffer(device->offscreenBuffer);
...@@ -3090,7 +3089,7 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine ...@@ -3090,7 +3089,7 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
context = context_acquire(device, SrcSurface, CTXUSAGE_BLIT); context = context_acquire(device, SrcSurface, CTXUSAGE_BLIT);
surface_internal_preload((IWineD3DSurface *) This, SRGB_RGB); surface_internal_preload((IWineD3DSurface *) This, SRGB_RGB);
src_offscreen = surface_is_offscreen(SrcSurface); src_offscreen = surface_is_offscreen(Src);
noBackBufferBackup = src_offscreen && wined3d_settings.offscreen_rendering_mode == ORM_FBO; noBackBufferBackup = src_offscreen && wined3d_settings.offscreen_rendering_mode == ORM_FBO;
if (!noBackBufferBackup && !Src->texture_name) if (!noBackBufferBackup && !Src->texture_name)
{ {
...@@ -4205,8 +4204,9 @@ static void WINAPI IWineD3DSurfaceImpl_ModifyLocation(IWineD3DSurface *iface, DW ...@@ -4205,8 +4204,9 @@ static void WINAPI IWineD3DSurfaceImpl_ModifyLocation(IWineD3DSurface *iface, DW
TRACE("(%p)->(%s, %s)\n", iface, debug_surflocation(flag), TRACE("(%p)->(%s, %s)\n", iface, debug_surflocation(flag),
persistent ? "TRUE" : "FALSE"); persistent ? "TRUE" : "FALSE");
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
if (surface_is_offscreen(iface)) {
if (surface_is_offscreen(This))
{ {
/* With ORM_FBO, SFLAG_INTEXTURE and SFLAG_INDRAWABLE are the same for offscreen targets. */ /* With ORM_FBO, SFLAG_INTEXTURE and SFLAG_INDRAWABLE are the same for offscreen targets. */
if (flag & (SFLAG_INTEXTURE | SFLAG_INDRAWABLE)) flag |= (SFLAG_INTEXTURE | SFLAG_INDRAWABLE); if (flag & (SFLAG_INTEXTURE | SFLAG_INDRAWABLE)) flag |= (SFLAG_INTEXTURE | SFLAG_INDRAWABLE);
...@@ -4322,8 +4322,9 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D ...@@ -4322,8 +4322,9 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
BOOL drawable_read_ok = TRUE; BOOL drawable_read_ok = TRUE;
BOOL in_fbo = FALSE; BOOL in_fbo = FALSE;
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
if (surface_is_offscreen(iface)) {
if (surface_is_offscreen(This))
{ {
/* With ORM_FBO, SFLAG_INTEXTURE and SFLAG_INDRAWABLE are the same for offscreen targets. /* With ORM_FBO, SFLAG_INTEXTURE and SFLAG_INDRAWABLE are the same for offscreen targets.
* Prefer SFLAG_INTEXTURE. */ * Prefer SFLAG_INTEXTURE. */
...@@ -4605,16 +4606,15 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_DrawOverlay(IWineD3DSurface *iface) { ...@@ -4605,16 +4606,15 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_DrawOverlay(IWineD3DSurface *iface) {
return hr; return hr;
} }
BOOL surface_is_offscreen(IWineD3DSurface *iface) BOOL surface_is_offscreen(IWineD3DSurfaceImpl *surface)
{ {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)surface->container;
IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *) This->container;
/* Not on a swapchain - must be offscreen */ /* Not on a swapchain - must be offscreen */
if (!(This->Flags & SFLAG_SWAPCHAIN)) return TRUE; if (!(surface->Flags & SFLAG_SWAPCHAIN)) return TRUE;
/* The front buffer is always onscreen */ /* The front buffer is always onscreen */
if(iface == swapchain->frontBuffer) return FALSE; if (surface == (IWineD3DSurfaceImpl *)swapchain->frontBuffer) return FALSE;
/* If the swapchain is rendered to an FBO, the backbuffer is /* If the swapchain is rendered to an FBO, the backbuffer is
* offscreen, otherwise onscreen */ * offscreen, otherwise onscreen */
......
...@@ -1872,7 +1872,7 @@ typedef struct IWineD3DBaseTextureClass ...@@ -1872,7 +1872,7 @@ typedef struct IWineD3DBaseTextureClass
void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb) DECLSPEC_HIDDEN; void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb) DECLSPEC_HIDDEN;
BOOL surface_init_sysmem(IWineD3DSurface *iface) DECLSPEC_HIDDEN; BOOL surface_init_sysmem(IWineD3DSurface *iface) DECLSPEC_HIDDEN;
BOOL surface_is_offscreen(IWineD3DSurface *iface) DECLSPEC_HIDDEN; BOOL surface_is_offscreen(IWineD3DSurfaceImpl *iface) DECLSPEC_HIDDEN;
void surface_prepare_texture(IWineD3DSurfaceImpl *surface, void surface_prepare_texture(IWineD3DSurfaceImpl *surface,
const struct wined3d_gl_info *gl_info, BOOL srgb) DECLSPEC_HIDDEN; const struct wined3d_gl_info *gl_info, BOOL srgb) DECLSPEC_HIDDEN;
......
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