static void intelCompressedTexSubImage(struct gl_context *ctx, GLuint dims, struct gl_texture_image *texImage, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data) { /* Upload the compressed data blocks */ _mesa_store_compressed_texsubimage(ctx, dims, texImage, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); /* Fix up copied ASTC blocks if necessary */ GLenum gl_format = _mesa_compressed_format_to_glenum(ctx, texImage->TexFormat); bool is_linear_astc = _mesa_is_astc_format(gl_format) && !_mesa_is_srgb_format(gl_format); struct brw_context *brw = (struct brw_context*) ctx; if (brw->gen == 9 && is_linear_astc) flush_astc_denorms(ctx, dims, texImage, xoffset, yoffset, zoffset, width, height, depth); }
/** * Fallback for Driver.CompressedTexImage() */ void _mesa_store_compressed_teximage(struct gl_context *ctx, GLuint dims, struct gl_texture_image *texImage, GLsizei imageSize, const GLvoid *data) { /* only 2D and 3D compressed images are supported at this time */ if (dims == 1) { _mesa_problem(ctx, "Unexpected glCompressedTexImage1D call"); return; } /* This is pretty simple, because unlike the general texstore path we don't * have to worry about the usual image unpacking or image transfer * operations. */ assert(texImage); assert(texImage->Width > 0); assert(texImage->Height > 0); assert(texImage->Depth > 0); /* allocate storage for texture data */ if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage)) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage%uD", dims); return; } _mesa_store_compressed_texsubimage(ctx, dims, texImage, 0, 0, 0, texImage->Width, texImage->Height, texImage->Depth, texImage->TexFormat, imageSize, data); }