summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2023-01-17 14:37:03 -0500
committerMarek Olšák <marek.olsak@amd.com>2023-01-20 21:34:09 -0500
commit68a926a15b7b3724a29c050b8595177a32fc67a1 (patch)
treee2e7bb39951c033a000bd8910707bd08f2f302a1
parente39b90311cadf5efa9016c8521e616087b9f1025 (diff)
glthread: set GL_OUT_OF_MEMORY if we fail to upload vertices
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20824>
-rw-r--r--src/mesa/main/glthread_draw.c40
1 files changed, 28 insertions, 12 deletions
diff --git a/src/mesa/main/glthread_draw.c b/src/mesa/main/glthread_draw.c
index a89c6b2c2d2..c17a1c41860 100644
--- a/src/mesa/main/glthread_draw.c
+++ b/src/mesa/main/glthread_draw.c
@@ -202,7 +202,13 @@ upload_vertices(struct gl_context *ctx, unsigned user_buffer_mask,
_mesa_glthread_upload(ctx, (uint8_t*)ptr + start,
end - start, &upload_offset,
&upload_buffer, NULL, ctx->Const.VertexBufferOffsetIsInt32 ? 0 : start);
- assert(upload_buffer);
+ if (!upload_buffer) {
+ for (unsigned i = 0; i < num_buffers; i++)
+ _mesa_reference_buffer_object(ctx, &buffers->buffer, NULL);
+
+ _mesa_marshal_InternalSetError(GL_OUT_OF_MEMORY);
+ return false;
+ }
buffers[num_buffers].buffer = upload_buffer;
buffers[num_buffers].offset = upload_offset - start;
@@ -257,7 +263,13 @@ upload_vertices(struct gl_context *ctx, unsigned user_buffer_mask,
_mesa_glthread_upload(ctx, (uint8_t*)ptr + offset,
size, &upload_offset, &upload_buffer, NULL,
ctx->Const.VertexBufferOffsetIsInt32 ? 0 : offset);
- assert(upload_buffer);
+ if (!upload_buffer) {
+ for (unsigned i = 0; i < num_buffers; i++)
+ _mesa_reference_buffer_object(ctx, &buffers->buffer, NULL);
+
+ _mesa_marshal_InternalSetError(GL_OUT_OF_MEMORY);
+ return false;
+ }
buffers[num_buffers].buffer = upload_buffer;
buffers[num_buffers].offset = upload_offset - offset;
@@ -443,9 +455,7 @@ draw_arrays(GLenum mode, GLint first, GLsizei count, GLsizei instance_count,
/* Upload and draw. */
struct glthread_attrib_binding buffers[VERT_ATTRIB_MAX];
- if (!ctx->GLThread.SupportsBufferUploads ||
- !upload_vertices(ctx, user_buffer_mask, first, count, baseinstance,
- instance_count, buffers)) {
+ if (!ctx->GLThread.SupportsBufferUploads) {
_mesa_glthread_finish_before(ctx, "DrawArrays");
CALL_DrawArraysInstancedBaseInstance(ctx->CurrentServerDispatch,
(mode, first, count, instance_count,
@@ -453,6 +463,10 @@ draw_arrays(GLenum mode, GLint first, GLsizei count, GLsizei instance_count,
return;
}
+ if (!upload_vertices(ctx, user_buffer_mask, first, count, baseinstance,
+ instance_count, buffers))
+ return; /* the error is set by upload_vertices */
+
draw_arrays_async_user(ctx, mode, first, count, instance_count, baseinstance,
user_buffer_mask, buffers);
}
@@ -588,7 +602,7 @@ _mesa_marshal_MultiDrawArrays(GLenum mode, const GLint *first,
struct glthread_attrib_binding buffers[VERT_ATTRIB_MAX];
if (!upload_vertices(ctx, user_buffer_mask, min_index, num_vertices,
0, 1, buffers))
- goto sync;
+ return; /* the error is set by upload_vertices */
multi_draw_arrays_async(ctx, mode, first, count, draw_count,
user_buffer_mask, buffers);
@@ -946,8 +960,9 @@ draw_elements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,
struct glthread_attrib_binding buffers[VERT_ATTRIB_MAX];
if (user_buffer_mask) {
- upload_vertices(ctx, user_buffer_mask, start_vertex, num_vertices,
- baseinstance, instance_count, buffers);
+ if (!upload_vertices(ctx, user_buffer_mask, start_vertex, num_vertices,
+ baseinstance, instance_count, buffers))
+ return; /* the error is set by upload_vertices */
}
/* Upload indices. */
@@ -1219,10 +1234,11 @@ _mesa_marshal_MultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count,
/* Upload vertices. */
struct glthread_attrib_binding buffers[VERT_ATTRIB_MAX];
- if (user_buffer_mask &&
- !upload_vertices(ctx, user_buffer_mask, min_index, num_vertices,
- 0, 1, buffers))
- goto sync;
+ if (user_buffer_mask) {
+ if (!upload_vertices(ctx, user_buffer_mask, min_index, num_vertices,
+ 0, 1, buffers))
+ return; /* the error is set by upload_vertices */
+ }
/* Upload indices. */
struct gl_buffer_object *index_buffer = NULL;