[Mesa-dev] [PATCH 07/18] meta/blit: Save and restore the sampler using gl_sampler_object instead of GL API object handle
Ian Romanick
idr at freedesktop.org
Mon Jan 11 15:19:12 PST 2016
On 01/09/2016 12:48 PM, Jason Ekstrand wrote:
>
> On Jan 8, 2016 6:59 PM, "Ian Romanick" <idr at freedesktop.org
> <mailto:idr at freedesktop.org>> wrote:
>>
>> From: Ian Romanick <ian.d.romanick at intel.com
> <mailto:ian.d.romanick at intel.com>>
>>
>> Some meta operations can be called recursively. Future changes (the
>> "Don't pollute the ... namespace" changes) will cause objects with
>> invalid names to be used. If a nested meta operation tries to restore
>> an object named 0xDEADBEEF, it will fail.
>>
>> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com
> <mailto:ian.d.romanick at intel.com>>
>> ---
>> src/mesa/drivers/common/meta.h | 3 ++-
>> src/mesa/drivers/common/meta_blit.c | 9 +++++----
>> 2 files changed, 7 insertions(+), 5 deletions(-)
>>
>> diff --git a/src/mesa/drivers/common/meta.h
> b/src/mesa/drivers/common/meta.h
>> index 268824c..856dcdb 100644
>> --- a/src/mesa/drivers/common/meta.h
>> +++ b/src/mesa/drivers/common/meta.h
>> @@ -310,7 +310,8 @@ struct fb_tex_blit_state
>> {
>> GLint baseLevelSave, maxLevelSave;
>> struct gl_sampler_object *samp_obj;
>> - GLuint samplerSave, stencilSamplingSave;
>> + struct gl_sampler_object *samp_obj_save;
>> + GLuint stencilSamplingSave;
>> GLuint tempTex;
>> };
>>
>> diff --git a/src/mesa/drivers/common/meta_blit.c
> b/src/mesa/drivers/common/meta_blit.c
>> index 6c03f5d..fc4c87a 100644
>> --- a/src/mesa/drivers/common/meta_blit.c
>> +++ b/src/mesa/drivers/common/meta_blit.c
>> @@ -810,9 +810,9 @@ void
>> _mesa_meta_fb_tex_blit_begin(const struct gl_context *ctx,
>> struct fb_tex_blit_state *blit)
>> {
>> - blit->samplerSave =
>> - ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler ?
>> - ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler->Name : 0;
>> + blit->samp_obj_save = NULL;
>
> I'm a bit confused here. Why are we stomping this to null? If it's
> ever not null then it either hasn't been initialized or we failed at
> reference counting. Why not just assert == null instead?
Neither of callers (blitframebuffer_texture and brw_meta_stencil_blit)
preinitialize fb_tex_blit_state to zeros, and both use stack variables.
The assumption in the callers is that _mesa_meta_fb_tex_blit_begin will
do that for them. If samp_obj_save is not NULL,
_mesa_reference_sampler_object will try to dereference it. Since the
state isn't persistent across calls, we won't catch ref counting problems.
I think I'll add a comment to this effect in
_mesa_meta_fb_tex_blit_begin. There are other unsent patches in this
series that do similar things. I will audit those before sending them.
>> + _mesa_reference_sampler_object(ctx, &blit->samp_obj_save,
>> +
> ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler);
>> blit->tempTex = 0;
>> }
>>
>> @@ -838,7 +838,8 @@ _mesa_meta_fb_tex_blit_end(struct gl_context *ctx,
> GLenum target,
>> }
>> }
>>
>> - _mesa_BindSampler(ctx->Texture.CurrentUnit, blit->samplerSave);
>> + _mesa_bind_sampler(ctx, ctx->Texture.CurrentUnit,
> blit->samp_obj_save);
>> + _mesa_reference_sampler_object(ctx, &blit->samp_obj_save, NULL);
>> _mesa_DeleteSamplers(1, &blit->samp_obj->Name);
>> blit->samp_obj = NULL;
>>
>> --
>> 2.5.0
>>
>> _______________________________________________
>> mesa-dev mailing list
>>mesa-dev at lists.freedesktop.org <mailto:mesa-dev at lists.freedesktop.org>
>>http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> <http://lists.freedesktop.org/mailman/listinfo/mesa-dev>
>
More information about the mesa-dev
mailing list