mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-09 19:10:12 +01:00
mesa: Convert GetCompressedTexImage to using MapTextureImage().
This changes drivers to not map the texture on their own before calling _mesa_get_compressed_teximage(). Tested-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
parent
9f61e43b49
commit
8df7ca7112
6 changed files with 37 additions and 129 deletions
|
|
@ -510,16 +510,11 @@ intelTexImage1D(struct gl_context * ctx,
|
|||
format, type, pixels, unpack, texObj, texImage, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Need to map texture image into memory before copying image data,
|
||||
* then unmap it.
|
||||
*/
|
||||
static void
|
||||
intel_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
|
||||
GLenum format, GLenum type, GLvoid * pixels,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage, GLboolean compressed)
|
||||
intelGetTexImage(struct gl_context * ctx, GLenum target, GLint level,
|
||||
GLenum format, GLenum type, GLvoid * pixels,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
struct intel_context *intel = intel_context(ctx);
|
||||
struct intel_texture_image *intelImage = intel_texture_image(texImage);
|
||||
|
|
@ -565,15 +560,8 @@ intel_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
|
|||
intel_tex_image_s8z24_gather(intel, intelImage);
|
||||
}
|
||||
|
||||
if (compressed) {
|
||||
_mesa_get_compressed_teximage(ctx, target, level, pixels,
|
||||
texObj, texImage);
|
||||
}
|
||||
else {
|
||||
_mesa_get_teximage(ctx, target, level, format, type, pixels,
|
||||
texObj, texImage);
|
||||
}
|
||||
|
||||
_mesa_get_teximage(ctx, target, level, format, type, pixels,
|
||||
texObj, texImage);
|
||||
|
||||
/* Unmap */
|
||||
if (intelImage->mt) {
|
||||
|
|
@ -582,28 +570,6 @@ intel_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
intelGetTexImage(struct gl_context * ctx, GLenum target, GLint level,
|
||||
GLenum format, GLenum type, GLvoid * pixels,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
intel_get_tex_image(ctx, target, level, format, type, pixels,
|
||||
texObj, texImage, GL_FALSE);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
intelGetCompressedTexImage(struct gl_context *ctx, GLenum target, GLint level,
|
||||
GLvoid *pixels,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
intel_get_tex_image(ctx, target, level, 0, 0, pixels,
|
||||
texObj, texImage, GL_TRUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Binds a region to a texture image, like it was uploaded by glTexImage2D().
|
||||
*
|
||||
|
|
@ -722,8 +688,6 @@ intelInitTextureImageFuncs(struct dd_function_table *functions)
|
|||
functions->TexImage3D = intelTexImage3D;
|
||||
functions->GetTexImage = intelGetTexImage;
|
||||
|
||||
functions->GetCompressedTexImage = intelGetCompressedTexImage;
|
||||
|
||||
#if FEATURE_OES_EGL_image
|
||||
functions->EGLImageTargetTexture2D = intel_image_target_texture_2d;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -39,17 +39,17 @@
|
|||
* Need to map texture image into memory before copying image data,
|
||||
* then unmap it.
|
||||
*/
|
||||
static void
|
||||
radeon_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
|
||||
GLenum format, GLenum type, GLvoid * pixels,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage, int compressed)
|
||||
void
|
||||
radeonGetTexImage(struct gl_context * ctx, GLenum target, GLint level,
|
||||
GLenum format, GLenum type, GLvoid * pixels,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
radeon_texture_image *image = get_radeon_texture_image(texImage);
|
||||
|
||||
radeon_print(RADEON_TEXTURE, RADEON_NORMAL,
|
||||
"%s(%p, tex %p, image %p) compressed %d.\n",
|
||||
__func__, ctx, texObj, image, compressed);
|
||||
"%s(%p, tex %p, image %p).\n",
|
||||
__func__, ctx, texObj, image);
|
||||
|
||||
if (image->mt) {
|
||||
radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
|
||||
|
|
@ -67,37 +67,10 @@ radeon_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
|
|||
assert(image->base.Base.Data);
|
||||
}
|
||||
|
||||
if (compressed) {
|
||||
/* FIXME: this can't work for small textures (mips) which
|
||||
use different hw stride */
|
||||
_mesa_get_compressed_teximage(ctx, target, level, pixels,
|
||||
texObj, texImage);
|
||||
} else {
|
||||
_mesa_get_teximage(ctx, target, level, format, type, pixels,
|
||||
texObj, texImage);
|
||||
}
|
||||
_mesa_get_teximage(ctx, target, level, format, type, pixels,
|
||||
texObj, texImage);
|
||||
|
||||
if (image->mt) {
|
||||
radeon_teximage_unmap(image);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
radeonGetTexImage(struct gl_context * ctx, GLenum target, GLint level,
|
||||
GLenum format, GLenum type, GLvoid * pixels,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
radeon_get_tex_image(ctx, target, level, format, type, pixels,
|
||||
texObj, texImage, 0);
|
||||
}
|
||||
|
||||
void
|
||||
radeonGetCompressedTexImage(struct gl_context *ctx, GLenum target, GLint level,
|
||||
GLvoid *pixels,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
radeon_get_tex_image(ctx, target, level, 0, 0, pixels,
|
||||
texObj, texImage, 1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1191,7 +1191,6 @@ radeon_init_common_texture_funcs(radeonContextPtr radeon,
|
|||
functions->TexSubImage3D = radeonTexSubImage3D;
|
||||
functions->CompressedTexImage2D = radeonCompressedTexImage2D;
|
||||
functions->CompressedTexSubImage2D = radeonCompressedTexSubImage2D;
|
||||
functions->GetCompressedTexImage = radeonGetCompressedTexImage;
|
||||
functions->GetTexImage = radeonGetTexImage;
|
||||
|
||||
functions->GenerateMipmap = radeonGenerateMipmap;
|
||||
|
|
|
|||
|
|
@ -121,10 +121,6 @@ void radeonGetTexImage(struct gl_context * ctx, GLenum target, GLint level,
|
|||
GLenum format, GLenum type, GLvoid * pixels,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage);
|
||||
void radeonGetCompressedTexImage(struct gl_context *ctx, GLenum target, GLint level,
|
||||
GLvoid *pixels,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage);
|
||||
|
||||
void radeonCopyTexSubImage2D(struct gl_context *ctx, GLenum target, GLint level,
|
||||
GLint xoffset, GLint yoffset,
|
||||
|
|
|
|||
|
|
@ -487,11 +487,11 @@ _mesa_get_compressed_teximage(struct gl_context *ctx, GLenum target, GLint level
|
|||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
const GLuint row_stride = _mesa_format_row_stride(texImage->TexFormat,
|
||||
texImage->Width);
|
||||
const GLuint row_stride_stored = _mesa_format_row_stride(texImage->TexFormat,
|
||||
texImage->RowStride);
|
||||
const GLuint row_stride =
|
||||
_mesa_format_row_stride(texImage->TexFormat, texImage->Width);
|
||||
GLuint i;
|
||||
GLubyte *src;
|
||||
GLint srcRowStride;
|
||||
|
||||
if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
|
||||
/* pack texture image into a PBO */
|
||||
|
|
@ -507,25 +507,32 @@ _mesa_get_compressed_teximage(struct gl_context *ctx, GLenum target, GLint level
|
|||
img = ADD_POINTERS(buf, img);
|
||||
}
|
||||
|
||||
/* map src texture buffer */
|
||||
ctx->Driver.MapTextureImage(ctx, texImage, 0,
|
||||
0, 0, texImage->Width, texImage->Height,
|
||||
GL_MAP_READ_BIT, &src, &srcRowStride);
|
||||
|
||||
/* no pixelstore or pixel transfer, but respect stride */
|
||||
|
||||
if (row_stride == row_stride_stored) {
|
||||
if (row_stride == srcRowStride) {
|
||||
const GLuint size = _mesa_format_image_size(texImage->TexFormat,
|
||||
texImage->Width,
|
||||
texImage->Height,
|
||||
texImage->Depth);
|
||||
memcpy(img, texImage->Data, size);
|
||||
memcpy(img, src, size);
|
||||
}
|
||||
else {
|
||||
GLuint bw, bh;
|
||||
_mesa_get_format_block_size(texImage->TexFormat, &bw, &bh);
|
||||
for (i = 0; i < (texImage->Height + bh - 1) / bh; i++) {
|
||||
memcpy((GLubyte *)img + i * row_stride,
|
||||
(GLubyte *)texImage->Data + i * row_stride_stored,
|
||||
(GLubyte *)src + i * srcRowStride,
|
||||
row_stride);
|
||||
}
|
||||
}
|
||||
|
||||
ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
|
||||
|
||||
if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
|
||||
ctx->Driver.UnmapBuffer(ctx, ctx->Pack.BufferObj);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -926,10 +926,10 @@ decompress_with_blit(struct gl_context * ctx, GLenum target, GLint level,
|
|||
* then unmap it.
|
||||
*/
|
||||
static void
|
||||
st_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
|
||||
GLenum format, GLenum type, GLvoid * pixels,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage, GLboolean compressed_dst)
|
||||
st_GetTexImage(struct gl_context * ctx, GLenum target, GLint level,
|
||||
GLenum format, GLenum type, GLvoid * pixels,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
struct st_context *st = st_context(ctx);
|
||||
struct st_texture_image *stImage = st_texture_image(texImage);
|
||||
|
|
@ -939,9 +939,7 @@ st_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
|
|||
GLuint depth, i;
|
||||
GLubyte *dest;
|
||||
|
||||
if (stImage->pt &&
|
||||
util_format_is_s3tc(stImage->pt->format) &&
|
||||
!compressed_dst) {
|
||||
if (stImage->pt && util_format_is_s3tc(stImage->pt->format)) {
|
||||
/* Need to decompress the texture.
|
||||
* We'll do this by rendering a textured quad.
|
||||
* Note that we only expect RGBA formats (no Z/depth formats).
|
||||
|
|
@ -983,14 +981,8 @@ st_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
|
|||
dest = (GLubyte *) pixels;
|
||||
|
||||
for (i = 0; i < depth; i++) {
|
||||
if (compressed_dst) {
|
||||
_mesa_get_compressed_teximage(ctx, target, level, dest,
|
||||
texObj, texImage);
|
||||
}
|
||||
else {
|
||||
_mesa_get_teximage(ctx, target, level, format, type, dest,
|
||||
texObj, texImage);
|
||||
}
|
||||
_mesa_get_teximage(ctx, target, level, format, type, dest,
|
||||
texObj, texImage);
|
||||
|
||||
if (stImage->pt && i + 1 < depth) {
|
||||
/* unmap this slice */
|
||||
|
|
@ -1014,29 +1006,6 @@ st_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
|
|||
}
|
||||
|
||||
|
||||
static void
|
||||
st_GetTexImage(struct gl_context * ctx, GLenum target, GLint level,
|
||||
GLenum format, GLenum type, GLvoid * pixels,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
st_get_tex_image(ctx, target, level, format, type, pixels, texObj, texImage,
|
||||
GL_FALSE);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
st_GetCompressedTexImage(struct gl_context *ctx, GLenum target, GLint level,
|
||||
GLvoid *pixels,
|
||||
struct gl_texture_object *texObj,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
st_get_tex_image(ctx, target, level, 0, 0, pixels, texObj, texImage,
|
||||
GL_TRUE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
st_TexSubimage(struct gl_context *ctx, GLint dims, GLenum target, GLint level,
|
||||
GLint xoffset, GLint yoffset, GLint zoffset,
|
||||
|
|
@ -1924,7 +1893,7 @@ st_init_texture_functions(struct dd_function_table *functions)
|
|||
|
||||
/* compressed texture functions */
|
||||
functions->CompressedTexImage2D = st_CompressedTexImage2D;
|
||||
functions->GetCompressedTexImage = st_GetCompressedTexImage;
|
||||
functions->GetCompressedTexImage = _mesa_get_compressed_teximage;
|
||||
|
||||
functions->NewTextureObject = st_NewTextureObject;
|
||||
functions->NewTextureImage = st_NewTextureImage;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue