1 /*********************************************************************
3 * Copyright 2012 Intel Corporation
6 * Permission is hereby granted, free of charge, to any person
7 * obtaining a copy of this software and associated documentation
8 * files (the "Software"), to deal in the Software without
9 * restriction, including without limitation the rights to use, copy,
10 * modify, merge, publish, distribute, sublicense, and/or sell copies
11 * of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be
15 * included in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
21 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
22 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 *********************************************************************/
29 * Auxiliary functions to compute the size of array/blob arguments.
36 #include "os_thread.hpp"
37 #include "glimports.hpp"
40 #include "eglsize.hpp"
45 bisect_val(int min, int max, bool is_valid_val(int val))
50 int try_val = min + (max - min + 1) / 2;
52 valid = is_valid_val(try_val);
62 return valid ? min : -1;
66 is_valid_width(int val)
68 _glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, val, 1);
69 return _glGetError() == GL_NO_ERROR;
73 is_valid_height(int val)
75 _glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, val);
76 return _glGetError() == GL_NO_ERROR;
80 detect_size(int *width_ret, int *height_ret)
87 _glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_tex_size);
89 width = bisect_val(1, max_tex_size, is_valid_width);
93 height = bisect_val(1, max_tex_size, is_valid_height);
105 can_unpack_subimage(void) {
110 _eglCreateImageKHR_get_image_size(EGLImageKHR image, image_info *info)
118 _glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint *)&orig_fbo);
119 _glGenFramebuffers(1, &fbo);
120 _glBindFramebuffer(GL_FRAMEBUFFER, fbo);
122 _glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint *)&orig_texture);
123 _glGenTextures(1, &texture);
124 _glBindTexture(GL_TEXTURE_2D, texture);
126 _glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
131 _glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
132 GL_TEXTURE_2D, texture, 0);
133 status = _glCheckFramebufferStatus(GL_FRAMEBUFFER);
134 if (status == GL_FRAMEBUFFER_COMPLETE) {
135 if (detect_size(&info->width, &info->height) != 0)
136 os::log("%s: can't detect image size\n", __func__);
138 os::log("%s: error: %x\n", __func__, status);
141 /* Don't leak errors to the traced application. */
144 _glBindTexture(GL_TEXTURE_2D, orig_texture);
145 _glDeleteTextures(1, &texture);
147 _glBindFramebuffer(GL_FRAMEBUFFER, orig_fbo);
148 _glDeleteFramebuffers(1, &fbo);
152 get_texture_2d_image(image_info *info)
159 _glGetIntegerv(GL_TEXTURE_BINDING_2D, &texture);
163 _glGetIntegerv(GL_FRAMEBUFFER_BINDING, &prev_fbo);
164 _glGenFramebuffers(1, &fbo);
165 _glBindFramebuffer(GL_FRAMEBUFFER, fbo);
167 _glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
169 status = _glCheckFramebufferStatus(GL_FRAMEBUFFER);
170 if (status != GL_FRAMEBUFFER_COMPLETE)
171 os::log("%s: error: %d\n", __func__, status);
172 _glReadPixels(0, 0, info->width, info->height, info->format, info->type, info->pixels);
173 /* Don't leak errors to the traced application. */
176 _glBindFramebuffer(GL_FRAMEBUFFER, prev_fbo);
177 _glDeleteFramebuffers(1, &fbo);
181 _EGLImageKHR_get_image_info(GLenum target, EGLImageKHR image)
185 struct image_info *info;
187 info = new image_info;
189 memset(info, 0, sizeof *info);
191 info->internalformat = GL_RGBA;
192 info->format = GL_RGBA;
193 info->type = GL_UNSIGNED_BYTE;
195 _eglCreateImageKHR_get_image_size(image, info);
197 _glGenTextures(1, &tex);
198 _glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint *)&bound_tex);
199 _glBindTexture(GL_TEXTURE_2D, tex);
200 _glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
202 info->size = _glTexImage2D_size(info->format, info->type, info->width, info->height);
203 info->pixels = malloc(info->size);
205 get_texture_2d_image(info);
206 _glBindTexture(GL_TEXTURE_2D, bound_tex);
207 _glDeleteBuffers(1, &tex);
213 _EGLImageKHR_free_image_info(struct image_info *info)
219 #endif // !defined(_WIN32)