st/mesa: fix incorrect texture level/face/slice accesses
If we use FBOs to access mipmap levels with glRead/Draw/CopyPixels() we need to be sure to access the correct mipmap level/face/slice. Before, we were just passing zero in quite a few places. This fixes the new piglit fbo-mipmap-copypix test. NOTE: This is a candidate for the 7.10 branch.
This commit is contained in:
parent
1697dac642
commit
bf14ab417c
|
@ -793,9 +793,10 @@ draw_stencil_pixels(struct gl_context *ctx, GLint x, GLint y,
|
||||||
else
|
else
|
||||||
usage = PIPE_TRANSFER_WRITE;
|
usage = PIPE_TRANSFER_WRITE;
|
||||||
|
|
||||||
pt = pipe_get_transfer(st_context(ctx)->pipe, strb->texture, 0, 0,
|
pt = pipe_get_transfer(st_context(ctx)->pipe, strb->texture,
|
||||||
usage, x, y,
|
strb->rtt_level, strb->rtt_face + strb->rtt_slice,
|
||||||
width, height);
|
usage, x, y,
|
||||||
|
width, height);
|
||||||
|
|
||||||
stmap = pipe_transfer_map(pipe, pt);
|
stmap = pipe_transfer_map(pipe, pt);
|
||||||
|
|
||||||
|
@ -1131,7 +1132,9 @@ copy_stencil_pixels(struct gl_context *ctx, GLint srcx, GLint srcy,
|
||||||
}
|
}
|
||||||
|
|
||||||
ptDraw = pipe_get_transfer(st_context(ctx)->pipe,
|
ptDraw = pipe_get_transfer(st_context(ctx)->pipe,
|
||||||
rbDraw->texture, 0, 0,
|
rbDraw->texture,
|
||||||
|
rbDraw->rtt_level,
|
||||||
|
rbDraw->rtt_face + rbDraw->rtt_slice,
|
||||||
usage, dstx, dsty,
|
usage, dstx, dsty,
|
||||||
width, height);
|
width, height);
|
||||||
|
|
||||||
|
@ -1291,8 +1294,10 @@ blit_copy_pixels(struct gl_context *ctx, GLint srcx, GLint srcy,
|
||||||
u_box_2d(readX, readY, readW, readH, &srcBox);
|
u_box_2d(readX, readY, readW, readH, &srcBox);
|
||||||
|
|
||||||
pipe->resource_copy_region(pipe,
|
pipe->resource_copy_region(pipe,
|
||||||
rbDraw->texture, 0, drawX, drawY, 0,
|
rbDraw->texture,
|
||||||
rbRead->texture, 0, &srcBox);
|
rbDraw->rtt_level, drawX, drawY, 0,
|
||||||
|
rbRead->texture,
|
||||||
|
rbRead->rtt_level, &srcBox);
|
||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1444,10 +1449,10 @@ st_CopyPixels(struct gl_context *ctx, GLint srcx, GLint srcy,
|
||||||
/* copy source framebuffer surface into mipmap/texture */
|
/* copy source framebuffer surface into mipmap/texture */
|
||||||
pipe->resource_copy_region(pipe,
|
pipe->resource_copy_region(pipe,
|
||||||
pt, /* dest tex */
|
pt, /* dest tex */
|
||||||
0,
|
0, /* dest lvl */
|
||||||
pack.SkipPixels, pack.SkipRows, 0, /* dest pos */
|
pack.SkipPixels, pack.SkipRows, 0, /* dest pos */
|
||||||
rbRead->texture, /* src tex */
|
rbRead->texture, /* src tex */
|
||||||
0,
|
rbRead->rtt_level, /* src lvl */
|
||||||
&src_box);
|
&src_box);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1455,7 +1460,8 @@ st_CopyPixels(struct gl_context *ctx, GLint srcx, GLint srcy,
|
||||||
/* CPU-based fallback/conversion */
|
/* CPU-based fallback/conversion */
|
||||||
struct pipe_transfer *ptRead =
|
struct pipe_transfer *ptRead =
|
||||||
pipe_get_transfer(st->pipe, rbRead->texture,
|
pipe_get_transfer(st->pipe, rbRead->texture,
|
||||||
0, 0, /* level, layer */
|
rbRead->rtt_level,
|
||||||
|
rbRead->rtt_face + rbRead->rtt_slice,
|
||||||
PIPE_TRANSFER_READ,
|
PIPE_TRANSFER_READ,
|
||||||
readX, readY, readW, readH);
|
readX, readY, readW, readH);
|
||||||
struct pipe_transfer *ptTex;
|
struct pipe_transfer *ptTex;
|
||||||
|
|
|
@ -82,7 +82,8 @@ st_read_stencil_pixels(struct gl_context *ctx, GLint x, GLint y,
|
||||||
/* Create a read transfer from the renderbuffer's texture */
|
/* Create a read transfer from the renderbuffer's texture */
|
||||||
|
|
||||||
pt = pipe_get_transfer(pipe, strb->texture,
|
pt = pipe_get_transfer(pipe, strb->texture,
|
||||||
0, 0,
|
strb->rtt_level,
|
||||||
|
strb->rtt_face + strb->rtt_slice,
|
||||||
PIPE_TRANSFER_READ,
|
PIPE_TRANSFER_READ,
|
||||||
x, y, width, height);
|
x, y, width, height);
|
||||||
|
|
||||||
|
@ -250,7 +251,8 @@ st_fast_readpixels(struct gl_context *ctx, struct st_renderbuffer *strb,
|
||||||
}
|
}
|
||||||
|
|
||||||
trans = pipe_get_transfer(pipe, strb->texture,
|
trans = pipe_get_transfer(pipe, strb->texture,
|
||||||
0, 0,
|
strb->rtt_level,
|
||||||
|
strb->rtt_face + strb->rtt_slice,
|
||||||
PIPE_TRANSFER_READ,
|
PIPE_TRANSFER_READ,
|
||||||
x, y, width, height);
|
x, y, width, height);
|
||||||
if (!trans) {
|
if (!trans) {
|
||||||
|
@ -445,7 +447,8 @@ st_readpixels(struct gl_context *ctx, GLint x, GLint y, GLsizei width, GLsizei h
|
||||||
|
|
||||||
/* Create a read transfer from the renderbuffer's texture */
|
/* Create a read transfer from the renderbuffer's texture */
|
||||||
trans = pipe_get_transfer(pipe, strb->texture,
|
trans = pipe_get_transfer(pipe, strb->texture,
|
||||||
0, 0,
|
strb->rtt_level, /* level */
|
||||||
|
strb->rtt_face + strb->rtt_slice, /* layer */
|
||||||
PIPE_TRANSFER_READ,
|
PIPE_TRANSFER_READ,
|
||||||
x, y, width, height);
|
x, y, width, height);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue