*
**********************************************************/
-#include "svga_resource_texture.h"
#include "svga_context.h"
#include "svga_debug.h"
#include "svga_cmd.h"
+#include "svga_resource_buffer.h"
+#include "svga_resource_texture.h"
#include "svga_surface.h"
//#include "util/u_blit_sw.h"
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);
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);
}
*/
svga_surfaces_flush( svga );
- /* Fallback for buffers. */
if (dst_tex->target == PIPE_BUFFER && src_tex->target == PIPE_BUFFER) {
- util_resource_copy_region(pipe, dst_tex, dst_level, dstx, dsty, dstz,
- src_tex, src_level, src_box);
+ /* can't copy within the same buffer, unfortunately */
+ if (svga_have_vgpu10(svga) && src_tex != dst_tex) {
+ enum pipe_error ret;
+ struct svga_winsys_surface *src_surf;
+ struct svga_winsys_surface *dst_surf;
+ struct svga_buffer *dbuffer = svga_buffer(dst_tex);
+
+ src_surf = svga_buffer_handle(svga, src_tex);
+ dst_surf = svga_buffer_handle(svga, dst_tex);
+
+ ret = SVGA3D_vgpu10_BufferCopy(svga->swc, src_surf, dst_surf,
+ src_box->x, dstx, src_box->width);
+ if (ret != PIPE_OK) {
+ svga_context_flush(svga, NULL);
+ ret = SVGA3D_vgpu10_BufferCopy(svga->swc, src_surf, dst_surf,
+ src_box->x, dstx, src_box->width);
+ assert(ret == PIPE_OK);
+ }
+
+ dbuffer->dirty = TRUE;
+ }
+ else {
+ /* use map/memcpy fallback */
+ util_resource_copy_region(pipe, dst_tex, dst_level, dstx,
+ dsty, dstz, src_tex, src_level, src_box);
+ }
return;
}
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;
src_z = src_box->z;
}
- /* different src/dst type???*/
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;
dst_z = dstz;
}
- svga_texture_copy_handle(svga,
- stex->handle,
+ stex = svga_texture(src_tex);
+ dtex = svga_texture(dst_tex);
+
+ if (svga_have_vgpu10(svga)) {
+ /* vgpu10 */
+ if (util_format_is_compressed(src_tex->format) ==
+ util_format_is_compressed(dst_tex->format) &&
+ !util_format_is_depth_and_stencil(src_tex->format) &&
+ stex->handle != dtex->handle &&
+ src_tex->target == dst_tex->target) {
+ copy_region_vgpu10(svga,
+ src_tex,
src_box->x, src_box->y, src_z,
src_level, src_face_layer,
- dtex->handle,
+ dst_tex,
dstx, dsty, dst_z,
dst_level, dst_face_layer,
src_box->width, src_box->height, src_box->depth);
+ }
+ else {
+ util_resource_copy_region(pipe, dst_tex, dst_level, dstx, dsty, dstz,
+ src_tex, src_level, src_box);
+ }
+ }
+ else {
+ /* vgpu9 */
+ if (src_tex->format == dst_tex->format) {
+ svga_texture_copy_handle(svga,
+ stex->handle,
+ src_box->x, src_box->y, src_z,
+ src_level, src_face_layer,
+ dtex->handle,
+ dstx, dsty, dst_z,
+ dst_level, dst_face_layer,
+ src_box->width, src_box->height,
+ src_box->depth);
+ }
+ else {
+ util_resource_copy_region(pipe, dst_tex, dst_level, dstx, dsty, dstz,
+ src_tex, src_level, src_box);
+ }
+ }
/* Mark the destination image as being defined */
svga_define_texture_level(dtex, dst_face_layer, dst_level);
return false;
stex = svga_texture(blit_info->src.resource);
- dtex = svga_texture(blit_info->src.resource);
+ dtex = svga_texture(blit_info->dst.resource);
// can't copy within one resource
if (stex->handle == dtex->handle)
return;
}
- if (util_try_blit_via_copy_region(pipe, blit_info)) {
+ if (util_can_blit_via_copy_region(blit_info, TRUE) ||
+ util_can_blit_via_copy_region(blit_info, FALSE)) {
+ util_resource_copy_region(pipe, blit_info->dst.resource,
+ blit_info->dst.level,
+ blit_info->dst.box.x, blit_info->dst.box.y,
+ blit_info->dst.box.z, blit_info->src.resource,
+ blit_info->src.level, &blit_info->src.box);
return; /* done */
}