diff options
author | Pauli Nieminen <pauli.nieminen@linux.intel.com> | 2012-06-09 03:15:53 +0300 |
---|---|---|
committer | Pauli Nieminen <pauli.nieminen@linux.intel.com> | 2012-06-10 00:26:26 +0300 |
commit | 74fee5dfcb535d50278c4cbb4ceca8ca590f2559 (patch) | |
tree | 9a4c234d56c1bcc194a2bc1dec1c6fd3e8f92630 | |
parent | 7620b79c373f4d6ea9ec3418e065e08639fc34cb (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 <pauli.nieminen@linux.intel.com>
-rw-r--r-- | src/mesa/drivers/common/meta.c | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index 6fe1fac2b3..83ae3d90ee 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -285,7 +285,7 @@ struct gen_mipmap_state struct decompress_state { GLuint ArrayObj; - GLuint VBO, FBO, RBO; + GLuint VBO, FBO, RBO, Sampler; GLint Width, Height; }; @@ -3222,6 +3222,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 || @@ -3242,6 +3243,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); @@ -3289,6 +3293,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, @@ -3314,28 +3334,15 @@ 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 */ if (target != GL_TEXTURE_RECTANGLE_ARB) { _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); } @@ -3346,17 +3353,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 */ @@ -3384,6 +3385,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 */ |