[Mesa-dev] [PATCH 16/16] meta: Don't pollute the texture namespace
Tapani Pälli
tapani.palli at intel.com
Fri Dec 22 05:28:24 UTC 2017
series is
Reviewed-by: Tapani Pälli <tapani.palli at intel.com>
On 19.12.2017 02:14, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> tl;dr: For many types of GL object, we can *NEVER* use the Gen function.
>
> In OpenGL ES (all versions!) and OpenGL compatibility profile,
> applications don't have to call Gen functions. The GL spec is very
> clear about how you can mix-and-match generated names and non-generated
> names: you can use any name you want for a particular object type until
> you call the Gen function for that object type.
>
> Here's the problem scenario:
>
> - Application calls a meta function that generates a name. The first
> Gen will probably return 1.
>
> - Application decides to use the same name for an object of the same
> type without calling Gen. Many demo programs use names 1, 2, 3,
> etc. without calling Gen.
>
> - Application calls the meta function again, and the meta function
> replaces the data. The application's data is lost, and the app
> fails. Have fun debugging that.
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=92363
> ---
> src/mesa/drivers/common/meta.c | 21 ++++++---------------
> src/mesa/drivers/common/meta_blit.c | 18 ++++--------------
> 2 files changed, 10 insertions(+), 29 deletions(-)
>
> diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
> index 55d803f..f4830ec 100644
> --- a/src/mesa/drivers/common/meta.c
> +++ b/src/mesa/drivers/common/meta.c
> @@ -98,7 +98,8 @@ meta_clear(struct gl_context *ctx, GLbitfield buffers, bool glsl);
> static struct blit_shader *
> choose_blit_shader(GLenum target, struct blit_shader_table *table);
>
> -static void cleanup_temp_texture(struct temp_texture *tex);
> +static void cleanup_temp_texture(struct gl_context *ctx,
> + struct temp_texture *tex);
> static void meta_glsl_clear_cleanup(struct gl_context *ctx,
> struct clear_state *clear);
> static void meta_decompress_cleanup(struct gl_context *ctx,
> @@ -418,7 +419,7 @@ _mesa_meta_free(struct gl_context *ctx)
> _mesa_meta_glsl_blit_cleanup(ctx, &ctx->Meta->Blit);
> meta_glsl_clear_cleanup(ctx, &ctx->Meta->Clear);
> _mesa_meta_glsl_generate_mipmap_cleanup(ctx, &ctx->Meta->Mipmap);
> - cleanup_temp_texture(&ctx->Meta->TempTex);
> + cleanup_temp_texture(ctx, &ctx->Meta->TempTex);
> meta_decompress_cleanup(ctx, &ctx->Meta->Decompress);
> meta_drawpix_cleanup(ctx, &ctx->Meta->DrawPix);
> if (old_context)
> @@ -1228,8 +1229,6 @@ invert_z(GLfloat normZ)
> static void
> init_temp_texture(struct gl_context *ctx, struct temp_texture *tex)
> {
> - GLuint texObj;
> -
> /* prefer texture rectangle */
> if (_mesa_is_desktop_gl(ctx) && ctx->Extensions.NV_texture_rectangle) {
> tex->Target = GL_TEXTURE_RECTANGLE;
> @@ -1245,21 +1244,13 @@ init_temp_texture(struct gl_context *ctx, struct temp_texture *tex)
> tex->MinSize = 16; /* 16 x 16 at least */
> assert(tex->MaxSize > 0);
>
> - _mesa_CreateTextures(tex->Target, 1, &texObj);
> - tex->tex_obj = NULL;
> -
> - if (texObj == 0)
> - return;
> -
> - tex->tex_obj = _mesa_lookup_texture(ctx, texObj);
> + tex->tex_obj = ctx->Driver.NewTextureObject(ctx, 0xDEADBEEF, tex->Target);
> }
>
> static void
> -cleanup_temp_texture(struct temp_texture *tex)
> +cleanup_temp_texture(struct gl_context *ctx, struct temp_texture *tex)
> {
> - if (tex->tex_obj == NULL)
> - return;
> - _mesa_DeleteTextures(1, &tex->tex_obj->Name);
> + _mesa_delete_nameless_texture(ctx, tex->tex_obj);
> tex->tex_obj = NULL;
> }
>
> diff --git a/src/mesa/drivers/common/meta_blit.c b/src/mesa/drivers/common/meta_blit.c
> index 95dfa64..496ef28 100644
> --- a/src/mesa/drivers/common/meta_blit.c
> +++ b/src/mesa/drivers/common/meta_blit.c
> @@ -879,9 +879,7 @@ _mesa_meta_fb_tex_blit_end(struct gl_context *ctx, GLenum target,
> _mesa_bind_sampler(ctx, ctx->Texture.CurrentUnit, blit->samp_obj_save);
> _mesa_reference_sampler_object(ctx, &blit->samp_obj_save, NULL);
> _mesa_reference_sampler_object(ctx, &blit->samp_obj, NULL);
> -
> - if (blit->temp_tex_obj)
> - _mesa_DeleteTextures(1, &blit->temp_tex_obj->Name);
> + _mesa_delete_nameless_texture(ctx, blit->temp_tex_obj);
> }
>
> struct gl_texture_object *
> @@ -890,20 +888,14 @@ _mesa_meta_texture_object_from_renderbuffer(struct gl_context *ctx,
> {
> struct gl_texture_image *texImage;
> struct gl_texture_object *texObj;
> - GLuint tempTex;
> const GLenum target = rb->NumSamples > 1
> ? GL_TEXTURE_2D_MULTISAMPLE : GL_TEXTURE_2D;
>
> - tempTex = 0;
> - _mesa_CreateTextures(target, 1, &tempTex);
> - if (tempTex == 0)
> - return NULL;
> -
> - texObj = _mesa_lookup_texture(ctx, tempTex);
> + texObj = ctx->Driver.NewTextureObject(ctx, 0xDEADBEEF, target);
> texImage = _mesa_get_tex_image(ctx, texObj, target, 0);
>
> if (!ctx->Driver.BindRenderbufferTexImage(ctx, rb, texImage)) {
> - _mesa_DeleteTextures(1, &tempTex);
> + _mesa_delete_nameless_texture(ctx, texObj);
> return NULL;
> }
>
> @@ -912,8 +904,6 @@ _mesa_meta_texture_object_from_renderbuffer(struct gl_context *ctx,
> ctx->Driver.FinishRenderTexture(ctx, rb);
> }
>
> - assert(target == texObj->Target);
> - assert(tempTex == texObj->Name);
> return texObj;
> }
>
> @@ -1057,7 +1047,7 @@ _mesa_meta_glsl_blit_cleanup(struct gl_context *ctx, struct blit_state *blit)
> _mesa_meta_blit_shader_table_cleanup(ctx, &blit->shaders_without_depth);
>
> if (blit->depthTex.tex_obj != NULL) {
> - _mesa_DeleteTextures(1, &blit->depthTex.tex_obj->Name);
> + _mesa_delete_nameless_texture(ctx, blit->depthTex.tex_obj);
> blit->depthTex.tex_obj = NULL;
> }
> }
>
More information about the mesa-dev
mailing list