diff --git a/renderdoc/api/replay/data_types.h b/renderdoc/api/replay/data_types.h index 6e72cdbf3..aeb7bde09 100644 --- a/renderdoc/api/replay/data_types.h +++ b/renderdoc/api/replay/data_types.h @@ -267,7 +267,9 @@ typically it is one parent to many derived. DOCUMENT("Utility function for setting up a custom name to overwrite the auto-generated one."); inline void SetCustomName(const rdcstr &givenName) { - autogeneratedName = false; + // consider an empty name to be un-setting any previous set name, and revert to the + // auto-generated name. + autogeneratedName = !givenName.isEmpty(); name = givenName; } }; diff --git a/renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp index ab0c182a0..028df880b 100644 --- a/renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp @@ -36,10 +36,22 @@ bool WrappedOpenGL::Serialise_glObjectLabel(SerialiserType &ser, GLenum identifi if(ser.IsWriting()) { - if(length == 0 || label == NULL) + // we share implementations between KHR_debug and EXT_debug_label, however KHR_debug follows the + // pattern elsewhere (e.g. in glShaderSource) of a length of -1 meaning indeterminate + // NULL-terminated length, but EXT_debug_label takes length of 0 to mean that. + GLsizei realLength = length; + if(gl_CurChunk == GLChunk::glLabelObjectEXT && length == 0) + realLength = -1; + + // if length is negative (after above twiddling), it's taken from strlen and the label must be + // NULL-terminated + if(realLength < 0) + realLength = label ? (GLsizei)strlen(label) : 0; + + if(realLength == 0 || label == NULL) Label = ""; else - Label = std::string(label, label + (length > 0 ? length : strlen(label))); + Label = std::string(label, label + realLength); switch(identifier) {