[Mesa-dev] [PATCH 03/13] mesa: replace Driver.GetTexImage with GetTexSubImage()
Brian Paul
brianp at vmware.com
Tue Jul 14 11:47:53 PDT 2015
Yes. Missed that.
I'll post an updated series later. Thanks for reviewing.
-Brian
On 07/14/2015 10:33 AM, Ilia Mirkin wrote:
> Don't you also have to update
> src/mesa/drivers/dri/i965/intel_tex_image.c:intel_get_tex_image ?
>
> On Mon, Jul 13, 2015 at 9:21 PM, Brian Paul <brianp at vmware.com> wrote:
>> The new driver hook has x/y/zoffset and width/height/depth parameters
>> for the new glGetTextureSubImage() function.
>>
>> The meta code and gallium state tracker are updated to handle the
>> new parameters.
>>
>> Callers to Driver.GetTexSubImage() pass in offsets=0 and sizes equal
>> to the whole texture size.
>> ---
>> src/mesa/drivers/common/driverfuncs.c | 2 +-
>> src/mesa/drivers/common/meta.c | 22 ++++++++++++----------
>> src/mesa/drivers/common/meta.h | 8 +++++---
>> src/mesa/main/dd.h | 10 ++++++----
>> src/mesa/main/debug.c | 4 +++-
>> src/mesa/main/mipmap.c | 9 ++++++---
>> src/mesa/main/texgetimage.c | 15 ++++++++++-----
>> src/mesa/main/texgetimage.h | 9 +++++----
>> src/mesa/state_tracker/st_cb_texture.c | 33 ++++++++++++++++++++-------------
>> 9 files changed, 68 insertions(+), 44 deletions(-)
>>
>> diff --git a/src/mesa/drivers/common/driverfuncs.c b/src/mesa/drivers/common/driverfuncs.c
>> index 71c1a76..ce99620 100644
>> --- a/src/mesa/drivers/common/driverfuncs.c
>> +++ b/src/mesa/drivers/common/driverfuncs.c
>> @@ -94,7 +94,7 @@ _mesa_init_driver_functions(struct dd_function_table *driver)
>> driver->QuerySamplesForFormat = _mesa_query_samples_for_format;
>> driver->TexImage = _mesa_store_teximage;
>> driver->TexSubImage = _mesa_store_texsubimage;
>> - driver->GetTexImage = _mesa_meta_GetTexImage;
>> + driver->GetTexSubImage = _mesa_meta_GetTexSubImage;
>> driver->ClearTexSubImage = _mesa_meta_ClearTexSubImage;
>> driver->CopyTexSubImage = _mesa_meta_CopyTexSubImage;
>> driver->GenerateMipmap = _mesa_meta_GenerateMipmap;
>> diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
>> index 34a8e4b..12045eb 100644
>> --- a/src/mesa/drivers/common/meta.c
>> +++ b/src/mesa/drivers/common/meta.c
>> @@ -3196,15 +3196,17 @@ decompress_texture_image(struct gl_context *ctx,
>> * from core Mesa.
>> */
>> void
>> -_mesa_meta_GetTexImage(struct gl_context *ctx,
>> - GLenum format, GLenum type, GLvoid *pixels,
>> - struct gl_texture_image *texImage)
>> +_mesa_meta_GetTexSubImage(struct gl_context *ctx,
>> + GLint xoffset, GLint yoffset, GLint zoffset,
>> + GLsizei width, GLsizei height, GLsizei depth,
>> + GLenum format, GLenum type, GLvoid *pixels,
>> + struct gl_texture_image *texImage)
>> {
>> if (_mesa_is_format_compressed(texImage->TexFormat)) {
>> GLuint slice;
>> bool result = true;
>>
>> - for (slice = 0; slice < texImage->Depth; slice++) {
>> + for (slice = 0; slice < depth; slice++) {
>> void *dst;
>> if (texImage->TexObject->Target == GL_TEXTURE_2D_ARRAY
>> || texImage->TexObject->Target == GL_TEXTURE_CUBE_MAP_ARRAY) {
>> @@ -3216,15 +3218,14 @@ _mesa_meta_GetTexImage(struct gl_context *ctx,
>> struct gl_pixelstore_attrib packing = ctx->Pack;
>> packing.SkipPixels = 0;
>> packing.SkipRows = 0;
>> - dst = _mesa_image_address3d(&packing, pixels, texImage->Width,
>> - texImage->Height, format, type,
>> - slice, 0, 0);
>> + dst = _mesa_image_address3d(&packing, pixels, width, height,
>> + format, type, slice, 0, 0);
>> }
>> else {
>> dst = pixels;
>> }
>> - result = decompress_texture_image(ctx, texImage, slice, 0, 0,
>> - texImage->Width, texImage->Height,
>> + result = decompress_texture_image(ctx, texImage, slice,
>> + xoffset, yoffset, width, height,
>> format, type, dst);
>> if (!result)
>> break;
>> @@ -3234,7 +3235,8 @@ _mesa_meta_GetTexImage(struct gl_context *ctx,
>> return;
>> }
>>
>> - _mesa_GetTexImage_sw(ctx, format, type, pixels, texImage);
>> + _mesa_GetTexSubImage_sw(ctx, xoffset, yoffset, zoffset,
>> + width, height, depth, format, type, pixels, texImage);
>> }
>>
>>
>> diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h
>> index f5b74c4..fe43915 100644
>> --- a/src/mesa/drivers/common/meta.h
>> +++ b/src/mesa/drivers/common/meta.h
>> @@ -560,9 +560,11 @@ _mesa_meta_ClearTexSubImage(struct gl_context *ctx,
>> const GLvoid *clearValue);
>>
>> extern void
>> -_mesa_meta_GetTexImage(struct gl_context *ctx,
>> - GLenum format, GLenum type, GLvoid *pixels,
>> - struct gl_texture_image *texImage);
>> +_mesa_meta_GetTexSubImage(struct gl_context *ctx,
>> + GLint xoffset, GLint yoffset, GLint zoffset,
>> + GLsizei width, GLsizei height, GLsizei depth,
>> + GLenum format, GLenum type, GLvoid *pixels,
>> + struct gl_texture_image *texImage);
>>
>> extern void
>> _mesa_meta_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z,
>> diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
>> index d783e34..754abd5 100644
>> --- a/src/mesa/main/dd.h
>> +++ b/src/mesa/main/dd.h
>> @@ -232,11 +232,13 @@ struct dd_function_table {
>>
>>
>> /**
>> - * Called by glGetTexImage().
>> + * Called by glGetTexImage(), glGetTextureSubImage().
>> */
>> - void (*GetTexImage)( struct gl_context *ctx,
>> - GLenum format, GLenum type, GLvoid *pixels,
>> - struct gl_texture_image *texImage );
>> + void (*GetTexSubImage)(struct gl_context *ctx,
>> + GLint xoffset, GLint yoffset, GLint zoffset,
>> + GLsizei width, GLsizei height, GLint depth,
>> + GLenum format, GLenum type, GLvoid *pixels,
>> + struct gl_texture_image *texImage);
>>
>> /**
>> * Called by glClearTex[Sub]Image
>> diff --git a/src/mesa/main/debug.c b/src/mesa/main/debug.c
>> index c93e84a..9cf4379 100644
>> --- a/src/mesa/main/debug.c
>> +++ b/src/mesa/main/debug.c
>> @@ -272,7 +272,9 @@ write_texture_image(struct gl_texture_object *texObj,
>> store = ctx->Pack; /* save */
>> ctx->Pack = ctx->DefaultPacking;
>>
>> - ctx->Driver.GetTexImage(ctx, GL_RGBA, GL_UNSIGNED_BYTE, buffer, img);
>> + ctx->Driver.GetTexSubImage(ctx,
>> + 0, 0, 0, img->Width, img->Height, img->Depth,
>> + GL_RGBA, GL_UNSIGNED_BYTE, buffer, img);
>>
>> /* make filename */
>> _mesa_snprintf(s, sizeof(s), "/tmp/tex%u.l%u.f%u.ppm", texObj->Name, level, face);
>> diff --git a/src/mesa/main/mipmap.c b/src/mesa/main/mipmap.c
>> index 7732d09..1e22f93 100644
>> --- a/src/mesa/main/mipmap.c
>> +++ b/src/mesa/main/mipmap.c
>> @@ -2077,9 +2077,12 @@ generate_mipmap_compressed(struct gl_context *ctx, GLenum target,
>>
>> /* Get the uncompressed image */
>> assert(srcImage->Level == texObj->BaseLevel);
>> - ctx->Driver.GetTexImage(ctx,
>> - temp_base_format, temp_datatype,
>> - temp_src, srcImage);
>> + ctx->Driver.GetTexSubImage(ctx,
>> + 0, 0, 0,
>> + srcImage->Width, srcImage->Height,
>> + srcImage->Depth,
>> + temp_base_format, temp_datatype,
>> + temp_src, srcImage);
>> /* restore packing mode */
>> ctx->Pack = save;
>> }
>> diff --git a/src/mesa/main/texgetimage.c b/src/mesa/main/texgetimage.c
>> index 92b4d67..01f1a15 100644
>> --- a/src/mesa/main/texgetimage.c
>> +++ b/src/mesa/main/texgetimage.c
>> @@ -684,15 +684,17 @@ get_tex_memcpy(struct gl_context *ctx, GLenum format, GLenum type,
>>
>>
>> /**
>> - * This is the software fallback for Driver.GetTexImage().
>> + * This is the software fallback for Driver.GetTexSubImage().
>> * All error checking will have been done before this routine is called.
>> * We'll call ctx->Driver.MapTextureImage() to access the data, then
>> * unmap with ctx->Driver.UnmapTextureImage().
>> */
>> void
>> -_mesa_GetTexImage_sw(struct gl_context *ctx,
>> - GLenum format, GLenum type, GLvoid *pixels,
>> - struct gl_texture_image *texImage)
>> +_mesa_GetTexSubImage_sw(struct gl_context *ctx,
>> + GLint xoffset, GLint yoffset, GLint zoffset,
>> + GLsizei width, GLsizei height, GLint depth,
>> + GLenum format, GLenum type, GLvoid *pixels,
>> + struct gl_texture_image *texImage)
>> {
>> const GLuint dimensions =
>> _mesa_get_texture_dimensions(texImage->TexObject->Target);
>> @@ -1022,7 +1024,10 @@ _mesa_get_texture_image(struct gl_context *ctx,
>>
>> _mesa_lock_texture(ctx, texObj);
>> {
>> - ctx->Driver.GetTexImage(ctx, format, type, pixels, texImage);
>> + ctx->Driver.GetTexSubImage(ctx, 0, 0, 0,
>> + texImage->Width, texImage->Height,
>> + texImage->Depth,
>> + format, type, pixels, texImage);
>> }
>> _mesa_unlock_texture(ctx, texObj);
>> }
>> diff --git a/src/mesa/main/texgetimage.h b/src/mesa/main/texgetimage.h
>> index 1fa2f59..611b1bd 100644
>> --- a/src/mesa/main/texgetimage.h
>> +++ b/src/mesa/main/texgetimage.h
>> @@ -37,10 +37,11 @@ extern GLenum
>> _mesa_base_pack_format(GLenum format);
>>
>> extern void
>> -_mesa_GetTexImage_sw(struct gl_context *ctx,
>> - GLenum format, GLenum type, GLvoid *pixels,
>> - struct gl_texture_image *texImage);
>> -
>> +_mesa_GetTexSubImage_sw(struct gl_context *ctx,
>> + GLint xoffset, GLint yoffset, GLint zoffset,
>> + GLsizei width, GLsizei height, GLint depth,
>> + GLenum format, GLenum type, GLvoid *pixels,
>> + struct gl_texture_image *texImage);
>>
>> extern void
>> _mesa_GetCompressedTexImage_sw(struct gl_context *ctx,
>> diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
>> index 7ea3846..8719ab8 100644
>> --- a/src/mesa/state_tracker/st_cb_texture.c
>> +++ b/src/mesa/state_tracker/st_cb_texture.c
>> @@ -896,7 +896,7 @@ st_CompressedTexImage(struct gl_context *ctx, GLuint dims,
>>
>>
>> /**
>> - * Called via ctx->Driver.GetTexImage()
>> + * Called via ctx->Driver.GetTexSubImage()
>> *
>> * This uses a blit to copy the texture to a texture format which matches
>> * the format and type combo and then a fast read-back is done using memcpy.
>> @@ -910,16 +910,15 @@ st_CompressedTexImage(struct gl_context *ctx, GLuint dims,
>> * we do here should be free in such cases.
>> */
>> static void
>> -st_GetTexImage(struct gl_context * ctx,
>> - GLenum format, GLenum type, GLvoid * pixels,
>> - struct gl_texture_image *texImage)
>> +st_GetTexSubImage(struct gl_context * ctx,
>> + GLint xoffset, GLint yoffset, GLint zoffset,
>> + GLsizei width, GLsizei height, GLint depth,
>> + GLenum format, GLenum type, GLvoid * pixels,
>> + struct gl_texture_image *texImage)
>> {
>> struct st_context *st = st_context(ctx);
>> struct pipe_context *pipe = st->pipe;
>> struct pipe_screen *screen = pipe->screen;
>> - GLuint width = texImage->Width;
>> - GLuint height = texImage->Height;
>> - GLuint depth = texImage->Depth;
>> struct st_texture_image *stImage = st_texture_image(texImage);
>> struct st_texture_object *stObj = st_texture_object(texImage->TexObject);
>> struct pipe_resource *src = stObj->pt;
>> @@ -1054,7 +1053,7 @@ st_GetTexImage(struct gl_context * ctx,
>> }
>> }
>>
>> - /* create the destination texture */
>> + /* create the destination texture of size (width X height X depth) */
>> memset(&dst_templ, 0, sizeof(dst_templ));
>> dst_templ.target = pipe_target;
>> dst_templ.format = dst_format;
>> @@ -1076,6 +1075,10 @@ st_GetTexImage(struct gl_context * ctx,
>> height = 1;
>> }
>>
>> + assert(texImage->Face == 0 ||
>> + texImage->TexObject->MinLayer == 0 ||
>> + zoffset == 0);
>> +
>> memset(&blit, 0, sizeof(blit));
>> blit.src.resource = src;
>> blit.src.level = texImage->Level + texImage->TexObject->MinLevel;
>> @@ -1083,9 +1086,11 @@ st_GetTexImage(struct gl_context * ctx,
>> blit.dst.resource = dst;
>> blit.dst.level = 0;
>> blit.dst.format = dst->format;
>> - blit.src.box.x = blit.dst.box.x = 0;
>> - blit.src.box.y = blit.dst.box.y = 0;
>> - blit.src.box.z = texImage->Face + texImage->TexObject->MinLayer;
>> + blit.src.box.x = xoffset;
>> + blit.dst.box.x = 0;
>> + blit.src.box.y = yoffset;
>> + blit.dst.box.y = 0;
>> + blit.src.box.z = texImage->Face + texImage->TexObject->MinLayer + zoffset;
>> blit.dst.box.z = 0;
>> blit.src.box.width = blit.dst.box.width = width;
>> blit.src.box.height = blit.dst.box.height = height;
>> @@ -1206,7 +1211,9 @@ end:
>>
>> fallback:
>> if (!done) {
>> - _mesa_GetTexImage_sw(ctx, format, type, pixels, texImage);
>> + _mesa_GetTexSubImage_sw(ctx, xoffset, yoffset, zoffset,
>> + width, height, depth,
>> + format, type, pixels, texImage);
>> }
>> }
>>
>> @@ -1876,7 +1883,7 @@ st_init_texture_functions(struct dd_function_table *functions)
>> functions->CopyTexSubImage = st_CopyTexSubImage;
>> functions->GenerateMipmap = st_generate_mipmap;
>>
>> - functions->GetTexImage = st_GetTexImage;
>> + functions->GetTexSubImage = st_GetTexSubImage;
>>
>> /* compressed texture functions */
>> functions->CompressedTexImage = st_CompressedTexImage;
>> --
>> 1.9.1
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.freedesktop.org_mailman_listinfo_mesa-2Ddev&d=BQIBaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=T0t4QG7chq2ZwJo6wilkFznRSFy-8uDKartPGbomVj8&m=lq4b2OgPAxiICc1ZrcjPS4mnAVN__ghVPhb36uEsK7I&s=M5C01x9D0fI3QUdDWNDtMNl-9mQasEgxps-d16kRMlA&e=
More information about the mesa-dev
mailing list