mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 11:38:05 +02:00
meta: Allow GL_UN/PACK_IMAGE_HEIGHT in _mesa_meta_pbo_Get/TexSubImage
Now that a layered source PBO is interpreted as a single tall 2D image
it's quite easy to accept the image height packing option by just
creating an image that is tall enough to include the image padding.
I'm not sure whether the image height property should affect 1D_ARRAY
textures. My intuition and interpretation of the GL spec (which is a
bit vague) would be that it shouldn't. However the software fallback
path in Mesa uses the property for packing but not for unpacking. The
binary NVidia driver uses it for both. This patch doesn't use it for
either case so it is different from the software fallback. There is
some discussion about this here:
http://lists.freedesktop.org/archives/mesa-dev/2015-February/077925.html
This is tested by the texsubimage Piglit test with the array and pbo
arguments. Previously this test was skipping this code path because it
always sets the image height.
I've also tested it by modifying the getteximage-targets test. It
wasn't using this code path before because it was using the default
texture object so this code couldn't successfully create a frame
buffer. I also modified it to add some image padding with the image
height in the PBO.
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
Cc: "10.5" <mesa-stable@lists.freedesktop.org>
(cherry picked from commit a08bff1e98)
This commit is contained in:
parent
7f32fa0dcb
commit
614e7ebdad
1 changed files with 20 additions and 12 deletions
|
|
@ -134,6 +134,7 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx, GLuint dims,
|
|||
const struct gl_pixelstore_attrib *packing)
|
||||
{
|
||||
GLuint pbo = 0, pbo_tex = 0, fbos[2] = { 0, 0 };
|
||||
int full_height, image_height;
|
||||
struct gl_texture_image *pbo_tex_image;
|
||||
GLenum status;
|
||||
bool success = false;
|
||||
|
|
@ -167,14 +168,16 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx, GLuint dims,
|
|||
return true;
|
||||
}
|
||||
|
||||
/* Only accept tightly packed pixels from the user. */
|
||||
if (packing->ImageHeight != 0 && packing->ImageHeight != height)
|
||||
return false;
|
||||
/* For arrays, use a tall (height * depth) 2D texture but taking into
|
||||
* account the inter-image padding specified with the image height packing
|
||||
* property.
|
||||
*/
|
||||
image_height = packing->ImageHeight == 0 ? height : packing->ImageHeight;
|
||||
full_height = image_height * (depth - 1) + height;
|
||||
|
||||
/* For arrays, use a tall (height * depth) 2D texture. */
|
||||
pbo_tex_image = create_texture_for_pbo(ctx, create_pbo,
|
||||
GL_PIXEL_UNPACK_BUFFER,
|
||||
width, height * depth,
|
||||
width, full_height,
|
||||
format, type, pixels, packing,
|
||||
&pbo, &pbo_tex);
|
||||
if (!pbo_tex_image)
|
||||
|
|
@ -226,7 +229,8 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx, GLuint dims,
|
|||
_mesa_update_state(ctx);
|
||||
|
||||
_mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
|
||||
0, z * height, width, (z + 1) * height,
|
||||
0, z * image_height,
|
||||
width, z * image_height + height,
|
||||
xoffset, yoffset,
|
||||
xoffset + width, yoffset + height,
|
||||
GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
||||
|
|
@ -253,6 +257,7 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, GLuint dims,
|
|||
const struct gl_pixelstore_attrib *packing)
|
||||
{
|
||||
GLuint pbo = 0, pbo_tex = 0, fbos[2] = { 0, 0 };
|
||||
int full_height, image_height;
|
||||
struct gl_texture_image *pbo_tex_image;
|
||||
GLenum status;
|
||||
bool success = false;
|
||||
|
|
@ -286,13 +291,15 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, GLuint dims,
|
|||
return true;
|
||||
}
|
||||
|
||||
/* Only accept tightly packed pixels from the user. */
|
||||
if (packing->ImageHeight != 0 && packing->ImageHeight != height)
|
||||
return false;
|
||||
/* For arrays, use a tall (height * depth) 2D texture but taking into
|
||||
* account the inter-image padding specified with the image height packing
|
||||
* property.
|
||||
*/
|
||||
image_height = packing->ImageHeight == 0 ? height : packing->ImageHeight;
|
||||
full_height = image_height * (depth - 1) + height;
|
||||
|
||||
/* For arrays, use a tall (height * depth) 2D texture. */
|
||||
pbo_tex_image = create_texture_for_pbo(ctx, false, GL_PIXEL_PACK_BUFFER,
|
||||
width, height * depth,
|
||||
width, full_height * depth,
|
||||
format, type, pixels, packing,
|
||||
&pbo, &pbo_tex);
|
||||
if (!pbo_tex_image)
|
||||
|
|
@ -351,7 +358,8 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, GLuint dims,
|
|||
_mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
|
||||
xoffset, yoffset,
|
||||
xoffset + width, yoffset + height,
|
||||
0, z * height, width, (z + 1) * height,
|
||||
0, z * image_height,
|
||||
width, z * image_height + height,
|
||||
GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue