diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml
index 0d2c9aaf690..7eb25f87a9b 100644
--- a/src/mapi/glapi/gen/gl_API.xml
+++ b/src/mapi/glapi/gen/gl_API.xml
@@ -12595,6 +12595,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py
index 95b6541a07c..0a147b2fe09 100644
--- a/src/mapi/glapi/gen/static_data.py
+++ b/src/mapi/glapi/gen/static_data.py
@@ -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",
diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
index 0d2851e0a5a..307b5d3bc1d 100644
--- a/src/mesa/main/extensions_table.h
+++ b/src/mesa/main/extensions_table.h
@@ -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)
diff --git a/src/mesa/main/objectlabel.c b/src/mesa/main/objectlabel.c
index ed9dfd40d35..02e950b10bd 100644
--- a/src/mesa/main/objectlabel.c
+++ b/src/mesa/main/objectlabel.c
@@ -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);
}