mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 11:58:10 +02:00
st/mesa: Validate the result of pipe_transfer_map in make_texture (v2)
When using Freecad, I was getting intermittent segfaults inside of
mesa. I traced it down to this path in st_cb_drawpixels.c where the
result of pipe_transfer_map wasn't being checked. In my case, it was
returning NULL because nouveau_bo_new returned ENOENT. I'm by no
means a mesa developer, but this patch solves the problem for me and
seems reasonable enough.
v2: Marek - also unmap the PBO and release the texture, and call
the make_texture function sooner for less cleanup
Cc: 18.1 18.2 <mesa-stable@lists.freedesktop.org>
This commit is contained in:
parent
c79aad30ae
commit
936e0dcd61
1 changed files with 12 additions and 8 deletions
|
|
@ -566,7 +566,11 @@ make_texture(struct st_context *st,
|
|||
dest = pipe_transfer_map(pipe, pt, 0, 0,
|
||||
PIPE_TRANSFER_WRITE, 0, 0,
|
||||
width, height, &transfer);
|
||||
|
||||
if (!dest) {
|
||||
pipe_resource_reference(&pt, NULL);
|
||||
_mesa_unmap_pbo_source(ctx, unpack);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Put image into texture transfer.
|
||||
* Note that the image is actually going to be upside down in
|
||||
|
|
@ -1174,6 +1178,13 @@ st_DrawPixels(struct gl_context *ctx, GLint x, GLint y,
|
|||
return;
|
||||
}
|
||||
|
||||
/* Put glDrawPixels image into a texture */
|
||||
pt = make_texture(st, width, height, format, type, unpack, pixels);
|
||||
if (!pt) {
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glDrawPixels");
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get vertex/fragment shaders
|
||||
*/
|
||||
|
|
@ -1200,13 +1211,6 @@ st_DrawPixels(struct gl_context *ctx, GLint x, GLint y,
|
|||
st_upload_constants(st, &st->fp->Base);
|
||||
}
|
||||
|
||||
/* Put glDrawPixels image into a texture */
|
||||
pt = make_texture(st, width, height, format, type, unpack, pixels);
|
||||
if (!pt) {
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glDrawPixels");
|
||||
return;
|
||||
}
|
||||
|
||||
/* create sampler view for the image */
|
||||
sv[0] = st_create_texture_sampler_view(st->pipe, pt);
|
||||
if (!sv[0]) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue