mesa: Implement label sharing from GL objects with UM drivers

At the moment, the string passed to glObjectLabel() stays only within the
confines of GL objects. It would be nice if that textual description could
be made known to the underlying drivers somehow.

Expand the pipe screen function interface to allow passing GL object labels
down to the UM driver that handles a particular pipe screen.

Not all GL objects have an associated GL resources, so this behaviour has
been implemented for those which are associated with at least one.

Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Acked-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34224>
This commit is contained in:
Adrián Larumbe 2025-06-11 01:53:52 +01:00 committed by Marge Bot
parent 3bd0e58d66
commit a4ffd2395f
2 changed files with 106 additions and 7 deletions

View file

@ -309,6 +309,20 @@ struct pipe_screen {
struct winsys_handle *handle, struct winsys_handle *handle,
unsigned usage); unsigned usage);
/**
* Tell the driver that manages a pipe resource about its label.
*
* For GL objects that contain one or more pipe resources, make the gallium
* driver that manages them aware of their label.
*
* \param label A NUL-terminated string. It will remain valid only until
* the end of the call, so its lifetime must be managed by the implementer.
*
*/
void (*set_resource_label)(struct pipe_screen *pscreen,
struct pipe_resource *presource,
const char *label);
/** /**
* Get info for the given pipe resource without the need to get a * Get info for the given pipe resource without the need to get a
* winsys_handle. * winsys_handle.

View file

@ -38,15 +38,94 @@
#include "transformfeedback.h" #include "transformfeedback.h"
#include "api_exec_decl.h" #include "api_exec_decl.h"
#include "pipe/p_screen.h"
/**
* Helper for set_object_label().
*/
static void
set_resource_label(struct pipe_resource *rsc, const char *labelPtr)
{
if (rsc) {
assert(rsc->screen->set_resource_label);
rsc->screen->set_resource_label(rsc->screen, rsc, labelPtr);
}
}
/**
* Helper for set_label().
*/
static void
set_object_label(struct gl_context *ctx, GLenum identifier, GLuint name,
const char *labelPtr, const char *caller)
{
switch (identifier) {
case GL_BUFFER:
case GL_BUFFER_OBJECT_EXT:
{
struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, name);
if (bufObj && bufObj->buffer)
set_resource_label(bufObj->buffer, labelPtr);
}
break;
case GL_VERTEX_ARRAY:
case GL_VERTEX_ARRAY_OBJECT_EXT:
{
struct gl_vertex_array_object *obj = _mesa_lookup_vao(ctx, name);
if (obj) {
for (int i = 0; i < VERT_ATTRIB_MAX; i++) {
GLuint bindingIndex = obj->VertexAttrib[i].BufferBindingIndex;
struct gl_buffer_object *bufObj = obj->BufferBinding[bindingIndex].BufferObj;
if (bufObj)
set_resource_label(bufObj->buffer, labelPtr);
}
if (obj->IndexBufferObj)
set_resource_label(obj->IndexBufferObj->buffer, labelPtr);
}
}
break;
case GL_TEXTURE:
{
struct gl_texture_object *texObj = _mesa_lookup_texture(ctx, name);
if (texObj) {
if (texObj->BufferObject)
set_resource_label(texObj->BufferObject->buffer, labelPtr);
for (unsigned i = 0; i < MAX_FACES-1; ++i) {
for (unsigned j = 0; j < MAX_TEXTURE_LEVELS; j++)
if (texObj->Image[i][j])
set_resource_label(texObj->Image[i][j]->pt, labelPtr);
}
}
}
break;
case GL_RENDERBUFFER:
{
struct gl_renderbuffer *rb = _mesa_lookup_renderbuffer(ctx, name);
if (rb) {
if (rb->TexImage)
set_resource_label(rb->TexImage->pt, labelPtr);
set_resource_label(rb->texture, labelPtr);
set_resource_label(rb->surface.texture, labelPtr);
}
}
break;
default:
return;
}
}
/** /**
* Helper for _mesa_ObjectLabel() and _mesa_ObjectPtrLabel(). * Helper for _mesa_ObjectLabel() and _mesa_ObjectPtrLabel().
*/ */
static void static void
set_label(struct gl_context *ctx, char **labelPtr, const char *label, set_label(struct gl_context *ctx, GLenum identifier, GLuint name, char **labelPtr,
int length, const char *caller, bool ext_length) const char *label, int length, const char *caller, bool ext_length)
{ {
free(*labelPtr); char *old_label = *labelPtr;
*labelPtr = NULL; *labelPtr = NULL;
/* set new label string */ /* set new label string */
@ -74,7 +153,7 @@ set_label(struct gl_context *ctx, char **labelPtr, const char *label,
_mesa_error(ctx, GL_INVALID_VALUE, _mesa_error(ctx, GL_INVALID_VALUE,
"%s(label length=%d, is less than zero)", caller, "%s(label length=%d, is less than zero)", caller,
length); length);
return; goto set_resource_label;
} }
int len = strlen(label); int len = strlen(label);
@ -88,6 +167,12 @@ set_label(struct gl_context *ctx, char **labelPtr, const char *label,
*labelPtr = strdup(label); *labelPtr = strdup(label);
} }
} }
set_resource_label:
if (identifier && name && ctx->screen->set_resource_label)
set_object_label(ctx, identifier, name, *labelPtr, caller);
free(old_label);
} }
/** /**
@ -276,7 +361,7 @@ _mesa_LabelObjectEXT(GLenum identifier, GLuint name, GLsizei length,
if (!labelPtr) if (!labelPtr)
return; return;
set_label(ctx, labelPtr, label, length, callerstr, true); set_label(ctx, identifier, name, labelPtr, label, length, callerstr, true);
} }
void GLAPIENTRY void GLAPIENTRY
@ -317,7 +402,7 @@ _mesa_ObjectLabel(GLenum identifier, GLuint name, GLsizei length,
if (!labelPtr) if (!labelPtr)
return; return;
set_label(ctx, labelPtr, label, length, callerstr, false); set_label(ctx, identifier, name, labelPtr, label, length, callerstr, false);
} }
void GLAPIENTRY void GLAPIENTRY
@ -369,7 +454,7 @@ _mesa_ObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
labelPtr = &syncObj->Label; labelPtr = &syncObj->Label;
set_label(ctx, labelPtr, label, length, callerstr, false); set_label(ctx, 0, 0, labelPtr, label, length, callerstr, false);
_mesa_unref_sync_object(ctx, syncObj, 1); _mesa_unref_sync_object(ctx, syncObj, 1);
} }