#include "enums.h"
#include "fbobject.h"
#include "objectlabel.h"
+#include "pipelineobj.h"
#include "queryobj.h"
#include "samplerobj.h"
#include "shaderobj.h"
set_label(struct gl_context *ctx, char **labelPtr, const char *label,
int length, const char *caller)
{
- if (*labelPtr) {
- /* free old label string */
- free(*labelPtr);
- *labelPtr = NULL;
- }
+ free(*labelPtr);
+ *labelPtr = NULL;
/* set new label string */
if (label) {
MAX_LABEL_LENGTH);
/* explicit length */
- *labelPtr = (char *) malloc(length+1);
+ *labelPtr = malloc(length+1);
if (*labelPtr) {
memcpy(*labelPtr, label, length);
/* length is not required to include the null terminator so
MAX_LABEL_LENGTH);
/* null-terminated string */
- *labelPtr = _mesa_strdup(label);
+ *labelPtr = strdup(label);
}
}
}
/**
* Helper for _mesa_GetObjectLabel() and _mesa_GetObjectPtrLabel().
+ * \param src the src label (may be null)
+ * \param dst pointer to dest buffer (may be null)
+ * \param length returns length of label (may be null)
+ * \param bufsize size of dst buffer
*/
static void
-copy_label(char **labelPtr, char *label, int *length, int bufSize)
+copy_label(const GLchar *src, GLchar *dst, GLsizei *length, GLsizei bufSize)
{
int labelLen = 0;
- if (*labelPtr)
- labelLen = strlen(*labelPtr);
+ /* From http://www.opengl.org/registry/specs/KHR/debug.txt:
+ * "If <length> is NULL, no length is returned. The maximum number of
+ * characters that may be written into <label>, including the null
+ * terminator, is specified by <bufSize>. If no debug label was specified
+ * for the object then <label> will contain a null-terminated empty string,
+ * and zero will be returned in <length>. If <label> is NULL and <length>
+ * is non-NULL then no string will be returned and the length of the label
+ * will be returned in <length>."
+ */
- if (label) {
- if (bufSize <= labelLen)
- labelLen = bufSize-1;
+ if (src)
+ labelLen = strlen(src);
+
+ if (bufSize == 0) {
+ if (length)
+ *length = labelLen;
+ return;
+ }
+
+ if (dst) {
+ if (src) {
+ if (bufSize <= labelLen)
+ labelLen = bufSize - 1;
- memcpy(label, *labelPtr, labelLen);
- label[labelLen] = '\0';
+ memcpy(dst, src, labelLen);
+ }
+
+ dst[labelLen] = '\0';
}
if (length)
break;
case GL_VERTEX_ARRAY:
{
- struct gl_array_object *obj = _mesa_lookup_arrayobj(ctx, name);
+ struct gl_vertex_array_object *obj = _mesa_lookup_vao(ctx, name);
if (obj)
labelPtr = &obj->Label;
}
break;
case GL_TRANSFORM_FEEDBACK:
{
+ /* From the GL 4.5 specification, page 536:
+ * "An INVALID_VALUE error is generated if name is not the name of a
+ * valid object of the type specified by identifier."
+ */
struct gl_transform_feedback_object *tfo =
_mesa_lookup_transform_feedback_object(ctx, name);
- if (tfo)
+ if (tfo && tfo->EverBound)
labelPtr = &tfo->Label;
}
break;
case GL_TEXTURE:
{
struct gl_texture_object *texObj = _mesa_lookup_texture(ctx, name);
- if (texObj)
+ if (texObj && texObj->Target)
labelPtr = &texObj->Label;
}
break;
}
break;
case GL_PROGRAM_PIPELINE:
- /* requires GL 4.2 */
- goto invalid_enum;
+ {
+ struct gl_pipeline_object *pipe =
+ _mesa_lookup_pipeline_object(ctx, name);
+ if (pipe)
+ labelPtr = &pipe->Label;
+ }
+ break;
default:
goto invalid_enum;
}
if (NULL == labelPtr) {
- _mesa_error(ctx, GL_INVALID_VALUE, "glObjectLabel(name = %u)", name);
+ _mesa_error(ctx, GL_INVALID_VALUE, "%s(name = %u)", caller, name);
}
return labelPtr;
invalid_enum:
_mesa_error(ctx, GL_INVALID_ENUM, "%s(identifier = %s)",
- caller, _mesa_lookup_enum_by_nr(identifier));
+ caller, _mesa_enum_to_string(identifier));
return NULL;
}
const GLchar *label)
{
GET_CURRENT_CONTEXT(ctx);
+ const char *callerstr;
char **labelPtr;
- labelPtr = get_label_pointer(ctx, identifier, name, "glObjectLabel");
+ if (_mesa_is_desktop_gl(ctx))
+ callerstr = "glObjectLabel";
+ else
+ callerstr = "glObjectLabelKHR";
+
+ labelPtr = get_label_pointer(ctx, identifier, name, callerstr);
if (!labelPtr)
return;
- set_label(ctx, labelPtr, label, length, "glObjectLabel");
+ set_label(ctx, labelPtr, label, length, callerstr);
}
void GLAPIENTRY
GLsizei *length, GLchar *label)
{
GET_CURRENT_CONTEXT(ctx);
+ const char *callerstr;
char **labelPtr;
- labelPtr = get_label_pointer(ctx, identifier, name, "glGetObjectLabel");
+ if (_mesa_is_desktop_gl(ctx))
+ callerstr = "glGetObjectLabel";
+ else
+ callerstr = "glGetObjectLabelKHR";
+
+ if (bufSize < 0) {
+ _mesa_error(ctx, GL_INVALID_VALUE, "%s(bufSize = %d)", callerstr,
+ bufSize);
+ return;
+ }
+
+ labelPtr = get_label_pointer(ctx, identifier, name, callerstr);
if (!labelPtr)
return;
- copy_label(labelPtr, label, length, bufSize);
+ copy_label(*labelPtr, label, length, bufSize);
}
void GLAPIENTRY
_mesa_ObjectPtrLabel(const void *ptr, GLsizei length, const GLchar *label)
{
GET_CURRENT_CONTEXT(ctx);
+ struct gl_sync_object *syncObj;
+ const char *callerstr;
char **labelPtr;
- struct gl_sync_object *const syncObj = (struct gl_sync_object *) ptr;
- if (!_mesa_validate_sync(ctx, syncObj)) {
- _mesa_error(ctx, GL_INVALID_VALUE, "glObjectPtrLabel (not a valid sync object)");
+ syncObj = _mesa_get_and_ref_sync(ctx, (void*)ptr, true);
+
+ if (_mesa_is_desktop_gl(ctx))
+ callerstr = "glObjectPtrLabel";
+ else
+ callerstr = "glObjectPtrLabelKHR";
+
+ if (!syncObj) {
+ _mesa_error(ctx, GL_INVALID_VALUE, "%s (not a valid sync object)",
+ callerstr);
return;
}
labelPtr = &syncObj->Label;
- set_label(ctx, labelPtr, label, length, "glObjectPtrLabel");
+ set_label(ctx, labelPtr, label, length, callerstr);
+ _mesa_unref_sync_object(ctx, syncObj, 1);
}
void GLAPIENTRY
GLchar *label)
{
GET_CURRENT_CONTEXT(ctx);
+ struct gl_sync_object *syncObj;
+ const char *callerstr;
char **labelPtr;
- struct gl_sync_object *const syncObj = (struct gl_sync_object *) ptr;
- if (!_mesa_validate_sync(ctx, syncObj)) {
- _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectPtrLabel (not a valid sync object)");
+ if (_mesa_is_desktop_gl(ctx))
+ callerstr = "glGetObjectPtrLabel";
+ else
+ callerstr = "glGetObjectPtrLabelKHR";
+
+ if (bufSize < 0) {
+ _mesa_error(ctx, GL_INVALID_VALUE, "%s(bufSize = %d)", callerstr,
+ bufSize);
+ return;
+ }
+
+ syncObj = _mesa_get_and_ref_sync(ctx, (void*)ptr, true);
+ if (!syncObj) {
+ _mesa_error(ctx, GL_INVALID_VALUE, "%s (not a valid sync object)",
+ callerstr);
return;
}
labelPtr = &syncObj->Label;
- copy_label(labelPtr, label, length, bufSize);
+ copy_label(*labelPtr, label, length, bufSize);
+ _mesa_unref_sync_object(ctx, syncObj, 1);
}