50 #define TRIM_NVIDIA_BUFFER_INFO 1
52 #define TRIM_SHADER_STATS_INFO 1
65 # define APIENTRY __stdcall
75 const GLchar *message,
76 const GLvoid *
UNUSED(userParm))
78 if (
ELEM(
type, GL_DEBUG_TYPE_PUSH_GROUP, GL_DEBUG_TYPE_POP_GROUP)) {
86 STRPREFIX(message,
"Buffer detailed info")) {
98 if (
ELEM(severity, GL_DEBUG_SEVERITY_LOW, GL_DEBUG_SEVERITY_NOTIFICATION)) {
100 const char *
format = use_color ?
"\033[2m%s\033[0m" :
"%s";
105 char debug_groups[512] =
"";
110 case GL_DEBUG_TYPE_ERROR:
111 case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
112 case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
115 case GL_DEBUG_TYPE_PORTABILITY:
116 case GL_DEBUG_TYPE_PERFORMANCE:
117 case GL_DEBUG_TYPE_OTHER:
118 case GL_DEBUG_TYPE_MARKER:
126 if (severity == GL_DEBUG_SEVERITY_HIGH) {
129 fprintf(stderr,
"\033[2m");
133 fprintf(stderr,
"\033[0m\n");
149 const char format[] =
"Successfully hooked OpenGL debug callback using %s";
151 if (GLEW_VERSION_4_3 || GLEW_KHR_debug) {
152 SNPRINTF(msg,
format, GLEW_VERSION_4_3 ?
"OpenGL 4.3" :
"KHR_debug extension");
154 glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
156 glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0,
nullptr, GL_TRUE);
157 glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION,
158 GL_DEBUG_TYPE_MARKER,
160 GL_DEBUG_SEVERITY_NOTIFICATION,
164 else if (GLEW_ARB_debug_output) {
166 glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
167 glDebugMessageCallbackARB((GLDEBUGPROCARB)
debug_callback,
nullptr);
168 glDebugMessageControlARB(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0,
nullptr, GL_TRUE);
169 glDebugMessageInsertARB(GL_DEBUG_SOURCE_APPLICATION_ARB,
170 GL_DEBUG_TYPE_OTHER_ARB,
172 GL_DEBUG_SEVERITY_LOW_ARB,
177 CLOG_STR_WARN(&
LOG,
"Failed to hook OpenGL debug callback. Use fallback debug layer.");
193 GLenum
error = glGetError();
195 #define ERROR_CASE(err) \
198 SNPRINTF(msg, "%s : %s", #err, info); \
199 debug_callback(0, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, 0, msg, NULL); \
216 debug_callback(0, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, 0, msg,
nullptr);
231 uint16_t ubo_needed = interface->enabled_ubo_mask_;
235 uint64_t tex_needed = interface->enabled_tex_mask_;
236 tex_needed &= ~
GLContext::state_manager_active_get()->bound_texture_slots();
239 uint8_t ima_needed = interface->enabled_ima_mask_;
240 ima_needed &= ~
GLContext::state_manager_active_get()->bound_image_slots();
242 if (ubo_needed == 0 && tex_needed == 0 && ima_needed == 0) {
246 for (
int i = 0; ubo_needed != 0; i++, ubo_needed >>= 1) {
247 if ((ubo_needed & 1) != 0) {
248 const ShaderInput *ubo_input = interface->ubo_get(i);
249 const char *ubo_name = interface->input_name_get(ubo_input);
252 SNPRINTF(msg,
"Missing UBO bind at slot %d : %s > %s : %s", i, sh_name, ubo_name, info);
253 debug_callback(0, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, 0, msg,
nullptr);
257 for (
int i = 0; tex_needed != 0; i++, tex_needed >>= 1) {
258 if ((tex_needed & 1) != 0) {
261 const char *tex_name = interface->input_name_get(
tex_input);
264 SNPRINTF(msg,
"Missing Texture bind at slot %d : %s > %s : %s", i, sh_name, tex_name, info);
265 debug_callback(0, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, 0, msg,
nullptr);
269 for (
int i = 0; ima_needed != 0; i++, ima_needed >>= 1) {
270 if ((ima_needed & 1) != 0) {
273 const char *tex_name = interface->input_name_get(
tex_input);
276 SNPRINTF(msg,
"Missing Image bind at slot %d : %s > %s : %s", i, sh_name, tex_name, info);
277 debug_callback(0, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, 0, msg,
nullptr);
284 debug_callback(0, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, 0, info,
nullptr);
299 case GL_FRAGMENT_SHADER:
300 case GL_GEOMETRY_SHADER:
301 case GL_VERTEX_SHADER:
311 case GL_VERTEX_ARRAY:
313 case GL_UNIFORM_BUFFER:
324 case GL_FRAGMENT_SHADER:
326 case GL_GEOMETRY_SHADER:
328 case GL_VERTEX_SHADER:
337 if ((
G.debug &
G_DEBUG_GPU) && (GLEW_VERSION_4_3 || GLEW_KHR_debug)) {
341 if (
ELEM(
type, GL_FRAGMENT_SHADER, GL_GEOMETRY_SHADER, GL_VERTEX_SHADER)) {
344 if (
ELEM(
type, GL_UNIFORM_BUFFER)) {
365 if ((
G.debug &
G_DEBUG_GPU) && (GLEW_VERSION_4_3 || GLEW_KHR_debug)) {
368 glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, index, -1, name);
374 if ((
G.debug &
G_DEBUG_GPU) && (GLEW_VERSION_4_3 || GLEW_KHR_debug)) {
#define SNPRINTF(dst, format,...)
void BLI_system_backtrace(FILE *fp)
void void CLG_logf(CLG_LogType *lg, enum CLG_Severity severity, const char *file_line, const char *fn, const char *format,...) _CLOG_ATTR_NONNULL(1
#define CLOG_ENSURE(clg_ref)
#define CLOG_STR_WARN(clg_ref, str)
int CLG_color_support_get(CLG_LogRef *clg_ref)
void GPU_debug_get_groups_names(int name_buf_len, char *r_name_buf)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
SIMD_FORCE_INLINE btScalar length(const btQuaternion &q)
Return the length of a quaternion.
void debug_group_begin(const char *name, int index) override
void debug_group_end(void) override
const char *const name_get(void) const
#define TRIM_NVIDIA_BUFFER_INFO
#define TRIM_SHADER_STATS_INFO
void KERNEL_FUNCTION_FULL_NAME() shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int filter, int i, int offset, int sample)
static void error(const char *str)
void check_gl_resources(const char *info)
static void APIENTRY debug_callback(GLenum UNUSED(source), GLenum type, GLuint UNUSED(id), GLenum severity, GLsizei UNUSED(length), const GLchar *message, const GLvoid *UNUSED(userParm))
void raise_gl_error(const char *info)
void init_debug_layer(void)
static const char * to_str_prefix(GLenum type)
void check_gl_error(const char *info)
static const char * to_str_suffix(GLenum type)
void object_label(GLenum type, GLuint object, const char *name)
static void tex_input(float *out, int sz, bNodeStack *in, TexParams *params, short thread)
unsigned __int64 uint64_t