mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-30 16:30:10 +01:00
mesa: lift memcpy_get_tex_image() code from intel driver into core Mesa
The code should work for any driver.
This commit is contained in:
parent
bde7874317
commit
fcbf663640
1 changed files with 83 additions and 1 deletions
|
|
@ -354,6 +354,85 @@ get_tex_rgba(GLcontext *ctx, GLuint dimensions,
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Try to do glGetTexImage() with simple memcpy().
|
||||
* \return GL_TRUE if done, GL_FALSE otherwise
|
||||
*/
|
||||
static GLboolean
|
||||
get_tex_memcpy(GLcontext *ctx, GLenum format, GLenum type, GLvoid *pixels,
|
||||
const struct gl_texture_object *texObj,
|
||||
const struct gl_texture_image *texImage)
|
||||
{
|
||||
GLboolean memCopy = GL_FALSE;
|
||||
|
||||
/* Texture image should have been mapped already */
|
||||
assert(texImage->Data);
|
||||
|
||||
/*
|
||||
* Check if the src/dst formats are compatible.
|
||||
* Also note that GL's pixel transfer ops don't apply to glGetTexImage()
|
||||
* so we don't have to worry about those.
|
||||
* XXX more format combinations could be supported here.
|
||||
*/
|
||||
if ((texObj->Target == GL_TEXTURE_1D ||
|
||||
texObj->Target == GL_TEXTURE_2D ||
|
||||
texObj->Target == GL_TEXTURE_RECTANGLE ||
|
||||
(texObj->Target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X &&
|
||||
texObj->Target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z))) {
|
||||
if (texImage->TexFormat == MESA_FORMAT_ARGB8888 &&
|
||||
format == GL_BGRA &&
|
||||
type == GL_UNSIGNED_BYTE &&
|
||||
!ctx->Pack.SwapBytes &&
|
||||
_mesa_little_endian()) {
|
||||
memCopy = GL_TRUE;
|
||||
}
|
||||
else if (texImage->TexFormat == MESA_FORMAT_AL88 &&
|
||||
format == GL_LUMINANCE_ALPHA &&
|
||||
type == GL_UNSIGNED_BYTE &&
|
||||
!ctx->Pack.SwapBytes &&
|
||||
_mesa_little_endian()) {
|
||||
memCopy = GL_TRUE;
|
||||
}
|
||||
else if (texImage->TexFormat == MESA_FORMAT_L8 &&
|
||||
format == GL_LUMINANCE &&
|
||||
type == GL_UNSIGNED_BYTE) {
|
||||
memCopy = GL_TRUE;
|
||||
}
|
||||
else if (texImage->TexFormat == MESA_FORMAT_A8 &&
|
||||
format == GL_ALPHA &&
|
||||
type == GL_UNSIGNED_BYTE) {
|
||||
memCopy = GL_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (memCopy) {
|
||||
const GLuint bpp = _mesa_get_format_bytes(texImage->TexFormat);
|
||||
const GLuint bytesPerRow = texImage->Width * bpp;
|
||||
GLubyte *dst =
|
||||
_mesa_image_address2d(&ctx->Pack, pixels, texImage->Width,
|
||||
texImage->Height, format, type, 0, 0);
|
||||
const GLint dstRowStride =
|
||||
_mesa_image_row_stride(&ctx->Pack, texImage->Width, format, type);
|
||||
const GLubyte *src = texImage->Data;
|
||||
const GLint srcRowStride = texImage->RowStride * bpp;
|
||||
GLuint row;
|
||||
|
||||
if (bytesPerRow == dstRowStride && bytesPerRow == srcRowStride) {
|
||||
memcpy(dst, src, bytesPerRow * texImage->Height);
|
||||
}
|
||||
else {
|
||||
for (row = 0; row < texImage->Height; row++) {
|
||||
memcpy(dst, src, bytesPerRow);
|
||||
dst += dstRowStride;
|
||||
src += srcRowStride;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return memCopy;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This is the software fallback for Driver.GetTexImage().
|
||||
* All error checking will have been done before this routine is called.
|
||||
|
|
@ -402,7 +481,10 @@ _mesa_get_teximage(GLcontext *ctx, GLenum target, GLint level,
|
|||
pixels = ADD_POINTERS(buf, pixels);
|
||||
}
|
||||
|
||||
if (format == GL_COLOR_INDEX) {
|
||||
if (get_tex_memcpy(ctx, format, type, pixels, texObj, texImage)) {
|
||||
/* all done */
|
||||
}
|
||||
else if (format == GL_COLOR_INDEX) {
|
||||
get_tex_color_index(ctx, dimensions, format, type, pixels, texImage);
|
||||
}
|
||||
else if (format == GL_DEPTH_COMPONENT) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue