mesa: add EXT_debug_label support

KHR_debug provides the same functionality but this extension is
still in use and adding support for it seems fairly harmless.

For example its used by Unity and without it we keep
getting given apitraces from Unity games that just spew out
unsupported function errors due to the missing support.

Acked-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19029>
This commit is contained in:
Timothy Arceri
2022-10-06 10:44:39 +11:00
parent 70fef47633
commit 675bcbb7a1
4 changed files with 82 additions and 8 deletions

View File

@@ -12595,6 +12595,23 @@
<enum name="GPU_MEMORY_INFO_EVICTED_MEMORY_NVX" value="0x904B" />
</category>
<category name="GL_EXT_debug_label" number="439">
<function name="LabelObjectEXT" es1="1.1" es2="2.0">
<param name="type" type="GLenum"/>
<param name="object" type="GLuint"/>
<param name="length" type="GLsizei"/>
<param name="label" type="const GLchar *"/>
</function>
<function name="GetObjectLabelEXT" es1="1.1" es2="2.0">
<param name="type" type="GLenum"/>
<param name="object" type="GLuint"/>
<param name="bufSize" type="GLsizei"/>
<param name="length" type="GLsizei *"/>
<param name="label" type="GLchar *"/>
</function>
</category>
<xi:include href="AMD_gpu_shader_int64.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
<category name="GL_NV_fill_rectangle" number="466">

View File

@@ -1695,6 +1695,8 @@ offsets = {
"ImportSemaphoreWin32HandleEXT": 1659,
"ImportMemoryWin32NameEXT": 1660,
"ImportSemaphoreWin32NameEXT": 1661,
"GetObjectLabelEXT": 1662,
"LabelObjectEXT": 1663,
}
functions = [
@@ -2139,6 +2141,7 @@ functions = [
"GetnUniformuiv",
"GetnUniformuivARB",
"GetObjectLabel",
"GetObjectLabelEXT"
"GetObjectParameterfvARB",
"GetObjectParameterivARB",
"GetObjectPtrLabel",
@@ -2270,6 +2273,7 @@ functions = [
"IsTextureEXT",
"IsTransformFeedback",
"IsVertexArray",
"LabelObjectEXT",
"Lightf",
"Lightfv",
"Lighti",

View File

@@ -232,6 +232,7 @@ EXT(EXT_compiled_vertex_array , dummy_true
EXT(EXT_compressed_ETC1_RGB8_sub_texture , OES_compressed_ETC1_RGB8_texture , x , x , ES1, ES2, 2014)
EXT(EXT_copy_image , OES_copy_image , x , x , x , 30, 2014)
EXT(EXT_copy_texture , dummy_true , GLL, x , x , x , 1995)
EXT(EXT_debug_label , dummy_true , GLL, GLC, 11, ES2, 2013)
EXT(EXT_demote_to_helper_invocation , EXT_demote_to_helper_invocation , GLL, GLC, ES1, ES2, 2019)
EXT(EXT_depth_bounds_test , EXT_depth_bounds_test , GLL, GLC, x , x , 2002)
EXT(EXT_depth_clamp , ARB_depth_clamp , x , x , x , ES2, 2019)

View File

@@ -44,14 +44,15 @@
*/
static void
set_label(struct gl_context *ctx, char **labelPtr, const char *label,
int length, const char *caller)
int length, const char *caller, bool ext_length)
{
free(*labelPtr);
*labelPtr = NULL;
/* set new label string */
if (label) {
if (length >= 0) {
if ((!ext_length && length >= 0) ||
(ext_length && length > 0)) {
if (length >= MAX_LABEL_LENGTH)
_mesa_error(ctx, GL_INVALID_VALUE,
"%s(length=%d, which is not less than "
@@ -69,6 +70,13 @@ set_label(struct gl_context *ctx, char **labelPtr, const char *label,
}
}
else {
if (ext_length && length < 0) {
_mesa_error(ctx, GL_INVALID_VALUE,
"%s(label length=%d, is less than zero)", caller,
length);
return;
}
int len = strlen(label);
if (len >= MAX_LABEL_LENGTH)
_mesa_error(ctx, GL_INVALID_VALUE,
@@ -133,12 +141,15 @@ copy_label(const GLchar *src, GLchar *dst, GLsizei *length, GLsizei bufSize)
*/
static char **
get_label_pointer(struct gl_context *ctx, GLenum identifier, GLuint name,
const char *caller)
const char *caller, bool ext_errors)
{
char **labelPtr = NULL;
GLenum no_match_error =
ext_errors ? GL_INVALID_OPERATION : GL_INVALID_VALUE;
switch (identifier) {
case GL_BUFFER:
case GL_BUFFER_OBJECT_EXT:
{
struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, name);
if (bufObj)
@@ -146,6 +157,7 @@ get_label_pointer(struct gl_context *ctx, GLenum identifier, GLuint name,
}
break;
case GL_SHADER:
case GL_SHADER_OBJECT_EXT:
{
struct gl_shader *shader = _mesa_lookup_shader(ctx, name);
if (shader)
@@ -153,6 +165,7 @@ get_label_pointer(struct gl_context *ctx, GLenum identifier, GLuint name,
}
break;
case GL_PROGRAM:
case GL_PROGRAM_OBJECT_EXT:
{
struct gl_shader_program *program =
_mesa_lookup_shader_program(ctx, name);
@@ -161,6 +174,7 @@ get_label_pointer(struct gl_context *ctx, GLenum identifier, GLuint name,
}
break;
case GL_VERTEX_ARRAY:
case GL_VERTEX_ARRAY_OBJECT_EXT:
{
struct gl_vertex_array_object *obj = _mesa_lookup_vao(ctx, name);
if (obj)
@@ -168,6 +182,7 @@ get_label_pointer(struct gl_context *ctx, GLenum identifier, GLuint name,
}
break;
case GL_QUERY:
case GL_QUERY_OBJECT_EXT:
{
struct gl_query_object *query = _mesa_lookup_query_object(ctx, name);
if (query)
@@ -225,6 +240,7 @@ get_label_pointer(struct gl_context *ctx, GLenum identifier, GLuint name,
}
break;
case GL_PROGRAM_PIPELINE:
case GL_PROGRAM_PIPELINE_OBJECT_EXT:
{
struct gl_pipeline_object *pipe =
_mesa_lookup_pipeline_object(ctx, name);
@@ -237,7 +253,7 @@ get_label_pointer(struct gl_context *ctx, GLenum identifier, GLuint name,
}
if (NULL == labelPtr) {
_mesa_error(ctx, GL_INVALID_VALUE, "%s(name = %u)", caller, name);
_mesa_error(ctx, no_match_error, "%s(name = %u)", caller, name);
}
return labelPtr;
@@ -248,6 +264,42 @@ invalid_enum:
return NULL;
}
void GLAPIENTRY
_mesa_LabelObjectEXT(GLenum identifier, GLuint name, GLsizei length,
const GLchar *label)
{
GET_CURRENT_CONTEXT(ctx);
const char *callerstr = "glLabelObjectEXT";
char **labelPtr;
labelPtr = get_label_pointer(ctx, identifier, name, callerstr, true);
if (!labelPtr)
return;
set_label(ctx, labelPtr, label, length, callerstr, true);
}
void GLAPIENTRY
_mesa_GetObjectLabelEXT(GLenum identifier, GLuint name, GLsizei bufSize,
GLsizei *length, GLchar *label)
{
GET_CURRENT_CONTEXT(ctx);
const char *callerstr = "glGetObjectLabelEXT";
char **labelPtr;
if (bufSize < 0) {
_mesa_error(ctx, GL_INVALID_VALUE, "%s(bufSize = %d)", callerstr,
bufSize);
return;
}
labelPtr = get_label_pointer(ctx, identifier, name, callerstr, true);
if (!labelPtr)
return;
copy_label(*labelPtr, label, length, bufSize);
}
void GLAPIENTRY
_mesa_ObjectLabel(GLenum identifier, GLuint name, GLsizei length,
const GLchar *label)
@@ -261,11 +313,11 @@ _mesa_ObjectLabel(GLenum identifier, GLuint name, GLsizei length,
else
callerstr = "glObjectLabelKHR";
labelPtr = get_label_pointer(ctx, identifier, name, callerstr);
labelPtr = get_label_pointer(ctx, identifier, name, callerstr, false);
if (!labelPtr)
return;
set_label(ctx, labelPtr, label, length, callerstr);
set_label(ctx, labelPtr, label, length, callerstr, false);
}
void GLAPIENTRY
@@ -287,7 +339,7 @@ _mesa_GetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize,
return;
}
labelPtr = get_label_pointer(ctx, identifier, name, callerstr);
labelPtr = get_label_pointer(ctx, identifier, name, callerstr, false);
if (!labelPtr)
return;
@@ -317,7 +369,7 @@ _mesa_ObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
labelPtr = &syncObj->Label;
set_label(ctx, labelPtr, label, length, callerstr);
set_label(ctx, labelPtr, label, length, callerstr, false);
_mesa_unref_sync_object(ctx, syncObj, 1);
}