mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 07:08:04 +02:00
mesa: replace Driver.GetTexImage with GetTexSubImage()
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. v2: update i965 driver code, s/GLint/GLsizei/ in GetTexSubImage hook Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
parent
0963718790
commit
e693fc299f
10 changed files with 83 additions and 54 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -471,18 +471,21 @@ intel_gettexsubimage_tiled_memcpy(struct gl_context *ctx,
|
|||
}
|
||||
|
||||
static void
|
||||
intel_get_tex_image(struct gl_context *ctx,
|
||||
GLenum format, GLenum type, GLvoid *pixels,
|
||||
struct gl_texture_image *texImage) {
|
||||
intel_get_tex_sub_image(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 brw_context *brw = brw_context(ctx);
|
||||
bool ok;
|
||||
|
||||
DBG("%s\n", __func__);
|
||||
|
||||
if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
|
||||
if (_mesa_meta_pbo_GetTexSubImage(ctx, 3, texImage, 0, 0, 0,
|
||||
texImage->Width, texImage->Height,
|
||||
texImage->Depth, format, type,
|
||||
if (_mesa_meta_pbo_GetTexSubImage(ctx, 3, texImage,
|
||||
xoffset, yoffset, zoffset,
|
||||
width, height, depth, format, type,
|
||||
pixels, &ctx->Pack)) {
|
||||
/* Flush to guarantee coherency between the render cache and other
|
||||
* caches the PBO could potentially be bound to after this point.
|
||||
|
|
@ -496,14 +499,16 @@ intel_get_tex_image(struct gl_context *ctx,
|
|||
perf_debug("%s: fallback to CPU mapping in PBO case\n", __func__);
|
||||
}
|
||||
|
||||
ok = intel_gettexsubimage_tiled_memcpy(ctx, texImage, 0, 0,
|
||||
texImage->Width, texImage->Height,
|
||||
ok = intel_gettexsubimage_tiled_memcpy(ctx, texImage, xoffset, yoffset,
|
||||
width, height,
|
||||
format, type, pixels, &ctx->Pack);
|
||||
|
||||
if(ok)
|
||||
return;
|
||||
|
||||
_mesa_meta_GetTexImage(ctx, format, type, pixels, texImage);
|
||||
_mesa_meta_GetTexSubImage(ctx, xoffset, yoffset, zoffset,
|
||||
width, height, depth,
|
||||
format, type, pixels, texImage);
|
||||
|
||||
DBG("%s - DONE\n", __func__);
|
||||
}
|
||||
|
|
@ -514,5 +519,5 @@ intelInitTextureImageFuncs(struct dd_function_table *functions)
|
|||
functions->TexImage = intelTexImage;
|
||||
functions->EGLImageTargetTexture2D = intel_image_target_texture_2d;
|
||||
functions->BindRenderbufferTexImage = intel_bind_renderbuffer_tex_image;
|
||||
functions->GetTexImage = intel_get_tex_image;
|
||||
functions->GetTexSubImage = intel_get_tex_sub_image;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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, GLsizei depth,
|
||||
GLenum format, GLenum type, GLvoid *pixels,
|
||||
struct gl_texture_image *texImage);
|
||||
|
||||
/**
|
||||
* Called by glClearTex[Sub]Image
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue