- /* set dst tiles to linear layout */
- {
- unsigned tx, ty, tw, th;
- unsigned x, y;
- enum lp_texture_usage usage;
-
- adjust_to_tile_bounds(dstx, dsty, width, height, &tx, &ty, &tw, &th);
-
- for (y = 0; y < th; y += TILE_SIZE) {
- boolean contained_y = ty + y >= dsty &&
- ty + y + TILE_SIZE <= dsty + height ?
- TRUE : FALSE;
-
- for (x = 0; x < tw; x += TILE_SIZE) {
- boolean contained_x = tx + x >= dstx &&
- tx + x + TILE_SIZE <= dstx + width ?
- TRUE : FALSE;
-
- /*
- * Set the usage mode to WRITE_ALL for the tiles which are
- * completely contained by the dest rectangle.
- */
- if (contained_y && contained_x)
- usage = LP_TEX_USAGE_WRITE_ALL;
- else
- usage = LP_TEX_USAGE_READ_WRITE;
-
- (void) llvmpipe_get_texture_tile_linear(dst_tex,
- dstz, dst_level,
- usage,
- tx + x, ty + y);
- }
+ if (util_try_blit_via_copy_region(pipe, &info)) {
+ return; /* done */
+ }
+
+ if (!util_blitter_is_blit_supported(lp->blitter, &info)) {
+ debug_printf("llvmpipe: blit unsupported %s -> %s\n",
+ util_format_short_name(info.src.resource->format),
+ util_format_short_name(info.dst.resource->format));
+ return;
+ }
+
+ /* XXX turn off occlusion and streamout queries */
+
+ util_blitter_save_vertex_buffer_slot(lp->blitter, lp->vertex_buffer);
+ util_blitter_save_vertex_elements(lp->blitter, (void*)lp->velems);
+ util_blitter_save_vertex_shader(lp->blitter, (void*)lp->vs);
+ util_blitter_save_geometry_shader(lp->blitter, (void*)lp->gs);
+ util_blitter_save_so_targets(lp->blitter, lp->num_so_targets,
+ (struct pipe_stream_output_target**)lp->so_targets);
+ util_blitter_save_rasterizer(lp->blitter, (void*)lp->rasterizer);
+ util_blitter_save_viewport(lp->blitter, &lp->viewports[0]);
+ util_blitter_save_scissor(lp->blitter, &lp->scissors[0]);
+ util_blitter_save_fragment_shader(lp->blitter, lp->fs);
+ util_blitter_save_blend(lp->blitter, (void*)lp->blend);
+ util_blitter_save_depth_stencil_alpha(lp->blitter, (void*)lp->depth_stencil);
+ util_blitter_save_stencil_ref(lp->blitter, &lp->stencil_ref);
+ /*util_blitter_save_sample_mask(sp->blitter, lp->sample_mask);*/
+ util_blitter_save_framebuffer(lp->blitter, &lp->framebuffer);
+ util_blitter_save_fragment_sampler_states(lp->blitter,
+ lp->num_samplers[PIPE_SHADER_FRAGMENT],
+ (void**)lp->samplers[PIPE_SHADER_FRAGMENT]);
+ util_blitter_save_fragment_sampler_views(lp->blitter,
+ lp->num_sampler_views[PIPE_SHADER_FRAGMENT],
+ lp->sampler_views[PIPE_SHADER_FRAGMENT]);
+ util_blitter_save_render_condition(lp->blitter, lp->render_cond_query,
+ lp->render_cond_cond, lp->render_cond_mode);
+ util_blitter_blit(lp->blitter, &info);
+}
+
+
+static void
+lp_flush_resource(struct pipe_context *ctx, struct pipe_resource *resource)
+{
+}
+
+
+static struct pipe_surface *
+llvmpipe_create_surface(struct pipe_context *pipe,
+ struct pipe_resource *pt,
+ const struct pipe_surface *surf_tmpl)
+{
+ struct pipe_surface *ps;
+
+ if (!(pt->bind & (PIPE_BIND_DEPTH_STENCIL | PIPE_BIND_RENDER_TARGET))) {
+ debug_printf("Illegal surface creation without bind flag\n");
+ if (util_format_is_depth_or_stencil(surf_tmpl->format)) {
+ pt->bind |= PIPE_BIND_DEPTH_STENCIL;
+ }
+ else {
+ pt->bind |= PIPE_BIND_RENDER_TARGET;