static void get_texture_2d_image(image_info *info) { GLuint fbo = 0; GLint prev_fbo = 0; GLint texture; GLenum status; _glGetIntegerv(GL_TEXTURE_BINDING_2D, &texture); if (!texture) return; _glGetIntegerv(GL_FRAMEBUFFER_BINDING, &prev_fbo); _glGenFramebuffers(1, &fbo); _glBindFramebuffer(GL_FRAMEBUFFER, fbo); _glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); status = _glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) os::log("%s: error: %d\n", __func__, status); _glReadPixels(0, 0, info->width, info->height, info->format, info->type, info->pixels); /* Don't leak errors to the traced application. */ (void)_glGetError(); _glBindFramebuffer(GL_FRAMEBUFFER, prev_fbo); _glDeleteFramebuffers(1, &fbo); }
static void _eglCreateImageKHR_get_image_size(EGLImageKHR image, image_info *info) { GLuint fbo = 0; GLuint orig_fbo = 0; GLuint texture = 0; GLuint orig_texture; GLenum status; _glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint *)&orig_fbo); _glGenFramebuffers(1, &fbo); _glBindFramebuffer(GL_FRAMEBUFFER, fbo); _glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint *)&orig_texture); _glGenTextures(1, &texture); _glBindTexture(GL_TEXTURE_2D, texture); _glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image); info->width = 0; info->height = 0; _glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); status = _glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status == GL_FRAMEBUFFER_COMPLETE) { if (detect_size(&info->width, &info->height) != 0) os::log("%s: can't detect image size\n", __func__); } else { os::log("%s: error: %x\n", __func__, status); } /* Don't leak errors to the traced application. */ (void)_glGetError(); _glBindTexture(GL_TEXTURE_2D, orig_texture); _glDeleteTextures(1, &texture); _glBindFramebuffer(GL_FRAMEBUFFER, orig_fbo); _glDeleteFramebuffers(1, &fbo); }
static inline GLuint _glDrawElementsBaseVertex_count(GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex) { GLvoid *temp = 0; if (!count) { return 0; } GLint element_array_buffer = _element_array_buffer_binding(); if (element_array_buffer) { // Read indices from index buffer object GLintptr offset = (GLintptr)indices; GLsizeiptr size = count*_gl_type_size(type); temp = malloc(size); if (!temp) { return 0; } memset(temp, 0, size); _shadow_glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offset, size, temp); indices = temp; } else { if (!indices) { return 0; } } GLuint maxindex = 0; GLboolean restart_enabled = _glIsEnabled(GL_PRIMITIVE_RESTART); while ((_glGetError() == GL_INVALID_ENUM)) ; GLuint restart_index = 0; if (restart_enabled) { restart_index = (GLuint)_glGetInteger(GL_PRIMITIVE_RESTART_INDEX); } GLsizei i; if (type == GL_UNSIGNED_BYTE) { const GLubyte *p = (const GLubyte *)indices; for (i = 0; i < count; ++i) { GLuint index = p[i]; if (restart_enabled && index == restart_index) { continue; } if (index > maxindex) { maxindex = index; } } } else if (type == GL_UNSIGNED_SHORT) { const GLushort *p = (const GLushort *)indices; for (i = 0; i < count; ++i) { GLuint index = p[i]; if (restart_enabled && index == restart_index) { continue; } if (index > maxindex) { maxindex = index; } } } else if (type == GL_UNSIGNED_INT) { const GLuint *p = (const GLuint *)indices; for (i = 0; i < count; ++i) { GLuint index = p[i]; if (restart_enabled && index == restart_index) { continue; } if (index > maxindex) { maxindex = index; } } } else { os::log("apitrace: warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, type); } if (element_array_buffer) { free(temp); } maxindex += basevertex; return maxindex + 1; }
static bool is_valid_height(int val) { _glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, val); return _glGetError() == GL_NO_ERROR; }
static bool is_valid_width(int val) { _glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, val, 1); return _glGetError() == GL_NO_ERROR; }