wined3d: Do not preload surfaces when attaching them to an FBO.
Just make sure the texture is allocated, so we have something to attach. Note also that context_apply_attachment_filter_states() runs under the GL lock, so preloading resources is actually unsafe there.
This commit is contained in:
parent
02e0b3ae1a
commit
af7dfcd378
|
@ -114,7 +114,7 @@ static void context_destroy_fbo(struct wined3d_context *context, GLuint *fbo)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* GL locking is done by the caller */
|
/* GL locking is done by the caller */
|
||||||
static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOOL force_preload)
|
static void context_apply_attachment_filter_states(IWineD3DSurface *surface)
|
||||||
{
|
{
|
||||||
const IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
|
const IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
|
||||||
IWineD3DDeviceImpl *device = surface_impl->resource.device;
|
IWineD3DDeviceImpl *device = surface_impl->resource.device;
|
||||||
|
@ -148,7 +148,7 @@ static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOO
|
||||||
IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture_impl);
|
IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture_impl);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update_minfilter || update_magfilter || force_preload)
|
if (update_minfilter || update_magfilter)
|
||||||
{
|
{
|
||||||
GLenum target, bind_target;
|
GLenum target, bind_target;
|
||||||
GLint old_binding;
|
GLint old_binding;
|
||||||
|
@ -166,8 +166,6 @@ static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOO
|
||||||
glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARB, &old_binding);
|
glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARB, &old_binding);
|
||||||
}
|
}
|
||||||
|
|
||||||
surface_internal_preload(surface, SRGB_RGB);
|
|
||||||
|
|
||||||
glBindTexture(bind_target, surface_impl->texture_name);
|
glBindTexture(bind_target, surface_impl->texture_name);
|
||||||
if (update_minfilter) glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
if (update_minfilter) glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
if (update_magfilter) glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
if (update_magfilter) glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
@ -208,7 +206,8 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
context_apply_attachment_filter_states(depth_stencil, TRUE);
|
surface_prepare_texture(depth_stencil_impl, FALSE);
|
||||||
|
context_apply_attachment_filter_states(depth_stencil);
|
||||||
|
|
||||||
if (format_flags & WINED3DFMT_FLAG_DEPTH)
|
if (format_flags & WINED3DFMT_FLAG_DEPTH)
|
||||||
{
|
{
|
||||||
|
@ -253,14 +252,15 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context,
|
||||||
void context_attach_surface_fbo(const struct wined3d_context *context,
|
void context_attach_surface_fbo(const struct wined3d_context *context,
|
||||||
GLenum fbo_target, DWORD idx, IWineD3DSurface *surface)
|
GLenum fbo_target, DWORD idx, IWineD3DSurface *surface)
|
||||||
{
|
{
|
||||||
const IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
|
IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
|
||||||
const struct wined3d_gl_info *gl_info = context->gl_info;
|
const struct wined3d_gl_info *gl_info = context->gl_info;
|
||||||
|
|
||||||
TRACE("Attach surface %p to %u\n", surface, idx);
|
TRACE("Attach surface %p to %u\n", surface, idx);
|
||||||
|
|
||||||
if (surface)
|
if (surface)
|
||||||
{
|
{
|
||||||
context_apply_attachment_filter_states(surface, TRUE);
|
surface_prepare_texture(surface_impl, FALSE);
|
||||||
|
context_apply_attachment_filter_states(surface);
|
||||||
|
|
||||||
gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx, surface_impl->texture_target,
|
gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx, surface_impl->texture_target,
|
||||||
surface_impl->texture_name, surface_impl->texture_level);
|
surface_impl->texture_name, surface_impl->texture_level);
|
||||||
|
@ -431,10 +431,10 @@ static void context_apply_fbo_entry(struct wined3d_context *context, struct fbo_
|
||||||
for (i = 0; i < gl_info->limits.buffers; ++i)
|
for (i = 0; i < gl_info->limits.buffers; ++i)
|
||||||
{
|
{
|
||||||
if (device->render_targets[i])
|
if (device->render_targets[i])
|
||||||
context_apply_attachment_filter_states(device->render_targets[i], FALSE);
|
context_apply_attachment_filter_states(device->render_targets[i]);
|
||||||
}
|
}
|
||||||
if (device->stencilBufferTarget)
|
if (device->stencilBufferTarget)
|
||||||
context_apply_attachment_filter_states(device->stencilBufferTarget, FALSE);
|
context_apply_attachment_filter_states(device->stencilBufferTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < gl_info->limits.buffers; ++i)
|
for (i = 0; i < gl_info->limits.buffers; ++i)
|
||||||
|
@ -2156,6 +2156,8 @@ static void context_apply_state(struct wined3d_context *context, IWineD3DDeviceI
|
||||||
if (context->render_offscreen)
|
if (context->render_offscreen)
|
||||||
{
|
{
|
||||||
FIXME("Activating for CTXUSAGE_BLIT for an offscreen target with ORM_FBO. This should be avoided.\n");
|
FIXME("Activating for CTXUSAGE_BLIT for an offscreen target with ORM_FBO. This should be avoided.\n");
|
||||||
|
surface_internal_preload(context->current_rt, SRGB_RGB);
|
||||||
|
|
||||||
ENTER_GL();
|
ENTER_GL();
|
||||||
context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo);
|
context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo);
|
||||||
context_attach_surface_fbo(context, GL_FRAMEBUFFER, 0, context->current_rt);
|
context_attach_surface_fbo(context, GL_FRAMEBUFFER, 0, context->current_rt);
|
||||||
|
|
|
@ -1254,7 +1254,7 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Context activation is done by the caller. */
|
/* Context activation is done by the caller. */
|
||||||
static void surface_prepare_texture(IWineD3DSurfaceImpl *surface, BOOL srgb)
|
void surface_prepare_texture(IWineD3DSurfaceImpl *surface, BOOL srgb)
|
||||||
{
|
{
|
||||||
DWORD alloc_flag = srgb ? SFLAG_SRGBALLOCATED : SFLAG_ALLOCATED;
|
DWORD alloc_flag = srgb ? SFLAG_SRGBALLOCATED : SFLAG_ALLOCATED;
|
||||||
GLenum format, internal, type;
|
GLenum format, internal, type;
|
||||||
|
|
|
@ -1763,6 +1763,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(IWineD3DSurface *iface) DECLSPEC_HIDDEN;
|
||||||
|
void surface_prepare_texture(IWineD3DSurfaceImpl *surface, BOOL srgb) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
typedef struct IWineD3DBaseTextureImpl
|
typedef struct IWineD3DBaseTextureImpl
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue