]> git.cworth.org Git - apitrace/blobdiff - retrace/glstate_images.cpp
glstate: Dump more object labels.
[apitrace] / retrace / glstate_images.cpp
index 45d77eb940d903f5ff9add982e92dd781556cfa9..b055002977d3c351e7b0cf014b45455df1ac6160 100644 (file)
@@ -59,11 +59,6 @@ OSStatus CGSGetSurfaceBounds(CGSConnectionID, CGWindowID, CGSSurfaceID, CGRect *
 #endif /* __APPLE__ */
 
 
-/* Change thi to one to force interpreting depth buffers as RGBA, which enables
- * visualizing full dynamic range, until we can transmit HDR images to the GUI */
-#define DEPTH_AS_RGBA 0
-
-
 namespace glstate {
 
 
@@ -392,23 +387,138 @@ getTexImageOES(GLenum target, GLint level, ImageDesc &desc, GLubyte *pixels)
 }
 
 
-static inline GLboolean
-isDepthFormat(GLenum internalFormat)
+struct InternalFormatDesc
 {
-   switch (internalFormat) {
-   case GL_DEPTH_COMPONENT:
-   case GL_DEPTH_COMPONENT16:
-   case GL_DEPTH_COMPONENT24:
-   case GL_DEPTH_COMPONENT32:
-   case GL_DEPTH_COMPONENT32F:
-   case GL_DEPTH_COMPONENT32F_NV:
-   case GL_DEPTH_STENCIL:
-   case GL_DEPTH24_STENCIL8:
-   case GL_DEPTH32F_STENCIL8:
-   case GL_DEPTH32F_STENCIL8_NV:
-      return GL_TRUE;
-   }
-   return GL_FALSE;
+    GLenum internalFormat;
+    GLenum format;
+};
+
+
+static const InternalFormatDesc
+internalFormatDescs[] = {
+
+    {1,        GL_RED},
+    {2,        GL_RG},
+    {3,        GL_RGB},
+    {4,        GL_RGBA},
+
+    {GL_RED,   GL_RED},
+    {GL_GREEN, GL_GREEN},
+    {GL_BLUE,  GL_BLUE},
+    {GL_ALPHA, GL_ALPHA},
+    {GL_RG,    GL_RG},
+    {GL_RGB,   GL_RGB},
+    {GL_BGR,   GL_RGB},
+    {GL_RGBA,  GL_RGBA},
+    {GL_BGRA,  GL_RGBA},
+    {GL_LUMINANCE,     GL_LUMINANCE},
+    {GL_LUMINANCE_ALPHA,       GL_LUMINANCE_ALPHA},
+    {GL_INTENSITY,     GL_INTENSITY},
+    {GL_RG8,   GL_RG},
+    {GL_RG16,  GL_RG},
+    {GL_RGB8,  GL_RGB},
+    {GL_RGB16, GL_RGB},
+    {GL_RGBA8, GL_RGBA},
+    {GL_RGBA16,        GL_RGBA},
+    {GL_RGB10_A2,      GL_RGBA},
+    {GL_LUMINANCE8,    GL_LUMINANCE},
+    {GL_LUMINANCE16,   GL_LUMINANCE},
+    {GL_ALPHA8,        GL_ALPHA},
+    {GL_ALPHA16,       GL_ALPHA},
+    {GL_LUMINANCE8_ALPHA8,     GL_LUMINANCE_ALPHA},
+    {GL_LUMINANCE16_ALPHA16,   GL_LUMINANCE_ALPHA},
+    {GL_INTENSITY8,    GL_INTENSITY},
+    {GL_INTENSITY16,   GL_INTENSITY},
+    
+    {GL_RED_INTEGER,   GL_RED_INTEGER},
+    {GL_GREEN_INTEGER, GL_GREEN_INTEGER},
+    {GL_BLUE_INTEGER,  GL_BLUE_INTEGER},
+    {GL_ALPHA_INTEGER, GL_ALPHA_INTEGER},
+    {GL_RG_INTEGER,    GL_RG_INTEGER},
+    {GL_RGB_INTEGER,   GL_RGB_INTEGER},
+    {GL_BGR_INTEGER,   GL_RGB_INTEGER},
+    {GL_RGBA_INTEGER,  GL_RGBA_INTEGER},
+    {GL_BGRA_INTEGER,  GL_RGBA_INTEGER},
+    {GL_LUMINANCE_INTEGER_EXT, GL_LUMINANCE_INTEGER_EXT},
+    {GL_LUMINANCE_ALPHA_INTEGER_EXT,   GL_LUMINANCE_ALPHA_INTEGER_EXT},
+    {GL_R8I,   GL_RED_INTEGER},
+    {GL_R8UI,  GL_RED_INTEGER},
+    {GL_R16I,  GL_RED_INTEGER},
+    {GL_R16UI, GL_RED_INTEGER},
+    {GL_R32I,  GL_RED_INTEGER},
+    {GL_R32UI, GL_RED_INTEGER},
+    {GL_RG8I,  GL_RG_INTEGER},
+    {GL_RG8UI, GL_RG_INTEGER},
+    {GL_RG16I, GL_RG_INTEGER},
+    {GL_RG16UI,        GL_RG_INTEGER},
+    {GL_RG32I, GL_RG_INTEGER},
+    {GL_RG32UI,        GL_RG_INTEGER},
+    {GL_RGB8I, GL_RGB_INTEGER},
+    {GL_RGB8UI,        GL_RGB_INTEGER},
+    {GL_RGB16I,        GL_RGB_INTEGER},
+    {GL_RGB16UI,       GL_RGB_INTEGER},
+    {GL_RGB32I,        GL_RGB_INTEGER},
+    {GL_RGB32UI,       GL_RGB_INTEGER},
+    {GL_RGBA8I,        GL_RGBA_INTEGER},
+    {GL_RGBA8UI,       GL_RGBA_INTEGER},
+    {GL_RGBA16I,       GL_RGBA_INTEGER},
+    {GL_RGBA16UI,      GL_RGBA_INTEGER},
+    {GL_RGBA32I,       GL_RGBA_INTEGER},
+    {GL_RGBA32UI,      GL_RGBA_INTEGER},
+    {GL_RGB10_A2UI,    GL_RGBA_INTEGER},
+    {GL_LUMINANCE8I_EXT,       GL_LUMINANCE_INTEGER_EXT},
+    {GL_LUMINANCE8UI_EXT,      GL_LUMINANCE_INTEGER_EXT},
+    {GL_LUMINANCE16I_EXT,      GL_LUMINANCE_INTEGER_EXT},
+    {GL_LUMINANCE16UI_EXT,     GL_LUMINANCE_INTEGER_EXT},
+    {GL_LUMINANCE32I_EXT,      GL_LUMINANCE_INTEGER_EXT},
+    {GL_LUMINANCE32UI_EXT,     GL_LUMINANCE_INTEGER_EXT},
+    {GL_ALPHA8I_EXT,   GL_ALPHA_INTEGER_EXT},
+    {GL_ALPHA8UI_EXT,  GL_ALPHA_INTEGER_EXT},
+    {GL_ALPHA16I_EXT,  GL_ALPHA_INTEGER_EXT},
+    {GL_ALPHA16UI_EXT, GL_ALPHA_INTEGER_EXT},
+    {GL_ALPHA32I_EXT,  GL_ALPHA_INTEGER_EXT},
+    {GL_ALPHA32UI_EXT, GL_ALPHA_INTEGER_EXT},
+    {GL_LUMINANCE_ALPHA8I_EXT, GL_LUMINANCE_ALPHA_INTEGER_EXT},
+    {GL_LUMINANCE_ALPHA8UI_EXT,        GL_LUMINANCE_ALPHA_INTEGER_EXT},
+    {GL_LUMINANCE_ALPHA16I_EXT,        GL_LUMINANCE_ALPHA_INTEGER_EXT},
+    {GL_LUMINANCE_ALPHA16UI_EXT,       GL_LUMINANCE_ALPHA_INTEGER_EXT},
+    {GL_LUMINANCE_ALPHA32I_EXT,        GL_LUMINANCE_ALPHA_INTEGER_EXT},
+    {GL_LUMINANCE_ALPHA32UI_EXT,       GL_LUMINANCE_ALPHA_INTEGER_EXT},
+    {GL_INTENSITY8I_EXT,       GL_RED_INTEGER},
+    {GL_INTENSITY8UI_EXT,      GL_RED_INTEGER},
+    {GL_INTENSITY16I_EXT,      GL_RED_INTEGER},
+    {GL_INTENSITY16UI_EXT,     GL_RED_INTEGER},
+    {GL_INTENSITY32I_EXT,      GL_RED_INTEGER},
+    {GL_INTENSITY32UI_EXT,     GL_RED_INTEGER},
+    
+    {GL_DEPTH_COMPONENT,       GL_DEPTH_COMPONENT},
+    {GL_DEPTH_COMPONENT16,     GL_DEPTH_COMPONENT},
+    {GL_DEPTH_COMPONENT24,     GL_DEPTH_COMPONENT},
+    {GL_DEPTH_COMPONENT32,     GL_DEPTH_COMPONENT},
+    {GL_DEPTH_COMPONENT32F,    GL_DEPTH_COMPONENT},
+    {GL_DEPTH_COMPONENT32F_NV, GL_DEPTH_COMPONENT},
+    {GL_DEPTH_STENCIL,         GL_DEPTH_COMPONENT},
+    {GL_DEPTH24_STENCIL8,      GL_DEPTH_COMPONENT},
+    {GL_DEPTH32F_STENCIL8,     GL_DEPTH_COMPONENT},
+    {GL_DEPTH32F_STENCIL8_NV,  GL_DEPTH_COMPONENT},
+};
+
+
+/**
+ * Choose the glReadPixels/glGetTexImage format appropriate for the given
+ * internalFormat.
+ */
+static GLenum
+getFormat(GLenum internalFormat)
+{
+    for (unsigned i = 0; i < sizeof internalFormatDescs / sizeof internalFormatDescs[0]; ++i) {
+        if (internalFormatDescs[i].internalFormat == internalFormat) {
+            return internalFormatDescs[i].format;
+        }
+    }
+    return GL_RGBA;
 }
 
 
@@ -428,15 +538,11 @@ dumpActiveTextureLevel(JSONWriter &json, Context &context, GLenum target, GLint
 
     json.beginMember(label);
 
-    GLuint channels;
-    GLenum format;
-    if (!context.ES && isDepthFormat(desc.internalFormat)) {
-       format = GL_DEPTH_COMPONENT;
-       channels = 1;
-    } else {
-       format = GL_RGBA;
-       channels = 4;
+    GLenum format = getFormat(desc.internalFormat);
+    if (context.ES && format == GL_DEPTH_COMPONENT) {
+        format = GL_RED;
     }
+    GLuint channels = _gl_format_channels(format);
 
     image::Image *image = new image::Image(desc.width, desc.height*desc.depth, channels, true);
 
@@ -828,15 +934,15 @@ getDrawBufferImage() {
     }
 
     GLenum type = GL_UNSIGNED_BYTE;
+    image::ChannelType channelType = image::TYPE_UNORM8;
 
-#if DEPTH_AS_RGBA
     if (format == GL_DEPTH_COMPONENT) {
-        type = GL_UNSIGNED_INT;
-        channels = 4;
+        type = GL_FLOAT;
+        channels = 1;
+        channelType = image::TYPE_FLOAT;
     }
-#endif
 
-    image::Image *image = new image::Image(desc.width, desc.height, channels, true);
+    image::Image *image = new image::Image(desc.width, desc.height, channels, true, channelType);
     if (!image) {
         return NULL;
     }
@@ -895,15 +1001,15 @@ dumpReadBufferImage(JSONWriter &json, GLint width, GLint height, GLenum format,
     Context context;
 
     GLenum type = GL_UNSIGNED_BYTE;
+    image::ChannelType channelType = image::TYPE_UNORM8;
 
-#if DEPTH_AS_RGBA
     if (format == GL_DEPTH_COMPONENT) {
-        type = GL_UNSIGNED_INT;
-        channels = 4;
+        type = GL_FLOAT;
+        channels = 1;
+        channelType = image::TYPE_FLOAT;
     }
-#endif
 
-    image::Image *image = new image::Image(width, height, channels, true);
+    image::Image *image = new image::Image(width, height, channels, true, channelType);
 
     while (glGetError() != GL_NO_ERROR) {}
 
@@ -1087,7 +1193,7 @@ dumpDrawableImages(JSONWriter &json, Context &context)
  * In the case of a color attachment, it assumes it is already bound for read.
  */
 static void
-dumpFramebufferAttachment(JSONWriter &json, Context &context, GLenum target, GLenum attachment, GLenum format)
+dumpFramebufferAttachment(JSONWriter &json, Context &context, GLenum target, GLenum attachment, GLenum format = GL_NONE)
 {
     ImageDesc desc;
     if (!getFramebufferAttachmentDesc(context, target, attachment, desc)) {
@@ -1096,6 +1202,11 @@ dumpFramebufferAttachment(JSONWriter &json, Context &context, GLenum target, GLe
 
     assert(desc.samples == 0);
 
+    if (format == GL_NONE) {
+        assert(desc.internalFormat != GL_NONE);
+        format = getFormat(desc.internalFormat);
+    }
+
     json.beginMember(enumToString(attachment));
     dumpReadBufferImage(json, desc.width, desc.height, format, desc.internalFormat);
     json.endMember();
@@ -1128,12 +1239,7 @@ dumpFramebufferAttachments(JSONWriter &json, Context &context, GLenum target)
                 std::cerr << "warning: unexpected GL_DRAW_BUFFER" << i << " = " << draw_buffer << "\n";
                 attachment = GL_COLOR_ATTACHMENT0;
             }
-            GLint alpha_size = 0;
-            glGetFramebufferAttachmentParameteriv(target, attachment,
-                                                  GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE,
-                                                  &alpha_size);
-            GLenum format = alpha_size ? GL_RGBA : GL_RGB;
-            dumpFramebufferAttachment(json, context, target, attachment, format);
+            dumpFramebufferAttachment(json, context, target, attachment);
         }
     }