/* Assumes all values are within bounds -- no checking at this level - * do it higher up if required. */ static void i915_surface_copy_blitter(struct pipe_context *pipe, struct pipe_resource *dst, unsigned dst_level, unsigned dstx, unsigned dsty, unsigned dstz, struct pipe_resource *src, unsigned src_level, const struct pipe_box *src_box) { struct i915_texture *dst_tex = i915_texture(dst); struct i915_texture *src_tex = i915_texture(src); struct pipe_resource *dpt = &dst_tex->b.b; struct pipe_resource *spt = &src_tex->b.b; unsigned dst_offset, src_offset; /* in bytes */ /* Fallback for buffers. */ if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) { util_resource_copy_region(pipe, dst, dst_level, dstx, dsty, dstz, src, src_level, src_box); return; } /* XXX cannot copy 3d regions at this time */ assert(src_box->depth == 1); if (dst->target != PIPE_TEXTURE_CUBE && dst->target != PIPE_TEXTURE_3D) assert(dstz == 0); dst_offset = i915_texture_offset(dst_tex, dst_level, dstz); if (src->target != PIPE_TEXTURE_CUBE && src->target != PIPE_TEXTURE_3D) assert(src_box->z == 0); src_offset = i915_texture_offset(src_tex, src_level, src_box->z); assert( util_format_get_blocksize(dpt->format) == util_format_get_blocksize(spt->format) ); assert( util_format_get_blockwidth(dpt->format) == util_format_get_blockwidth(spt->format) ); assert( util_format_get_blockheight(dpt->format) == util_format_get_blockheight(spt->format) ); assert( util_format_get_blockwidth(dpt->format) == 1 ); assert( util_format_get_blockheight(dpt->format) == 1 ); i915_copy_blit( i915_context(pipe), util_format_get_blocksize(dpt->format), (unsigned short) src_tex->stride, src_tex->buffer, src_offset, (unsigned short) dst_tex->stride, dst_tex->buffer, dst_offset, (short) src_box->x, (short) src_box->y, (short) dstx, (short) dsty, (short) src_box->width, (short) src_box->height ); }
/* Assumes all values are within bounds -- no checking at this level - * do it higher up if required. */ static void i915_surface_copy(struct pipe_context *pipe, struct pipe_surface *dst, unsigned dstx, unsigned dsty, struct pipe_surface *src, unsigned srcx, unsigned srcy, unsigned width, unsigned height) { struct i915_texture *dst_tex = (struct i915_texture *)dst->texture; struct i915_texture *src_tex = (struct i915_texture *)src->texture; assert( dst != src ); assert( dst_tex->base.block.size == src_tex->base.block.size ); assert( dst_tex->base.block.width == src_tex->base.block.height ); assert( dst_tex->base.block.height == src_tex->base.block.height ); assert( dst_tex->base.block.width == 1 ); assert( dst_tex->base.block.height == 1 ); i915_copy_blit( i915_context(pipe), FALSE, dst_tex->base.block.size, (unsigned short) src_tex->stride, src_tex->buffer, src->offset, (unsigned short) dst_tex->stride, dst_tex->buffer, dst->offset, (short) srcx, (short) srcy, (short) dstx, (short) dsty, (short) width, (short) height ); }