[Mesa-dev] [PATCH 21/23] meta/TexSubImage: Don't pollute the buffer object namespace
Anuj Phogat
anuj.phogat at gmail.com
Fri Nov 13 10:44:10 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_tex_subimage.c | 42 ++++++++++++++++-------------
> 1 file changed, 24 insertions(+), 18 deletions(-)
>
> diff --git a/src/mesa/drivers/common/meta_tex_subimage.c b/src/mesa/drivers/common/meta_tex_subimage.c
> index b0ac677..4adaad7 100644
> --- a/src/mesa/drivers/common/meta_tex_subimage.c
> +++ b/src/mesa/drivers/common/meta_tex_subimage.c
> @@ -69,7 +69,7 @@ create_texture_for_pbo(struct gl_context *ctx,
> int dims, int width, int height, int depth,
> GLenum format, GLenum type, const void *pixels,
> const struct gl_pixelstore_attrib *packing,
> - GLuint *tmp_pbo, GLuint *tmp_tex)
> + struct gl_buffer_object **tmp_pbo, GLuint *tmp_tex)
> {
> uint32_t pbo_format;
> GLenum internal_format;
> @@ -101,7 +101,7 @@ create_texture_for_pbo(struct gl_context *ctx,
> row_stride = _mesa_image_row_stride(packing, width, format, type);
>
> if (_mesa_is_bufferobj(packing->BufferObj)) {
> - *tmp_pbo = 0;
> + *tmp_pbo = NULL;
> buffer_obj = packing->BufferObj;
> first_pixel += (intptr_t)pixels;
> } else {
> @@ -109,23 +109,27 @@ create_texture_for_pbo(struct gl_context *ctx,
>
> assert(create_pbo);
>
> - _mesa_CreateBuffers(1, tmp_pbo);
> + *tmp_pbo = ctx->Driver.NewBufferObject(ctx, 0xDEADBEEF);
> + if (*tmp_pbo == NULL)
> + return NULL;
>
> /* In case of GL_PIXEL_PACK_BUFFER, pass null pointer for the pixel
> - * data to avoid unnecessary data copying in _mesa_NamedBufferData().
> + * data to avoid unnecessary data copying in _mesa_buffer_data.
> */
> if (is_pixel_pack)
> - _mesa_NamedBufferData(*tmp_pbo,
> - last_pixel - first_pixel,
> - NULL,
> - GL_STREAM_READ);
> + _mesa_buffer_data(ctx, *tmp_pbo, GL_NONE,
> + last_pixel - first_pixel,
> + NULL,
> + GL_STREAM_READ,
> + __func__);
> else
> - _mesa_NamedBufferData(*tmp_pbo,
> - last_pixel - first_pixel,
> - (char *)pixels + first_pixel,
> - GL_STREAM_DRAW);
> + _mesa_buffer_data(ctx, *tmp_pbo, GL_NONE,
> + last_pixel - first_pixel,
> + (char *)pixels + first_pixel,
> + GL_STREAM_DRAW,
> + __func__);
>
> - buffer_obj = _mesa_lookup_bufferobj(ctx, *tmp_pbo);
> + buffer_obj = *tmp_pbo;
> first_pixel = 0;
> }
>
> @@ -157,7 +161,7 @@ create_texture_for_pbo(struct gl_context *ctx,
> row_stride,
> read_only)) {
> _mesa_DeleteTextures(1, tmp_tex);
> - _mesa_DeleteBuffers(1, tmp_pbo);
> + _mesa_reference_buffer_object(ctx, tmp_pbo, NULL);
> return NULL;
> }
>
> @@ -173,7 +177,8 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx, GLuint dims,
> bool allocate_storage, bool create_pbo,
> const struct gl_pixelstore_attrib *packing)
> {
> - GLuint pbo = 0, pbo_tex = 0, fbos[2] = { 0, 0 };
> + struct gl_buffer_object *pbo = NULL;
> + GLuint pbo_tex = 0, fbos[2] = { 0, 0 };
> int image_height;
> struct gl_texture_image *pbo_tex_image;
> GLenum status;
> @@ -276,7 +281,7 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx, GLuint dims,
> fail:
> _mesa_DeleteFramebuffers(2, fbos);
> _mesa_DeleteTextures(1, &pbo_tex);
> - _mesa_DeleteBuffers(1, &pbo);
> + _mesa_reference_buffer_object(ctx, &pbo, NULL);
>
> _mesa_meta_end(ctx);
>
> @@ -291,7 +296,8 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, GLuint dims,
> GLenum format, GLenum type, const void *pixels,
> const struct gl_pixelstore_attrib *packing)
> {
> - GLuint pbo = 0, pbo_tex = 0, fbos[2] = { 0, 0 };
> + struct gl_buffer_object *pbo = NULL;
> + GLuint pbo_tex = 0, fbos[2] = { 0, 0 };
> int image_height;
> struct gl_texture_image *pbo_tex_image;
> struct gl_renderbuffer *rb = NULL;
> @@ -448,7 +454,7 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, GLuint dims,
> fail:
> _mesa_DeleteFramebuffers(2, fbos);
> _mesa_DeleteTextures(1, &pbo_tex);
> - _mesa_DeleteBuffers(1, &pbo);
> + _mesa_reference_buffer_object(ctx, &pbo, NULL);
>
> _mesa_meta_end(ctx);
>
> --
> 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