[Mesa-dev] [PATCH 16/23] meta: Don't pollute the buffer object namespace in _mesa_meta_setup_vertex_objects

Anuj Phogat anuj.phogat at gmail.com
Tue Nov 10 10:44:38 PST 2015


On Mon, Nov 9, 2015 at 4:56 PM, Ian Romanick <idr at freedesktop.org> 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 | 17 +++--------------
>  1 file changed, 3 insertions(+), 14 deletions(-)
>
> diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
> index 3507927..8249eda 100644
> --- a/src/mesa/drivers/common/meta.c
> +++ b/src/mesa/drivers/common/meta.c
> @@ -339,8 +339,6 @@ _mesa_meta_setup_vertex_objects(struct gl_context *ctx,
>                                  unsigned vertex_size, unsigned texcoord_size,
>                                  unsigned color_size)
>  {
> -   GLuint VBO;
> -
>     if (*VAO == 0) {
>        struct gl_vertex_array_object *array_obj;
>        assert(*buf_obj == NULL);
> @@ -353,22 +351,13 @@ _mesa_meta_setup_vertex_objects(struct gl_context *ctx,
>        assert(array_obj != NULL);
>
>        /* create vertex array buffer */
> -      _mesa_CreateBuffers(1, &VBO);
> -      *buf_obj = _mesa_lookup_bufferobj(ctx, VBO);
> -
> -      /* _mesa_lookup_bufferobj only returns NULL if name is 0.  If the object
> -       * does not yet exist (i.e., hasn't been bound) it will return a dummy
> -       * object that you can't do anything with.  _mesa_CreateBuffers also
> -       * makes the object exist.
> -       */
> -      assert(*buf_obj != NULL && (*buf_obj)->Name == VBO);
> -      assert(*buf_obj != ctx->Array.ArrayBufferObj);
> +      *buf_obj = ctx->Driver.NewBufferObject(ctx, 0xDEADBEEF);
> +      if (*buf_obj == NULL)
> +         return;
>
>        _mesa_buffer_data(ctx, *buf_obj, GL_NONE, 4 * sizeof(struct vertex), NULL,
>                          GL_DYNAMIC_DRAW, __func__);
>
> -      assert((*buf_obj)->Size == 4 * sizeof(struct vertex));
> -
>        /* setup vertex arrays */
>        if (use_generic_attributes) {
>           assert(color_size == 0);
> --
> 2.1.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>


More information about the mesa-dev mailing list