Stefan Dösinger : wined3d: Don' t set FBO attachment filtering to GL_NEAREST.
Alexandre Julliard
julliard at winehq.org
Mon Jun 27 17:41:22 CDT 2011
Module: wine
Branch: master
Commit: 9ed6dc91443561037c7dacd3f4a08faec7ab8bf7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9ed6dc91443561037c7dacd3f4a08faec7ab8bf7
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Fri May 27 13:57:34 2011 +0200
wined3d: Don't set FBO attachment filtering to GL_NEAREST.
The min and mag filters should not have any effect when rendering to
textures. This code was once needed to work around a bug in the Nvidia
driver. Changing the texture filter states is expensive and makes it
harder to apply the FBO state only when needed.
---
dlls/wined3d/context.c | 113 +++++-------------------------------------------
1 files changed, 11 insertions(+), 102 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 8edace0..bdf1f37 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -112,84 +112,6 @@ static void context_destroy_fbo(struct wined3d_context *context, GLuint *fbo)
}
/* GL locking is done by the caller */
-static void context_apply_attachment_filter_states(const struct wined3d_context *context,
- struct wined3d_surface *surface, DWORD location)
-{
- /* Update base texture states array */
- if (surface->container.type == WINED3D_CONTAINER_TEXTURE)
- {
- struct wined3d_texture *texture = surface->container.u.texture;
- struct wined3d_device *device = surface->resource.device;
- BOOL update_minfilter = FALSE;
- BOOL update_magfilter = FALSE;
- struct gl_texture *gl_tex;
-
- switch (location)
- {
- case SFLAG_INTEXTURE:
- case SFLAG_INSRGBTEX:
- gl_tex = wined3d_texture_get_gl_texture(texture,
- context->gl_info, location == SFLAG_INSRGBTEX);
- break;
-
- default:
- ERR("Unsupported location %s (%#x).\n", debug_surflocation(location), location);
- return;
- }
-
- if (gl_tex->states[WINED3DTEXSTA_MINFILTER] != WINED3DTEXF_POINT
- || gl_tex->states[WINED3DTEXSTA_MIPFILTER] != WINED3DTEXF_NONE)
- {
- gl_tex->states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT;
- gl_tex->states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE;
- update_minfilter = TRUE;
- }
-
- if (gl_tex->states[WINED3DTEXSTA_MAGFILTER] != WINED3DTEXF_POINT)
- {
- gl_tex->states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT;
- update_magfilter = TRUE;
- }
-
- if (texture->bind_count)
- {
- WARN("Render targets should not be bound to a sampler\n");
- device_invalidate_state(device, STATE_SAMPLER(texture->sampler));
- }
-
- if (update_minfilter || update_magfilter)
- {
- GLenum target, bind_target;
- GLint old_binding;
-
- target = surface->texture_target;
- if (target == GL_TEXTURE_2D)
- {
- bind_target = GL_TEXTURE_2D;
- glGetIntegerv(GL_TEXTURE_BINDING_2D, &old_binding);
- }
- else if (target == GL_TEXTURE_RECTANGLE_ARB)
- {
- bind_target = GL_TEXTURE_RECTANGLE_ARB;
- glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_binding);
- }
- else
- {
- bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARB, &old_binding);
- }
-
- glBindTexture(bind_target, gl_tex->name);
- if (update_minfilter) glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- if (update_magfilter) glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glBindTexture(bind_target, old_binding);
- }
-
- checkGLcall("apply_attachment_filter_states()");
- }
-}
-
-/* GL locking is done by the caller */
void context_attach_depth_stencil_fbo(struct wined3d_context *context,
GLenum fbo_target, struct wined3d_surface *depth_stencil, BOOL use_render_buffer)
{
@@ -220,7 +142,6 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context,
else
{
surface_prepare_texture(depth_stencil, gl_info, FALSE);
- context_apply_attachment_filter_states(context, depth_stencil, SFLAG_INTEXTURE);
if (format_flags & WINED3DFMT_FLAG_DEPTH)
{
@@ -279,7 +200,6 @@ static void context_attach_surface_fbo(const struct wined3d_context *context,
case SFLAG_INSRGBTEX:
srgb = location == SFLAG_INSRGBTEX;
surface_prepare_texture(surface, gl_info, srgb);
- context_apply_attachment_filter_states(context, surface, location);
gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx,
surface->texture_target, surface_get_texture_name(surface, gl_info, srgb),
surface->texture_level);
@@ -450,31 +370,20 @@ static void context_apply_fbo_entry(struct wined3d_context *context, GLenum targ
context_bind_fbo(context, target, &entry->id);
- if (!entry->attached)
- {
- /* Apply render targets */
- for (i = 0; i < gl_info->limits.buffers; ++i)
- {
- context_attach_surface_fbo(context, target, i, entry->render_targets[i], entry->location);
- }
+ if (entry->attached) return;
- /* Apply depth targets */
- if (entry->depth_stencil)
- surface_set_compatible_renderbuffer(entry->depth_stencil, entry->render_targets[0]);
- context_attach_depth_stencil_fbo(context, target, entry->depth_stencil, TRUE);
-
- entry->attached = TRUE;
- }
- else
+ /* Apply render targets */
+ for (i = 0; i < gl_info->limits.buffers; ++i)
{
- for (i = 0; i < gl_info->limits.buffers; ++i)
- {
- if (entry->render_targets[i])
- context_apply_attachment_filter_states(context, entry->render_targets[i], entry->location);
- }
- if (entry->depth_stencil)
- context_apply_attachment_filter_states(context, entry->depth_stencil, SFLAG_INTEXTURE);
+ context_attach_surface_fbo(context, target, i, entry->render_targets[i], entry->location);
}
+
+ /* Apply depth targets */
+ if (entry->depth_stencil)
+ surface_set_compatible_renderbuffer(entry->depth_stencil, entry->render_targets[0]);
+ context_attach_depth_stencil_fbo(context, target, entry->depth_stencil, TRUE);
+
+ entry->attached = TRUE;
}
/* GL locking is done by the caller */
More information about the wine-cvs
mailing list