+ // can't copy within one resource
+ if (stex->handle == dtex->handle)
+ return false;
+
+ /* can't copy between different resource types */
+ if (svga_resource_type(blit_info->src.resource->target) !=
+ svga_resource_type(blit_info->dst.resource->target))
+ return false;
+
+ /* check that the blit src/dst regions are same size, no flipping, etc. */
+ if (blit_info->src.box.width != blit_info->dst.box.width ||
+ blit_info->src.box.height != blit_info->dst.box.height)
+ return false;
+
+ /* depth/stencil copies not supported at this time */
+ if (blit_info->mask != PIPE_MASK_RGBA)
+ return false;
+
+ if (blit_info->alpha_blend || blit_info->render_condition_enable ||
+ blit_info->scissor_enable)
+ return false;
+
+ /* check that src/dst surface formats are compatible for
+ the VGPU device.*/
+ return util_is_format_compatible(
+ util_format_description(blit_info->src.resource->format),
+ util_format_description(blit_info->dst.resource->format));
+}
+
+
+static void
+svga_blit(struct pipe_context *pipe,
+ const struct pipe_blit_info *blit_info)
+{
+ struct svga_context *svga = svga_context(pipe);
+ struct pipe_blit_info blit = *blit_info;
+
+ if (!svga_have_vgpu10(svga) &&
+ blit.src.resource->nr_samples > 1 &&
+ blit.dst.resource->nr_samples <= 1 &&
+ !util_format_is_depth_or_stencil(blit.src.resource->format) &&
+ !util_format_is_pure_integer(blit.src.resource->format)) {
+ debug_printf("svga: color resolve unimplemented\n");
+ return;
+ }
+
+ if (can_blit_via_copy_region_vgpu10(svga, blit_info)) {
+ unsigned src_face, src_z, dst_face, dst_z;
+
+ if (blit.src.resource->target == PIPE_TEXTURE_CUBE) {
+ src_face = blit.src.box.z;
+ src_z = 0;
+ assert(blit.src.box.depth == 1);
+ }
+ else {
+ src_face = 0;
+ src_z = blit.src.box.z;
+ }
+
+ if (blit.dst.resource->target == PIPE_TEXTURE_CUBE) {
+ dst_face = blit.dst.box.z;
+ dst_z = 0;
+ assert(blit.src.box.depth == 1);
+ }
+ else {
+ dst_face = 0;
+ dst_z = blit.dst.box.z;
+ }
+
+ copy_region_vgpu10(svga,
+ blit.src.resource,
+ blit.src.box.x, blit.src.box.y, src_z,
+ blit.src.level, src_face,
+ blit.dst.resource,
+ blit.dst.box.x, blit.dst.box.y, dst_z,
+ blit.dst.level, dst_face,
+ blit.src.box.width, blit.src.box.height,
+ blit.src.box.depth);
+ return;
+ }
+
+ 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.dst.resource,
+ blit.dst.level,
+ blit.dst.box.x, blit.dst.box.y,
+ blit.dst.box.z, blit.src.resource,
+ blit.src.level, &blit.src.box);
+ return; /* done */
+ }
+
+ if ((blit.mask & PIPE_MASK_S) ||
+ !util_blitter_is_blit_supported(svga->blitter, blit_info)) {
+ debug_printf("svga: blit unsupported %s -> %s\n",
+ util_format_short_name(blit.src.resource->format),
+ util_format_short_name(blit.dst.resource->format));
+ return;
+ }
+
+ /**
+ * When there is blit from srgb to linear format or vice versa, we change
+ * src.format to srgb or linear, respectively
+ */
+
+ if (util_format_is_srgb(blit.dst.format)) {
+ blit.src.format = util_format_srgb(blit.src.format);
+ }
+ else {
+ blit.src.format = util_format_linear(blit.src.format);
+ }
+
+ /* XXX turn off occlusion and streamout queries */
+
+ util_blitter_save_vertex_buffer_slot(svga->blitter, svga->curr.vb);
+ util_blitter_save_vertex_elements(svga->blitter, (void*)svga->curr.velems);
+ util_blitter_save_vertex_shader(svga->blitter, svga->curr.vs);
+ util_blitter_save_geometry_shader(svga->blitter, svga->curr.user_gs);
+ util_blitter_save_so_targets(svga->blitter, svga->num_so_targets,
+ (struct pipe_stream_output_target**)svga->so_targets);
+ util_blitter_save_rasterizer(svga->blitter, (void*)svga->curr.rast);
+ util_blitter_save_viewport(svga->blitter, &svga->curr.viewport);
+ util_blitter_save_scissor(svga->blitter, &svga->curr.scissor);
+ util_blitter_save_fragment_shader(svga->blitter, svga->curr.fs);
+ util_blitter_save_blend(svga->blitter, (void*)svga->curr.blend);
+ util_blitter_save_depth_stencil_alpha(svga->blitter,
+ (void*)svga->curr.depth);
+ util_blitter_save_stencil_ref(svga->blitter, &svga->curr.stencil_ref);
+ util_blitter_save_sample_mask(svga->blitter, svga->curr.sample_mask);
+ util_blitter_save_framebuffer(svga->blitter, &svga->curr.framebuffer);
+ util_blitter_save_fragment_sampler_states(svga->blitter,
+ svga->curr.num_samplers[PIPE_SHADER_FRAGMENT],
+ (void**)svga->curr.sampler[PIPE_SHADER_FRAGMENT]);
+ util_blitter_save_fragment_sampler_views(svga->blitter,
+ svga->curr.num_sampler_views[PIPE_SHADER_FRAGMENT],
+ svga->curr.sampler_views[PIPE_SHADER_FRAGMENT]);
+ /*util_blitter_save_render_condition(svga->blitter, svga->render_cond_query,
+ svga->render_cond_cond, svga->render_cond_mode);*/
+ util_blitter_blit(svga->blitter, &blit);
+}
+
+
+static void
+svga_flush_resource(struct pipe_context *pipe,
+ struct pipe_resource *resource)
+{