X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fglstate_images.cpp;h=e534a654320ef55bafbe1adda4d847df0af3e6da;hb=fbcb5d9fc467da2d91b330bfd62f15e7d07ed1c2;hp=84c6db1793b88b0581457fd39f746b2362145929;hpb=162bbecced029b25c9f7119ccdc2615eb0496bc5;p=apitrace diff --git a/retrace/glstate_images.cpp b/retrace/glstate_images.cpp index 84c6db1..e534a65 100644 --- a/retrace/glstate_images.cpp +++ b/retrace/glstate_images.cpp @@ -88,6 +88,31 @@ struct ImageDesc }; +/** + * Sames as enumToString, but with special provision to handle formatsLUMINANCE_ALPHA. + * + * OpenGL 2.1 specification states that "internalFormat may (for backwards + * compatibility with the 1.0 version of the GL) also take on the integer + * values 1, 2, 3, and 4, which are equivalent to symbolic constants LUMINANCE, + * LUMINANCE ALPHA, RGB, and RGBA respectively". + */ +const char * +formatToString(GLenum internalFormat) { + switch (internalFormat) { + case 1: + return "GL_LUMINANCE"; + case 2: + return "GL_LUMINANCE_ALPHA"; + case 3: + return "GL_RGB"; + case 4: + return "GL_RGBA"; + default: + return enumToString(internalFormat); + } +} + + /** * OpenGL ES does not support glGetTexLevelParameteriv, but it is possible to * probe whether a texture has a given size by crafting a dummy glTexSubImage() @@ -232,6 +257,8 @@ getActiveTextureLevelDescOES(Context &context, GLenum target, GLint level, Image static inline bool getActiveTextureLevelDesc(Context &context, GLenum target, GLint level, ImageDesc &desc) { + assert(target != GL_TEXTURE_CUBE_MAP); + if (context.ES) { return getActiveTextureLevelDescOES(context, target, level, desc); } @@ -386,7 +413,7 @@ dumpActiveTextureLevel(JSONWriter &json, Context &context, GLenum target, GLint json.writeNumberMember("__height__", desc.height); json.writeNumberMember("__depth__", desc.depth); - json.writeStringMember("__format__", enumToString(desc.internalFormat)); + json.writeStringMember("__format__", formatToString(desc.internalFormat)); // Hardcoded for now, but we could chose types more adequate to the // texture internal format @@ -409,7 +436,7 @@ dumpActiveTextureLevel(JSONWriter &json, Context &context, GLenum target, GLint json.beginMember("__data__"); char *pngBuffer; int pngBufferSize; - image::writePixelsToBuffer(pixels, desc.width, desc.height, channels, true, &pngBuffer, &pngBufferSize); + image::writePixelsToBuffer(pixels, desc.width, desc.depth * desc.height, channels, true, &pngBuffer, &pngBufferSize); json.writeBase64(pngBuffer, pngBufferSize); free(pngBuffer); json.endMember(); // __data__ @@ -431,15 +458,18 @@ dumpTexture(JSONWriter &json, Context &context, GLenum target, GLenum binding) GLint level = 0; do { ImageDesc desc; - if (!getActiveTextureLevelDesc(context, target, level, desc)) { - break; - } if (target == GL_TEXTURE_CUBE_MAP) { for (int face = 0; face < 6; ++face) { + if (!getActiveTextureLevelDesc(context, GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level, desc)) { + return; + } dumpActiveTextureLevel(json, context, GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level); } } else { + if (!getActiveTextureLevelDesc(context, target, level, desc)) { + return; + } dumpActiveTextureLevel(json, context, target, level); } @@ -709,7 +739,7 @@ getFramebufferAttachmentDesc(Context &context, GLenum target, GLenum attachment, image::Image * getDrawBufferImage() { GLenum format = GL_RGB; - GLint channels = __gl_format_channels(format); + GLint channels = _gl_format_channels(format); if (channels > 4) { return NULL; } @@ -816,7 +846,11 @@ static inline void dumpReadBufferImage(JSONWriter &json, GLint width, GLint height, GLenum format, GLint internalFormat = GL_NONE) { - GLint channels = __gl_format_channels(format); + GLint channels = _gl_format_channels(format); + + if (internalFormat == GL_NONE) { + internalFormat = format; + } Context context; @@ -829,7 +863,7 @@ dumpReadBufferImage(JSONWriter &json, GLint width, GLint height, GLenum format, json.writeNumberMember("__height__", height); json.writeNumberMember("__depth__", 1); - json.writeStringMember("__format__", enumToString(internalFormat)); + json.writeStringMember("__format__", formatToString(internalFormat)); // Hardcoded for now, but we could chose types more adequate to the // texture internal format