X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fglstate.cpp;h=0f41068fba9c5ab2330c7ab273b207d0c5d3546b;hb=b1700a69b204580a9b75371ba7388e48a9b74a4d;hp=e2c69785d67bc9066acf5d063648381defbdae45;hpb=d7c738e13decf8a8a891008c51b437ccbe3434fb;p=apitrace diff --git a/retrace/glstate.cpp b/retrace/glstate.cpp index e2c6978..0f41068 100644 --- a/retrace/glstate.cpp +++ b/retrace/glstate.cpp @@ -32,6 +32,7 @@ #include "image.hpp" #include "json.hpp" #include "glproc.hpp" +#include "glws.hpp" #include "glsize.hpp" #include "glstate.hpp" #include "glstate_internal.hpp" @@ -44,6 +45,9 @@ Context::Context(void) { memset(this, 0, sizeof *this); const char *version = (const char *)glGetString(GL_VERSION); + unsigned version_major = 0; + unsigned version_minor = 0; + unsigned version_release = 0; if (version) { if (version[0] == 'O' && version[1] == 'p' && @@ -57,11 +61,39 @@ Context::Context(void) { (version[9] == ' ' || version[9] == '-')) { ES = true; } + if (version[0] >= '0' && version[0] <= '9') { + sscanf(version, "%u.%u.%u", &version_major, &version_minor, &version_release); + } } ARB_draw_buffers = !ES; - // TODO: Check extensions we use below + // Check extensions we use. + + if (!ES) { + if (version_major > 3 || + (version_major == 3 && version_minor >= 2)) { + GLint num_extensions = 0; + glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions); + for (GLint i = 0; i < num_extensions; ++i) { + const char *extension = (const char *)glGetStringi(GL_EXTENSIONS, i); + if (extension) { + if (strcmp(extension, "GL_ARB_sampler_objects") == 0) { + ARB_sampler_objects = true; + } else if (strcmp(extension, "GL_KHR_debug") == 0) { + KHR_debug = true; + } + } + } + } else { + const char *extensions = (const char *)glGetString(GL_EXTENSIONS); + ARB_sampler_objects = glws::checkExtension("GL_ARB_sampler_objects", extensions); + KHR_debug = glws::checkExtension("GL_KHR_debug", extensions); + } + } else { + const char *extensions = (const char *)glGetString(GL_EXTENSIONS); + KHR_debug = glws::checkExtension("GL_KHR_debug", extensions); + } } void @@ -120,16 +152,54 @@ Context::restorePixelPackState(void) { } +/** + * Dump a GL_KHR_debug object label. + */ +void +dumpObjectLabel(JSONWriter &json, Context &context, GLenum identifier, GLuint name, const char *member) +{ + if (!name) { + return; + } + + if (!context.KHR_debug) { + return; + } + + GLsizei length = 0; + glGetObjectLabel(identifier, name, 0, &length, NULL); + if (!length) { + return; + } + + char *label = (char *)malloc(length); + if (!label) { + return; + } + + glGetObjectLabel(identifier, name, length, NULL, label); + + json.writeStringMember(member, label); + + free(label); +} + + static const GLenum bindings[] = { GL_DRAW_BUFFER, GL_READ_BUFFER, GL_PIXEL_PACK_BUFFER_BINDING, GL_PIXEL_UNPACK_BUFFER_BINDING, GL_TEXTURE_BINDING_1D, + GL_TEXTURE_BINDING_1D_ARRAY, GL_TEXTURE_BINDING_2D, + GL_TEXTURE_BINDING_2D_ARRAY, + GL_TEXTURE_BINDING_2D_MULTISAMPLE, + GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_BINDING_3D, GL_TEXTURE_BINDING_RECTANGLE, GL_TEXTURE_BINDING_CUBE_MAP, + GL_TEXTURE_BINDING_CUBE_MAP_ARRAY, GL_DRAW_FRAMEBUFFER_BINDING, GL_READ_FRAMEBUFFER_BINDING, GL_RENDERBUFFER_BINDING,