summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/svga/svga_pipe_blit.c
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2016-07-06 17:24:18 -0600
committerBrian Paul <brianp@vmware.com>2016-07-08 12:53:21 -0600
commit74163475b0834a6151abf0d3c5e947aa026584b8 (patch)
tree208e92eaba191f4c00b9d94b5727be9f81ae58c2 /src/gallium/drivers/svga/svga_pipe_blit.c
parent0e23f370c99efa3e14ee0ffd0b04fa887f2bc2a5 (diff)
svga: simplify/fix 1D/2D array resource copies
Fixes the one of the piglit arb_copy_image-targets tests for 1D arrays. Previously, we were applying the 1D array z/face adjustment twice. Also simplify the copy_region_vgpu10() function. It never has to copy multiple array layers/slices. The Mesa code for glCopyImageSubData does the loop over slices/faces. Reviewed-by: Charmaine Lee <charmainel@vmware.com>
Diffstat (limited to 'src/gallium/drivers/svga/svga_pipe_blit.c')
-rw-r--r--src/gallium/drivers/svga/svga_pipe_blit.c38
1 files changed, 12 insertions, 26 deletions
diff --git a/src/gallium/drivers/svga/svga_pipe_blit.c b/src/gallium/drivers/svga/svga_pipe_blit.c
index e38f36dc63d..1f6382e06a5 100644
--- a/src/gallium/drivers/svga/svga_pipe_blit.c
+++ b/src/gallium/drivers/svga/svga_pipe_blit.c
@@ -53,7 +53,6 @@ copy_region_vgpu10(struct svga_context *svga, struct pipe_resource *src_tex,
uint32 srcSubResource, dstSubResource;
struct svga_texture *dtex, *stex;
SVGA3dCopyBox box;
- int i, num_layers = 1;
stex = svga_texture(src_tex);
dtex = svga_texture(dst_tex);
@@ -68,36 +67,21 @@ copy_region_vgpu10(struct svga_context *svga, struct pipe_resource *src_tex,
box.srcy = src_y;
box.srcz = src_z;
- if (src_tex->target == PIPE_TEXTURE_1D_ARRAY ||
- src_tex->target == PIPE_TEXTURE_2D_ARRAY) {
- /* copy layer by layer */
- box.z = 0;
- box.d = 1;
- box.srcz = 0;
-
- num_layers = depth;
- src_face = src_z;
- dst_face = dst_z;
- }
-
- /* loop over array layers */
- for (i = 0; i < num_layers; i++) {
- srcSubResource = (src_face + i) * (src_tex->last_level + 1) + src_level;
- dstSubResource = (dst_face + i) * (dst_tex->last_level + 1) + dst_level;
+ srcSubResource = src_face * (src_tex->last_level + 1) + src_level;
+ dstSubResource = dst_face * (dst_tex->last_level + 1) + dst_level;
+ ret = SVGA3D_vgpu10_PredCopyRegion(svga->swc,
+ dtex->handle, dstSubResource,
+ stex->handle, srcSubResource, &box);
+ if (ret != PIPE_OK) {
+ svga_context_flush(svga, NULL);
ret = SVGA3D_vgpu10_PredCopyRegion(svga->swc,
dtex->handle, dstSubResource,
stex->handle, srcSubResource, &box);
- if (ret != PIPE_OK) {
- svga_context_flush(svga, NULL);
- ret = SVGA3D_vgpu10_PredCopyRegion(svga->swc,
- dtex->handle, dstSubResource,
- stex->handle, srcSubResource, &box);
- assert(ret == PIPE_OK);
- }
-
- svga_define_texture_level(dtex, dst_face + i, dst_level);
+ assert(ret == PIPE_OK);
}
+
+ svga_define_texture_level(dtex, dst_face, dst_level);
}
@@ -152,6 +136,7 @@ svga_resource_copy_region(struct pipe_context *pipe,
dtex = svga_texture(dst_tex);
if (src_tex->target == PIPE_TEXTURE_CUBE ||
+ src_tex->target == PIPE_TEXTURE_2D_ARRAY ||
src_tex->target == PIPE_TEXTURE_1D_ARRAY) {
src_face_layer = src_box->z;
src_z = 0;
@@ -163,6 +148,7 @@ svga_resource_copy_region(struct pipe_context *pipe,
}
if (dst_tex->target == PIPE_TEXTURE_CUBE ||
+ dst_tex->target == PIPE_TEXTURE_2D_ARRAY ||
dst_tex->target == PIPE_TEXTURE_1D_ARRAY) {
dst_face_layer = dstz;
dst_z = 0;