/** * Get compressed texture image. * * \param texture texture name. * \param level image level. * \param bufSize size of the pixels data buffer. * \param pixels returned pixel data. */ void glGetCompressedTextureImage(GLuint texture, GLint level, GLsizei bufSize, GLvoid *pixels) { struct gl_texture_object *texObj; struct gl_texture_image *texImage; int i; GLint image_stride; GET_CURRENT_CONTEXT(ctx); texObj = _mesa_lookup_texture_err(ctx, texture, "glGetCompressedTextureImage"); if (!texObj) return; /* Must handle special case GL_TEXTURE_CUBE_MAP. */ if (texObj->Target == GL_TEXTURE_CUBE_MAP) { /* Make sure the texture object is a proper cube. * (See texturesubimage in teximage.c for details on why this check is * performed.) */ if (!_mesa_cube_level_complete(texObj, level)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetCompressedTextureImage(cube map incomplete)"); return; } /* Copy each face. */ for (i = 0; i < 6; ++i) { texImage = texObj->Image[i][level]; assert(texImage); _mesa_get_compressed_texture_image(ctx, texObj, texImage, texObj->Target, level, bufSize, pixels, true); /* Compressed images don't have a client format */ image_stride = _mesa_format_image_size(texImage->TexFormat, texImage->Width, texImage->Height, 1); pixels = (GLubyte *) pixels + image_stride; bufSize -= image_stride; } } else { texImage = _mesa_select_tex_image(texObj, texObj->Target, level); if (!texImage) return; _mesa_get_compressed_texture_image(ctx, texObj, texImage, texObj->Target, level, bufSize, pixels, true); } }
/** * Helper used by _mesa_TextureStorage1/2/3D(). */ static void texturestorage(GLuint dims, GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, const char *caller) { struct gl_texture_object *texObj; GET_CURRENT_CONTEXT(ctx); if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) _mesa_debug(ctx, "%s %d %d %s %d %d %d\n", caller, texture, levels, _mesa_enum_to_string(internalformat), width, height, depth); /* Check the format to make sure it is sized. */ if (!_mesa_is_legal_tex_storage_format(ctx, internalformat)) { _mesa_error(ctx, GL_INVALID_ENUM, "%s(internalformat = %s)", caller, _mesa_enum_to_string(internalformat)); return; } texObj = _mesa_lookup_texture_err(ctx, texture, caller); if (!texObj) return; /* Check target. This is done here so that texture_storage * can receive unsized formats. */ if (!legal_texobj_target(ctx, dims, texObj->Target)) { _mesa_error(ctx, GL_INVALID_ENUM, "%s(illegal target=%s)", caller, _mesa_enum_to_string(texObj->Target)); return; } texture_storage(ctx, dims, texObj, texObj->Target, levels, internalformat, width, height, depth, true); }
/** * Get texture image. * * \param texture texture name. * \param level image level. * \param format pixel data format for returned image. * \param type pixel data type for returned image. * \param bufSize size of the pixels data buffer. * \param pixels returned pixel data. */ void glGetTextureImage(GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *pixels) { struct gl_texture_object *texObj; struct gl_texture_image *texImage; int i; GLint image_stride; GLenum err; GET_CURRENT_CONTEXT(ctx); /* * This has been moved here because a format/type mismatch can cause a NULL * texImage object, which in turn causes the mismatch error to be * ignored. */ err = _mesa_error_check_format_and_type(ctx, format, type); if (err != GL_NO_ERROR) { _mesa_error(ctx, err, "glGetTextureImage(format/type)"); return; } texObj = _mesa_lookup_texture_err(ctx, texture, "glGetTextureImage"); if (!texObj) return; /* * Legal target checking has been moved here to prevent exiting with a NULL * texImage object. */ if (!legal_getteximage_target(ctx, texObj->Target, true)) { _mesa_error(ctx, GL_INVALID_ENUM, "glGetTextureImage(target=%s)", _mesa_lookup_enum_by_nr(texObj->Target)); return; } /* Must handle special case GL_TEXTURE_CUBE_MAP. */ if (texObj->Target == GL_TEXTURE_CUBE_MAP) { /* Make sure the texture object is a proper cube. * (See texturesubimage in teximage.c for details on why this check is * performed.) */ if (!_mesa_cube_level_complete(texObj, level)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTextureImage(cube map incomplete)"); return; } /* Copy each face. */ for (i = 0; i < 6; ++i) { texImage = texObj->Image[i][level]; assert(texImage); _mesa_get_texture_image(ctx, texObj, texImage, texObj->Target, level, format, type, bufSize, pixels, true); image_stride = _mesa_image_image_stride(&ctx->Pack, texImage->Width, texImage->Height, format, type); pixels = (GLubyte *) pixels + image_stride; bufSize -= image_stride; } } else { texImage = _mesa_select_tex_image(texObj, texObj->Target, level); if (!texImage) return; _mesa_get_texture_image(ctx, texObj, texImage, texObj->Target, level, format, type, bufSize, pixels, true); } }