VkImageAspectFlags getAspectFlagsFromFormat(ResourceFormat format) { VkImageAspectFlags flags = 0; if (isDepthFormat(format)) flags |= VK_IMAGE_ASPECT_DEPTH_BIT; if (isStencilFormat(format)) flags |= VK_IMAGE_ASPECT_STENCIL_BIT; if (isDepthStencilFormat(format) == false) flags |= VK_IMAGE_ASPECT_COLOR_BIT; return flags; }
static inline void dumpActiveTextureLevel(JSONWriter &json, Context &context, GLenum target, GLint level) { ImageDesc desc; if (!getActiveTextureLevelDesc(context, target, level, desc)) { return; } char label[512]; GLint active_texture = GL_TEXTURE0; glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture); snprintf(label, sizeof label, "%s, %s, level = %d", enumToString(active_texture), enumToString(target), level); json.beginMember(label); json.beginObject(); GLuint channels; GLenum format; if (!context.ES && isDepthFormat(desc.internalFormat)) { format = GL_DEPTH_COMPONENT; channels = 1; } else { format = GL_RGBA; channels = 4; } // Tell the GUI this is no ordinary object, but an image json.writeStringMember("__class__", "image"); json.writeNumberMember("__width__", desc.width); json.writeNumberMember("__height__", desc.height); json.writeNumberMember("__depth__", desc.depth); json.writeStringMember("__format__", enumToString(desc.internalFormat)); // Hardcoded for now, but we could chose types more adequate to the // texture internal format json.writeStringMember("__type__", "uint8"); json.writeBoolMember("__normalized__", true); json.writeNumberMember("__channels__", channels); GLubyte *pixels = new GLubyte[desc.depth*desc.width*desc.height*channels]; context.resetPixelPackState(); if (context.ES) { getTexImageOES(target, level, desc, pixels); } else { glGetTexImage(target, level, format, GL_UNSIGNED_BYTE, pixels); } context.restorePixelPackState(); json.beginMember("__data__"); char *pngBuffer; int pngBufferSize; image::writePixelsToBuffer(pixels, desc.width, desc.height, channels, true, &pngBuffer, &pngBufferSize); json.writeBase64(pngBuffer, pngBufferSize); free(pngBuffer); json.endMember(); // __data__ delete [] pixels; json.endObject(); }