- switch (internalFormat) {
- case GL_ALPHA8:
- return MESA_FORMAT_A8;
- case GL_ALPHA16:
- return MESA_FORMAT_A16;
- case GL_ALPHA16F_ARB:
- return MESA_FORMAT_ALPHA_FLOAT16;
- case GL_ALPHA32F_ARB:
- return MESA_FORMAT_ALPHA_FLOAT32;
- case GL_ALPHA8I_EXT:
- return MESA_FORMAT_ALPHA_INT8;
- case GL_ALPHA16I_EXT:
- return MESA_FORMAT_ALPHA_INT16;
- case GL_ALPHA32I_EXT:
- return MESA_FORMAT_ALPHA_INT32;
- case GL_ALPHA8UI_EXT:
- return MESA_FORMAT_ALPHA_UINT8;
- case GL_ALPHA16UI_EXT:
- return MESA_FORMAT_ALPHA_UINT16;
- case GL_ALPHA32UI_EXT:
- return MESA_FORMAT_ALPHA_UINT32;
- case GL_LUMINANCE8:
- return MESA_FORMAT_L8;
- case GL_LUMINANCE16:
- return MESA_FORMAT_L16;
- case GL_LUMINANCE16F_ARB:
- return MESA_FORMAT_LUMINANCE_FLOAT16;
- case GL_LUMINANCE32F_ARB:
- return MESA_FORMAT_LUMINANCE_FLOAT32;
- case GL_LUMINANCE8I_EXT:
- return MESA_FORMAT_LUMINANCE_INT8;
- case GL_LUMINANCE16I_EXT:
- return MESA_FORMAT_LUMINANCE_INT16;
- case GL_LUMINANCE32I_EXT:
- return MESA_FORMAT_LUMINANCE_INT32;
- case GL_LUMINANCE8UI_EXT:
- return MESA_FORMAT_LUMINANCE_UINT8;
- case GL_LUMINANCE16UI_EXT:
- return MESA_FORMAT_LUMINANCE_UINT16;
- case GL_LUMINANCE32UI_EXT:
- return MESA_FORMAT_LUMINANCE_UINT32;
- case GL_LUMINANCE8_ALPHA8:
- return MESA_FORMAT_AL88;
- case GL_LUMINANCE16_ALPHA16:
- return MESA_FORMAT_AL1616;
- case GL_LUMINANCE_ALPHA16F_ARB:
- return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16;
- case GL_LUMINANCE_ALPHA32F_ARB:
- return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32;
- case GL_LUMINANCE_ALPHA8I_EXT:
- return MESA_FORMAT_LUMINANCE_ALPHA_INT8;
- case GL_LUMINANCE_ALPHA16I_EXT:
- return MESA_FORMAT_LUMINANCE_ALPHA_INT8;
- case GL_LUMINANCE_ALPHA32I_EXT:
- return MESA_FORMAT_LUMINANCE_ALPHA_INT16;
- case GL_LUMINANCE_ALPHA8UI_EXT:
- return MESA_FORMAT_LUMINANCE_ALPHA_UINT8;
- case GL_LUMINANCE_ALPHA16UI_EXT:
- return MESA_FORMAT_LUMINANCE_ALPHA_UINT16;
- case GL_LUMINANCE_ALPHA32UI_EXT:
- return MESA_FORMAT_LUMINANCE_ALPHA_UINT32;
- case GL_INTENSITY8:
- return MESA_FORMAT_I8;
- case GL_INTENSITY16:
- return MESA_FORMAT_I16;
- case GL_INTENSITY16F_ARB:
- return MESA_FORMAT_INTENSITY_FLOAT16;
- case GL_INTENSITY32F_ARB:
- return MESA_FORMAT_INTENSITY_FLOAT32;
- case GL_INTENSITY8I_EXT:
- return MESA_FORMAT_INTENSITY_INT8;
- case GL_INTENSITY16I_EXT:
- return MESA_FORMAT_INTENSITY_INT16;
- case GL_INTENSITY32I_EXT:
- return MESA_FORMAT_INTENSITY_INT32;
- case GL_INTENSITY8UI_EXT:
- return MESA_FORMAT_INTENSITY_UINT8;
- case GL_INTENSITY16UI_EXT:
- return MESA_FORMAT_INTENSITY_UINT16;
- case GL_INTENSITY32UI_EXT:
- return MESA_FORMAT_INTENSITY_UINT32;
- case GL_RGBA8:
- return MESA_FORMAT_RGBA8888_REV;
- case GL_RGBA16:
- return MESA_FORMAT_RGBA_16;
- case GL_RGBA16F_ARB:
- return MESA_FORMAT_RGBA_FLOAT16;
- case GL_RGBA32F_ARB:
- return MESA_FORMAT_RGBA_FLOAT32;
- case GL_RGBA8I_EXT:
- return MESA_FORMAT_RGBA_INT8;
- case GL_RGBA16I_EXT:
- return MESA_FORMAT_RGBA_INT16;
+ struct gl_texture_object *texObj;
+ struct gl_texture_image *texImage;
+
+ GET_CURRENT_CONTEXT(ctx);
+
+ texObj = _mesa_lookup_texture_err(ctx, texture,
+ "glCompressedTextureSubImage1D");
+ if (!texObj)
+ return;
+
+ if (compressed_subtexture_target_check(ctx, texObj->Target, 1, format, true,
+ "glCompressedTextureSubImage1D")) {
+ return;
+ }
+
+ if (compressed_subtexture_error_check(ctx, 1, texObj, texObj->Target,
+ level, xoffset, 0, 0,
+ width, 1, 1,
+ format, imageSize, data,
+ "glCompressedTextureSubImage1D")) {
+ return;
+ }
+
+ texImage = _mesa_select_tex_image(texObj, texObj->Target, level);
+ assert(texImage);
+
+ _mesa_compressed_texture_sub_image(ctx, 1, texObj, texImage,
+ texObj->Target, level,
+ xoffset, 0, 0, width, 1, 1,
+ format, imageSize, data);
+}
+
+
+void GLAPIENTRY
+_mesa_CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset,
+ GLint yoffset, GLsizei width, GLsizei height,
+ GLenum format, GLsizei imageSize,
+ const GLvoid *data)
+{
+ struct gl_texture_object *texObj;
+ struct gl_texture_image *texImage;
+
+ GET_CURRENT_CONTEXT(ctx);
+
+ if (compressed_subtexture_target_check(ctx, target, 2, format, false,
+ "glCompressedTexSubImage2D")) {
+ return;
+ }
+
+ texObj = _mesa_get_current_tex_object(ctx, target);
+ if (!texObj)
+ return;
+
+ if (compressed_subtexture_error_check(ctx, 2, texObj, target,
+ level, xoffset, yoffset, 0,
+ width, height, 1,
+ format, imageSize, data,
+ "glCompressedTexSubImage2D")) {
+ return;
+ }
+
+
+ texImage = _mesa_select_tex_image(texObj, target, level);
+ assert(texImage);
+
+ _mesa_compressed_texture_sub_image(ctx, 2, texObj, texImage, target, level,
+ xoffset, yoffset, 0, width, height, 1,
+ format, imageSize, data);
+}
+
+void GLAPIENTRY
+_mesa_CompressedTextureSubImage2D(GLuint texture, GLint level, GLint xoffset,
+ GLint yoffset,
+ GLsizei width, GLsizei height,
+ GLenum format, GLsizei imageSize,
+ const GLvoid *data)
+{
+ struct gl_texture_object *texObj;
+ struct gl_texture_image *texImage;
+
+ GET_CURRENT_CONTEXT(ctx);
+
+ texObj = _mesa_lookup_texture_err(ctx, texture,
+ "glCompressedTextureSubImage2D");
+ if (!texObj)
+ return;
+
+ if (compressed_subtexture_target_check(ctx, texObj->Target, 2, format, true,
+ "glCompressedTextureSubImage2D")) {
+ return;
+ }
+
+ if (compressed_subtexture_error_check(ctx, 2, texObj, texObj->Target,
+ level, xoffset, yoffset, 0,
+ width, height, 1,
+ format, imageSize, data,
+ "glCompressedTextureSubImage2D")) {
+ return;
+ }
+
+ texImage = _mesa_select_tex_image(texObj, texObj->Target, level);
+ assert(texImage);
+
+ _mesa_compressed_texture_sub_image(ctx, 2, texObj, texImage,
+ texObj->Target, level,
+ xoffset, yoffset, 0, width, height, 1,
+ format, imageSize, data);
+}
+
+void GLAPIENTRY
+_mesa_CompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset,
+ GLint yoffset, GLint zoffset, GLsizei width,
+ GLsizei height, GLsizei depth, GLenum format,
+ GLsizei imageSize, const GLvoid *data)
+{
+ struct gl_texture_object *texObj;
+ struct gl_texture_image *texImage;
+
+ GET_CURRENT_CONTEXT(ctx);
+
+ if (compressed_subtexture_target_check(ctx, target, 3, format, false,
+ "glCompressedTexSubImage3D")) {
+ return;
+ }
+
+ texObj = _mesa_get_current_tex_object(ctx, target);
+ if (!texObj)
+ return;
+
+ if (compressed_subtexture_error_check(ctx, 3, texObj, target,
+ level, xoffset, yoffset, zoffset,
+ width, height, depth,
+ format, imageSize, data,
+ "glCompressedTexSubImage3D")) {
+ return;
+ }
+
+
+ texImage = _mesa_select_tex_image(texObj, target, level);
+ assert(texImage);
+
+ _mesa_compressed_texture_sub_image(ctx, 3, texObj, texImage, target, level,
+ xoffset, yoffset, zoffset,
+ width, height, depth,
+ format, imageSize, data);
+}
+
+void GLAPIENTRY
+_mesa_CompressedTextureSubImage3D(GLuint texture, GLint level, GLint xoffset,
+ GLint yoffset, GLint zoffset, GLsizei width,
+ GLsizei height, GLsizei depth,
+ GLenum format, GLsizei imageSize,
+ const GLvoid *data)
+{
+ struct gl_texture_object *texObj;
+ struct gl_texture_image *texImage;
+
+ GET_CURRENT_CONTEXT(ctx);
+
+ texObj = _mesa_lookup_texture_err(ctx, texture,
+ "glCompressedTextureSubImage3D");
+ if (!texObj)
+ return;
+
+ if (compressed_subtexture_target_check(ctx, texObj->Target, 3, format, true,
+ "glCompressedTextureSubImage3D")) {
+ return;
+ }
+
+ if (compressed_subtexture_error_check(ctx, 3, texObj, texObj->Target,
+ level, xoffset, yoffset, zoffset,
+ width, height, depth,
+ format, imageSize, data,
+ "glCompressedTextureSubImage3D")) {
+ return;
+ }
+
+ /* Must handle special case GL_TEXTURE_CUBE_MAP. */
+ if (texObj->Target == GL_TEXTURE_CUBE_MAP) {
+ const char *pixels = data;
+ int i;
+ GLint image_stride;
+
+ /* 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,
+ "glCompressedTextureSubImage3D(cube map incomplete)");
+ return;
+ }
+
+ /* Copy in each face. */
+ for (i = 0; i < 6; ++i) {
+ texImage = texObj->Image[i][level];
+ assert(texImage);
+
+ _mesa_compressed_texture_sub_image(ctx, 3, texObj, texImage,
+ texObj->Target, level,
+ xoffset, yoffset, zoffset,
+ width, height, 1,
+ format, imageSize, pixels);
+
+ /* Compressed images don't have a client format */
+ image_stride = _mesa_format_image_size(texImage->TexFormat,
+ texImage->Width,
+ texImage->Height, 1);
+
+ pixels += image_stride;
+ imageSize -= image_stride;
+ }
+ }
+ else {
+ texImage = _mesa_select_tex_image(texObj, texObj->Target, level);
+ assert(texImage);
+
+ _mesa_compressed_texture_sub_image(ctx, 3, texObj, texImage,
+ texObj->Target, level,
+ xoffset, yoffset, zoffset,
+ width, height, depth,
+ format, imageSize, data);
+ }
+}
+
+static mesa_format
+get_texbuffer_format(const struct gl_context *ctx, GLenum internalFormat)
+{
+ if (ctx->API == API_OPENGL_COMPAT) {
+ switch (internalFormat) {
+ case GL_ALPHA8:
+ return MESA_FORMAT_A_UNORM8;
+ case GL_ALPHA16:
+ return MESA_FORMAT_A_UNORM16;
+ case GL_ALPHA16F_ARB:
+ return MESA_FORMAT_A_FLOAT16;
+ case GL_ALPHA32F_ARB:
+ return MESA_FORMAT_A_FLOAT32;
+ case GL_ALPHA8I_EXT:
+ return MESA_FORMAT_A_SINT8;
+ case GL_ALPHA16I_EXT:
+ return MESA_FORMAT_A_SINT16;
+ case GL_ALPHA32I_EXT:
+ return MESA_FORMAT_A_SINT32;
+ case GL_ALPHA8UI_EXT:
+ return MESA_FORMAT_A_UINT8;
+ case GL_ALPHA16UI_EXT:
+ return MESA_FORMAT_A_UINT16;
+ case GL_ALPHA32UI_EXT:
+ return MESA_FORMAT_A_UINT32;
+ case GL_LUMINANCE8:
+ return MESA_FORMAT_L_UNORM8;
+ case GL_LUMINANCE16:
+ return MESA_FORMAT_L_UNORM16;
+ case GL_LUMINANCE16F_ARB:
+ return MESA_FORMAT_L_FLOAT16;
+ case GL_LUMINANCE32F_ARB:
+ return MESA_FORMAT_L_FLOAT32;
+ case GL_LUMINANCE8I_EXT:
+ return MESA_FORMAT_L_SINT8;
+ case GL_LUMINANCE16I_EXT:
+ return MESA_FORMAT_L_SINT16;
+ case GL_LUMINANCE32I_EXT:
+ return MESA_FORMAT_L_SINT32;
+ case GL_LUMINANCE8UI_EXT:
+ return MESA_FORMAT_L_UINT8;
+ case GL_LUMINANCE16UI_EXT:
+ return MESA_FORMAT_L_UINT16;
+ case GL_LUMINANCE32UI_EXT:
+ return MESA_FORMAT_L_UINT32;
+ case GL_LUMINANCE8_ALPHA8:
+ return MESA_FORMAT_L8A8_UNORM;
+ case GL_LUMINANCE16_ALPHA16:
+ return MESA_FORMAT_L16A16_UNORM;
+ case GL_LUMINANCE_ALPHA16F_ARB:
+ return MESA_FORMAT_LA_FLOAT16;
+ case GL_LUMINANCE_ALPHA32F_ARB:
+ return MESA_FORMAT_LA_FLOAT32;
+ case GL_LUMINANCE_ALPHA8I_EXT:
+ return MESA_FORMAT_LA_SINT8;
+ case GL_LUMINANCE_ALPHA16I_EXT:
+ return MESA_FORMAT_LA_SINT16;
+ case GL_LUMINANCE_ALPHA32I_EXT:
+ return MESA_FORMAT_LA_SINT32;
+ case GL_LUMINANCE_ALPHA8UI_EXT:
+ return MESA_FORMAT_LA_UINT8;
+ case GL_LUMINANCE_ALPHA16UI_EXT:
+ return MESA_FORMAT_LA_UINT16;
+ case GL_LUMINANCE_ALPHA32UI_EXT:
+ return MESA_FORMAT_LA_UINT32;
+ case GL_INTENSITY8:
+ return MESA_FORMAT_I_UNORM8;
+ case GL_INTENSITY16:
+ return MESA_FORMAT_I_UNORM16;
+ case GL_INTENSITY16F_ARB:
+ return MESA_FORMAT_I_FLOAT16;
+ case GL_INTENSITY32F_ARB:
+ return MESA_FORMAT_I_FLOAT32;
+ case GL_INTENSITY8I_EXT:
+ return MESA_FORMAT_I_SINT8;
+ case GL_INTENSITY16I_EXT:
+ return MESA_FORMAT_I_SINT16;
+ case GL_INTENSITY32I_EXT:
+ return MESA_FORMAT_I_SINT32;
+ case GL_INTENSITY8UI_EXT:
+ return MESA_FORMAT_I_UINT8;
+ case GL_INTENSITY16UI_EXT:
+ return MESA_FORMAT_I_UINT16;
+ case GL_INTENSITY32UI_EXT:
+ return MESA_FORMAT_I_UINT32;
+ default:
+ break;
+ }
+ }
+
+ if (_mesa_has_ARB_texture_buffer_object_rgb32(ctx) ||
+ _mesa_has_OES_texture_buffer(ctx)) {
+ switch (internalFormat) {
+ case GL_RGB32F:
+ return MESA_FORMAT_RGB_FLOAT32;
+ case GL_RGB32UI:
+ return MESA_FORMAT_RGB_UINT32;
+ case GL_RGB32I:
+ return MESA_FORMAT_RGB_SINT32;
+ default:
+ break;
+ }
+ }
+
+ switch (internalFormat) {
+ case GL_RGBA8:
+ return MESA_FORMAT_R8G8B8A8_UNORM;
+ case GL_RGBA16:
+ if (_mesa_is_gles(ctx))
+ return MESA_FORMAT_NONE;
+ return MESA_FORMAT_RGBA_UNORM16;
+ case GL_RGBA16F_ARB:
+ return MESA_FORMAT_RGBA_FLOAT16;
+ case GL_RGBA32F_ARB:
+ return MESA_FORMAT_RGBA_FLOAT32;
+ case GL_RGBA8I_EXT:
+ return MESA_FORMAT_RGBA_SINT8;
+ case GL_RGBA16I_EXT:
+ return MESA_FORMAT_RGBA_SINT16;