summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2022-12-18 16:44:48 -0500
committerMarek Olšák <marek.olsak@amd.com>2023-01-20 21:34:09 -0500
commit797b8391110fba4114de9f946f912238a6cf568b (patch)
tree60b7669c339d021bad2729b86bbd157998281d0f /src
parentaca09e4f71937f602b52c3ad42f2afc7fa91a8b2 (diff)
glthread: disallow glthread if buffer uploads are unsupported
to remove fail paths that defeat the purpose of glthread. Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20824>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/main/consts_exts.h6
-rw-r--r--src/mesa/main/glthread.c10
-rw-r--r--src/mesa/main/glthread.h3
-rw-r--r--src/mesa/main/glthread_bufferobj.c5
-rw-r--r--src/mesa/main/glthread_draw.c15
-rw-r--r--src/mesa/state_tracker/st_extensions.c3
6 files changed, 8 insertions, 34 deletions
diff --git a/src/mesa/main/consts_exts.h b/src/mesa/main/consts_exts.h
index e7be7f21be5..33e6d7ec9d9 100644
--- a/src/mesa/main/consts_exts.h
+++ b/src/mesa/main/consts_exts.h
@@ -923,12 +923,6 @@ struct gl_constants
/** When drivers are OK with mapped buffers during draw and other calls. */
bool AllowMappedBuffersDuringExecution;
- /**
- * Whether buffer creation, unsynchronized mapping, unmapping, and
- * deletion is thread-safe.
- */
- bool BufferCreateMapUnsynchronizedThreadSafe;
-
/** Override GL_MAP_UNSYNCHRONIZED_BIT */
bool ForceMapBufferSynchronized;
diff --git a/src/mesa/main/glthread.c b/src/mesa/main/glthread.c
index af9da31e106..680fc1a154c 100644
--- a/src/mesa/main/glthread.c
+++ b/src/mesa/main/glthread.c
@@ -107,10 +107,14 @@ _mesa_glthread_init_dispatch(struct gl_context *ctx,
void
_mesa_glthread_init(struct gl_context *ctx)
{
+ struct pipe_screen *screen = ctx->screen;
struct glthread_state *glthread = &ctx->GLThread;
-
assert(!glthread->enabled);
+ if (!screen->get_param(screen, PIPE_CAP_MAP_UNSYNCHRONIZED_THREAD_SAFE) ||
+ !screen->get_param(screen, PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION))
+ return;
+
if (!util_queue_init(&glthread->queue, "gl", MARSHAL_MAX_BATCHES - 2,
1, 0, NULL)) {
return;
@@ -144,10 +148,6 @@ _mesa_glthread_init(struct gl_context *ctx)
glthread->enabled = true;
glthread->stats.queue = &glthread->queue;
- glthread->SupportsBufferUploads =
- ctx->Const.BufferCreateMapUnsynchronizedThreadSafe &&
- ctx->Const.AllowMappedBuffersDuringExecution;
-
ctx->CurrentClientDispatch = ctx->MarshalExec;
glthread->LastDListChangeBatchIndex = -1;
diff --git a/src/mesa/main/glthread.h b/src/mesa/main/glthread.h
index 23cfce82806..d752ca9ef7a 100644
--- a/src/mesa/main/glthread.h
+++ b/src/mesa/main/glthread.h
@@ -204,9 +204,6 @@ struct glthread_state
unsigned upload_offset;
int upload_buffer_private_refcount;
- /** Caps. */
- GLboolean SupportsBufferUploads;
-
/** Primitive restart state. */
bool PrimitiveRestart;
bool PrimitiveRestartFixedIndex;
diff --git a/src/mesa/main/glthread_bufferobj.c b/src/mesa/main/glthread_bufferobj.c
index 00d79942720..34e6ce5a907 100644
--- a/src/mesa/main/glthread_bufferobj.c
+++ b/src/mesa/main/glthread_bufferobj.c
@@ -32,8 +32,6 @@
static struct gl_buffer_object *
new_upload_buffer(struct gl_context *ctx, GLsizeiptr size, uint8_t **ptr)
{
- assert(ctx->GLThread.SupportsBufferUploads);
-
struct gl_buffer_object *obj =
_mesa_bufferobj_alloc(ctx, -1);
if (!obj)
@@ -506,8 +504,7 @@ _mesa_marshal_BufferSubData_merged(GLuint target_or_name, GLintptr offset,
* If offset == 0 and size == buffer_size, it's better to discard
* the buffer storage, but we don't know the buffer size in glthread.
*/
- if (ctx->GLThread.SupportsBufferUploads &&
- ctx->Const.AllowGLThreadBufferSubDataOpt &&
+ if (ctx->Const.AllowGLThreadBufferSubDataOpt &&
data && offset > 0 && size > 0) {
struct gl_buffer_object *upload_buffer = NULL;
unsigned upload_offset = 0;
diff --git a/src/mesa/main/glthread_draw.c b/src/mesa/main/glthread_draw.c
index 006663a9ca6..30ecb504854 100644
--- a/src/mesa/main/glthread_draw.c
+++ b/src/mesa/main/glthread_draw.c
@@ -455,13 +455,6 @@ 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) {
- _mesa_glthread_finish_before(ctx, "DrawArrays");
- CALL_DrawArraysInstancedBaseInstance(ctx->CurrentServerDispatch,
- (mode, first, count, instance_count,
- baseinstance));
- return;
- }
if (!upload_vertices(ctx, user_buffer_mask, first, count, baseinstance,
instance_count, buffers))
@@ -572,8 +565,7 @@ _mesa_marshal_MultiDrawArrays(GLenum mode, const GLint *first,
assert(draw_count > 0);
/* If the draw count is too high, the queue can't be used. */
- if (!ctx->GLThread.SupportsBufferUploads ||
- draw_count > MARSHAL_MAX_CMD_SIZE / 16)
+ if (draw_count > MARSHAL_MAX_CMD_SIZE / 16)
goto sync;
unsigned min_index = ~0;
@@ -927,9 +919,6 @@ draw_elements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices,
return;
}
- if (!ctx->GLThread.SupportsBufferUploads)
- goto sync;
-
bool need_index_bounds = user_buffer_mask & ~vao->NonZeroDivisorMask;
unsigned index_size = get_index_size(type);
@@ -1179,7 +1168,7 @@ _mesa_marshal_MultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count,
bool need_index_bounds = user_buffer_mask & ~vao->NonZeroDivisorMask;
/* If the draw count is negative, the queue can't be used. */
- if (!ctx->GLThread.SupportsBufferUploads || draw_count < 0)
+ if (draw_count < 0)
goto sync;
unsigned index_size = get_index_size(type);
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index d232a4764c5..2a8b3700cbc 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -587,9 +587,6 @@ void st_init_limits(struct pipe_screen *screen,
c->AllowMappedBuffersDuringExecution =
screen->get_param(screen, PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION);
- c->BufferCreateMapUnsynchronizedThreadSafe =
- screen->get_param(screen, PIPE_CAP_MAP_UNSYNCHRONIZED_THREAD_SAFE);
-
c->UseSTD430AsDefaultPacking =
screen->get_param(screen, PIPE_CAP_LOAD_CONSTBUF);