diff options
author | Pauli Nieminen <[email protected]> | 2012-06-12 21:39:00 +0300 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2012-08-01 15:57:12 -0700 |
commit | 676a563d5bdcd9c75e1e33d75e2fa16bedcf5e83 (patch) | |
tree | ac3ac9d65957e182b3a9d69f84d267efa1110ca0 /src/mesa/drivers/common/meta.c | |
parent | 5a320d5bcfb66afca6fe9fe5da133c2675ab4d27 (diff) |
meta: Add sampler object to texture decompression
Sampler objects can be used to shadow texture object state without
modifying original application state. Decompression path feels a bit
like path where caching shouldn't happen. But as everything else is
cached already I decided to cache sampler state too.
Signed-off-by: Pauli Nieminen <[email protected]>
Reviewed-by: Brian Paul <[email protected]>
Reviewed-by: Eric Anholt <[email protected]>
Diffstat (limited to 'src/mesa/drivers/common/meta.c')
-rw-r--r-- | src/mesa/drivers/common/meta.c | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index 6846bbc60be..13da1da9c32 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -287,7 +287,7 @@ struct gen_mipmap_state struct decompress_state { GLuint ArrayObj; - GLuint VBO, FBO, RBO; + GLuint VBO, FBO, RBO, Sampler; GLint Width, Height; }; @@ -3295,6 +3295,7 @@ decompress_texture_image(struct gl_context *ctx, struct vertex verts[4]; GLuint fboDrawSave, fboReadSave; GLuint rbSave; + GLuint samplerSave; if (slice > 0) { assert(target == GL_TEXTURE_3D || @@ -3315,6 +3316,9 @@ decompress_texture_image(struct gl_context *ctx, _mesa_meta_begin(ctx, MESA_META_ALL & ~MESA_META_PIXEL_STORE); + samplerSave = ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler ? + ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler->Name : 0; + /* Create/bind FBO/renderbuffer */ if (decompress->FBO == 0) { _mesa_GenFramebuffersEXT(1, &decompress->FBO); @@ -3362,6 +3366,22 @@ decompress_texture_image(struct gl_context *ctx, _mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, decompress->VBO); } + if (!decompress->Sampler) { + _mesa_GenSamplers(1, &decompress->Sampler); + _mesa_BindSampler(ctx->Texture.CurrentUnit, decompress->Sampler); + /* nearest filtering */ + _mesa_SamplerParameteri(decompress->Sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + _mesa_SamplerParameteri(decompress->Sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + /* No sRGB decode or encode.*/ + if (ctx->Extensions.EXT_texture_sRGB_decode) { + _mesa_SamplerParameteri(decompress->Sampler, GL_TEXTURE_SRGB_DECODE_EXT, + GL_SKIP_DECODE_EXT); + } + + } else { + _mesa_BindSampler(ctx->Texture.CurrentUnit, decompress->Sampler); + } + setup_texture_coords(faceTarget, slice, width, height, verts[0].tex, verts[1].tex, @@ -3387,26 +3407,14 @@ decompress_texture_image(struct gl_context *ctx, { /* save texture object state */ - const GLenum minFilterSave = texObj->Sampler.MinFilter; - const GLenum magFilterSave = texObj->Sampler.MagFilter; const GLint baseLevelSave = texObj->BaseLevel; const GLint maxLevelSave = texObj->MaxLevel; - const GLenum wrapSSave = texObj->Sampler.WrapS; - const GLenum wrapTSave = texObj->Sampler.WrapT; - const GLenum srgbSave = texObj->Sampler.sRGBDecode; /* restrict sampling to the texture level of interest */ _mesa_TexParameteri(target, GL_TEXTURE_BASE_LEVEL, texImage->Level); _mesa_TexParameteri(target, GL_TEXTURE_MAX_LEVEL, texImage->Level); - /* nearest filtering */ - _mesa_TexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - _mesa_TexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /* No sRGB decode or encode.*/ - if (ctx->Extensions.EXT_texture_sRGB_decode) { - _mesa_TexParameteri(target, GL_TEXTURE_SRGB_DECODE_EXT, - GL_SKIP_DECODE_EXT); - } if (ctx->Extensions.EXT_framebuffer_sRGB) { _mesa_set_enable(ctx, GL_FRAMEBUFFER_SRGB_EXT, GL_FALSE); } @@ -3417,17 +3425,11 @@ decompress_texture_image(struct gl_context *ctx, /* Restore texture object state, the texture binding will * be restored by _mesa_meta_end(). */ - _mesa_TexParameteri(target, GL_TEXTURE_MIN_FILTER, minFilterSave); - _mesa_TexParameteri(target, GL_TEXTURE_MAG_FILTER, magFilterSave); if (target != GL_TEXTURE_RECTANGLE_ARB) { _mesa_TexParameteri(target, GL_TEXTURE_BASE_LEVEL, baseLevelSave); _mesa_TexParameteri(target, GL_TEXTURE_MAX_LEVEL, maxLevelSave); } - _mesa_TexParameteri(target, GL_TEXTURE_WRAP_S, wrapSSave); - _mesa_TexParameteri(target, GL_TEXTURE_WRAP_T, wrapTSave); - if (ctx->Extensions.EXT_texture_sRGB_decode) { - _mesa_TexParameteri(target, GL_TEXTURE_SRGB_DECODE_EXT, srgbSave); - } + } /* read pixels from renderbuffer */ @@ -3455,6 +3457,8 @@ decompress_texture_image(struct gl_context *ctx, /* disable texture unit */ _mesa_set_enable(ctx, target, GL_FALSE); + _mesa_BindSampler(ctx->Texture.CurrentUnit, samplerSave); + _mesa_meta_end(ctx); /* restore fbo bindings */ |