[Mesa-dev] [PATCH 19/23] softpipe: implement blit

Marek Olšák maraeo at gmail.com
Fri Sep 14 10:09:46 PDT 2012


---
 src/gallium/drivers/softpipe/sp_context.c |   11 ++++++
 src/gallium/drivers/softpipe/sp_context.h |    3 ++
 src/gallium/drivers/softpipe/sp_surface.c |   55 +++++++++++++++++++++++++++++
 3 files changed, 69 insertions(+)

diff --git a/src/gallium/drivers/softpipe/sp_context.c b/src/gallium/drivers/softpipe/sp_context.c
index 0360b3b..891bb26 100644
--- a/src/gallium/drivers/softpipe/sp_context.c
+++ b/src/gallium/drivers/softpipe/sp_context.c
@@ -99,6 +99,10 @@ softpipe_destroy( struct pipe_context *pipe )
    pipe_sampler_view_reference(&softpipe->pstipple.sampler_view, NULL);
 #endif
 
+   if (softpipe->blitter) {
+      util_blitter_destroy(softpipe->blitter);
+   }
+
    if (softpipe->draw)
       draw_destroy( softpipe->draw );
 
@@ -310,6 +314,13 @@ softpipe_create_context( struct pipe_screen *screen,
    draw_set_rasterize_stage(softpipe->draw, softpipe->vbuf);
    draw_set_render(softpipe->draw, softpipe->vbuf_backend);
 
+   softpipe->blitter = util_blitter_create(&softpipe->pipe);
+   if (!softpipe->blitter) {
+      goto fail;
+   }
+
+   /* must be done before installing Draw stages */
+   util_blitter_cache_all_shaders(softpipe->blitter);
 
    /* plug in AA line/point stages */
    draw_install_aaline_stage(softpipe->draw, &softpipe->pipe);
diff --git a/src/gallium/drivers/softpipe/sp_context.h b/src/gallium/drivers/softpipe/sp_context.h
index 44599dd..86efcd9 100644
--- a/src/gallium/drivers/softpipe/sp_context.h
+++ b/src/gallium/drivers/softpipe/sp_context.h
@@ -32,6 +32,7 @@
 #define SP_CONTEXT_H
 
 #include "pipe/p_context.h"
+#include "util/u_blitter.h"
 
 #include "draw/draw_vertex.h"
 
@@ -170,6 +171,8 @@ struct softpipe_context {
    struct vbuf_render *vbuf_backend;
    struct draw_stage *vbuf;
 
+   struct blitter_context *blitter;
+
    boolean dirty_render_cache;
 
    struct softpipe_tile_cache *cbuf_cache[PIPE_MAX_COLOR_BUFS];
diff --git a/src/gallium/drivers/softpipe/sp_surface.c b/src/gallium/drivers/softpipe/sp_surface.c
index 55b27e6..bb143f4 100644
--- a/src/gallium/drivers/softpipe/sp_surface.c
+++ b/src/gallium/drivers/softpipe/sp_surface.c
@@ -25,14 +25,69 @@
  * 
  **************************************************************************/
 
+#include "util/u_format.h"
 #include "util/u_surface.h"
 #include "sp_context.h"
 #include "sp_surface.h"
 
+static void sp_blit(struct pipe_context *pipe,
+                    const struct pipe_blit_info *info)
+{
+   struct softpipe_context *sp = softpipe_context(pipe);
+
+   if (info->src.resource->nr_samples > 1 &&
+       info->dst.resource->nr_samples <= 1 &&
+       !util_format_is_depth_or_stencil(info->src.resource->format) &&
+       !util_format_is_pure_integer(info->src.resource->format)) {
+      debug_printf("softpipe: color resolve unimplemented\n");
+      return;
+   }
+
+   if (util_try_blit_via_copy_region(pipe, info)) {
+      return; /* done */
+   }
+
+   if (!util_blitter_is_blit_supported(sp->blitter, info)) {
+      debug_printf("softpipe: 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_buffers(sp->blitter, sp->num_vertex_buffers,
+                                    sp->vertex_buffer);
+   util_blitter_save_vertex_elements(sp->blitter, sp->velems);
+   util_blitter_save_vertex_shader(sp->blitter, sp->vs);
+   util_blitter_save_geometry_shader(sp->blitter, sp->gs);
+   util_blitter_save_so_targets(sp->blitter, sp->num_so_targets,
+                     (struct pipe_stream_output_target**)sp->so_targets);
+   util_blitter_save_rasterizer(sp->blitter, sp->rasterizer);
+   util_blitter_save_viewport(sp->blitter, &sp->viewport);
+   util_blitter_save_scissor(sp->blitter, &sp->scissor);
+   util_blitter_save_fragment_shader(sp->blitter, sp->fs);
+   util_blitter_save_blend(sp->blitter, sp->blend);
+   util_blitter_save_depth_stencil_alpha(sp->blitter, sp->depth_stencil);
+   util_blitter_save_stencil_ref(sp->blitter, &sp->stencil_ref);
+   /*util_blitter_save_sample_mask(sp->blitter, sp->sample_mask);*/
+   util_blitter_save_framebuffer(sp->blitter, &sp->framebuffer);
+   util_blitter_save_fragment_sampler_states(sp->blitter,
+                     sp->num_samplers[PIPE_SHADER_FRAGMENT],
+                     (void**)sp->samplers[PIPE_SHADER_FRAGMENT]);
+   util_blitter_save_fragment_sampler_views(sp->blitter,
+                     sp->num_sampler_views[PIPE_SHADER_FRAGMENT],
+                     sp->sampler_views[PIPE_SHADER_FRAGMENT]);
+   util_blitter_save_render_condition(sp->blitter, sp->render_cond_query,
+                                      sp->render_cond_mode);
+   util_blitter_blit(sp->blitter, info);
+}
+
 void
 sp_init_surface_functions(struct softpipe_context *sp)
 {
    sp->pipe.resource_copy_region = util_resource_copy_region;
    sp->pipe.clear_render_target = util_clear_render_target;
    sp->pipe.clear_depth_stencil = util_clear_depth_stencil;
+   sp->pipe.blit = sp_blit;
 }
-- 
1.7.9.5



More information about the mesa-dev mailing list