diff --git a/src/mesa/drivers/dri/r200/r200_tex.c b/src/mesa/drivers/dri/r200/r200_tex.c index 9f79157..6f34fa6 100644 --- a/src/mesa/drivers/dri/r200/r200_tex.c +++ b/src/mesa/drivers/dri/r200/r200_tex.c @@ -511,6 +511,12 @@ void r200InitTextureFuncs( struct dd_function_table *functions ) #endif functions->GetTexImage = radeonGetTexImage; functions->GetCompressedTexImage = radeonGetCompressedTexImage; + + functions->CopyTexImage1D = radeonCopyTexImage1D; + functions->CopyTexImage2D = radeonCopyTexImage2D; + functions->CopyTexSubImage1D = radeonCopyTexSubImage1D; + functions->CopyTexSubImage2D = radeonCopyTexSubImage2D; + functions->NewTextureObject = r200NewTextureObject; // functions->BindTexture = r200BindTexture; functions->DeleteTexture = r200DeleteTexture; diff --git a/src/mesa/drivers/dri/r300/r300_tex.c b/src/mesa/drivers/dri/r300/r300_tex.c index 0af5bb4..e296d6d 100644 --- a/src/mesa/drivers/dri/r300/r300_tex.c +++ b/src/mesa/drivers/dri/r300/r300_tex.c @@ -337,6 +337,12 @@ void r300InitTextureFuncs(struct dd_function_table *functions) functions->TexSubImage3D = radeonTexSubImage3D; functions->GetTexImage = radeonGetTexImage; functions->GetCompressedTexImage = radeonGetCompressedTexImage; + + functions->CopyTexImage1D = radeonCopyTexImage1D; + functions->CopyTexImage2D = radeonCopyTexImage2D; + functions->CopyTexSubImage1D = radeonCopyTexSubImage1D; + functions->CopyTexSubImage2D = radeonCopyTexSubImage2D; + functions->NewTextureObject = r300NewTextureObject; functions->DeleteTexture = r300DeleteTexture; functions->IsTextureResident = driIsTextureResident; diff --git a/src/mesa/drivers/dri/r600/r600_tex.c b/src/mesa/drivers/dri/r600/r600_tex.c index 6d531bf..f92b6c1 100644 --- a/src/mesa/drivers/dri/r600/r600_tex.c +++ b/src/mesa/drivers/dri/r600/r600_tex.c @@ -429,6 +429,12 @@ void r600InitTextureFuncs(struct dd_function_table *functions) functions->TexSubImage3D = radeonTexSubImage3D; functions->GetTexImage = radeonGetTexImage; functions->GetCompressedTexImage = radeonGetCompressedTexImage; + + functions->CopyTexImage1D = radeonCopyTexImage1D; + functions->CopyTexImage2D = radeonCopyTexImage2D; + functions->CopyTexSubImage1D = radeonCopyTexSubImage1D; + functions->CopyTexSubImage2D = radeonCopyTexSubImage2D; + functions->NewTextureObject = r600NewTextureObject; functions->DeleteTexture = r600DeleteTexture; functions->IsTextureResident = driIsTextureResident; diff --git a/src/mesa/drivers/dri/radeon/radeon_tex.c b/src/mesa/drivers/dri/radeon/radeon_tex.c index 2549d5c..110c801 100644 --- a/src/mesa/drivers/dri/radeon/radeon_tex.c +++ b/src/mesa/drivers/dri/radeon/radeon_tex.c @@ -460,6 +460,11 @@ void radeonInitTextureFuncs( struct dd_function_table *functions ) functions->GetTexImage = radeonGetTexImage; functions->GetCompressedTexImage = radeonGetCompressedTexImage; + functions->CopyTexImage1D = radeonCopyTexImage1D; + functions->CopyTexImage2D = radeonCopyTexImage2D; + functions->CopyTexSubImage1D = radeonCopyTexSubImage1D; + functions->CopyTexSubImage2D = radeonCopyTexSubImage2D; + functions->NewTextureObject = radeonNewTextureObject; // functions->BindTexture = radeonBindTexture; functions->DeleteTexture = radeonDeleteTexture; diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.c b/src/mesa/drivers/dri/radeon/radeon_texture.c index fa16f44..95e46cc 100644 --- a/src/mesa/drivers/dri/radeon/radeon_texture.c +++ b/src/mesa/drivers/dri/radeon/radeon_texture.c @@ -39,6 +39,7 @@ #include "main/teximage.h" #include "main/texobj.h" #include "main/texgetimage.h" +#include "swrast/swrast.h" #include "xmlpool.h" /* for symbolic values of enum-type options */ @@ -1025,7 +1026,7 @@ radeon_get_tex_image(GLcontext * ctx, GLenum target, GLint level, _mesa_get_teximage(ctx, target, level, format, type, pixels, texObj, texImage); } - + if (image->mt) { radeon_teximage_unmap(image); } @@ -1050,3 +1051,70 @@ radeonGetCompressedTexImage(GLcontext *ctx, GLenum target, GLint level, radeon_get_tex_image(ctx, target, level, 0, 0, pixels, texObj, texImage, 1); } + +void +radeonCopyTexImage1D(GLcontext * ctx, GLenum target, GLint level, + GLenum internalFormat, + GLint x, GLint y, GLsizei width, GLint border) +{ + struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; + struct gl_texture_object *texObj = _mesa_select_tex_object(ctx, texUnit, target); + struct gl_texture_image *texImage = _mesa_select_tex_image(ctx, texObj, target, level); + + + /* Setup or redefine the texture object, mipmap tree and texture + * image. Don't populate yet. + */ + radeon_teximage(ctx, 1, target, level, internalFormat, + width, 1, 1, 0, GL_RGBA, CHAN_TYPE, NULL, + &ctx->DefaultPacking, texObj, texImage, 0); + + /* XXX really want to use 2d or 3d hw blit */ + _swrast_copy_teximage1d(ctx, target, level, internalFormat, x, y, + width, border); +} + + +void +radeonCopyTexImage2D(GLcontext * ctx, GLenum target, GLint level, + GLenum internalFormat, + GLint x, GLint y, GLsizei width, GLsizei height, + GLint border) +{ + struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; + struct gl_texture_object *texObj = _mesa_select_tex_object(ctx, texUnit, target); + struct gl_texture_image *texImage = _mesa_select_tex_image(ctx, texObj, target, level); + + + /* Setup or redefine the texture object, mipmap tree and texture + * image. Don't populate yet. + */ + radeon_teximage(ctx, 2, target, level, internalFormat, + width, height, 1, 0, GL_RGBA, CHAN_TYPE, NULL, + &ctx->DefaultPacking, texObj, texImage, 0); + + /* XXX really want to use 2d or 3d hw blit */ + _swrast_copy_teximage2d(ctx, target, level, internalFormat, x, y, + width, height, border); +} + +void +radeonCopyTexSubImage1D(GLcontext * ctx, GLenum target, GLint level, + GLint xoffset, GLint x, GLint y, GLsizei width) +{ + if (1) { /* XXX really want to use 2d or 3d hw blit */ + _swrast_copy_texsubimage1d(ctx, target, level, xoffset, x, y, width); + } +} + + +void +radeonCopyTexSubImage2D(GLcontext * ctx, GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLint x, GLint y, GLsizei width, GLsizei height) +{ + if (1) { /* XXX really want to use 2d or 3d hw blit */ + _swrast_copy_texsubimage2d(ctx, target, level, + xoffset, yoffset, x, y, width, height); + } +} diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.h b/src/mesa/drivers/dri/radeon/radeon_texture.h index 888a55b..8f576e3 100644 --- a/src/mesa/drivers/dri/radeon/radeon_texture.h +++ b/src/mesa/drivers/dri/radeon/radeon_texture.h @@ -119,4 +119,20 @@ void radeonGetCompressedTexImage(GLcontext *ctx, GLenum target, GLint level, struct gl_texture_object *texObj, struct gl_texture_image *texImage); +void radeonCopyTexImage1D(GLcontext * ctx, GLenum target, GLint level, + GLenum internalFormat, + GLint x, GLint y, GLsizei width, GLint border); + +void radeonCopyTexImage2D(GLcontext * ctx, GLenum target, GLint level, + GLenum internalFormat, + GLint x, GLint y, GLsizei width, GLsizei height, + GLint border); + +void radeonCopyTexSubImage1D(GLcontext * ctx, GLenum target, GLint level, + GLint xoffset, GLint x, GLint y, GLsizei width); + +void radeonCopyTexSubImage2D(GLcontext * ctx, GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLint x, GLint y, GLsizei width, GLsizei height); + #endif