softpipe: implement blit
authorMarek Olšák <maraeo@gmail.com>
Wed, 12 Sep 2012 22:48:58 +0000 (00:48 +0200)
committerMarek Olšák <maraeo@gmail.com>
Sun, 30 Sep 2012 16:57:57 +0000 (18:57 +0200)
Tested-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/drivers/softpipe/sp_context.c
src/gallium/drivers/softpipe/sp_context.h
src/gallium/drivers/softpipe/sp_surface.c

index 0360b3ba9fbe0c50f0aad58b173bef4cff684886..891bb261d8ad33af998d22aace51e3e43a65438a 100644 (file)
@@ -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);
index 44599dd48456a0c007f99da1a8a916b1c0f0ffc0..86efcd9d664d6d2a1684c88438c3f1cfe0920e96 100644 (file)
@@ -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];
index 55b27e60100af43028f13a83eeb41457bb677e6c..bb143f4cb3a82469d3438a05ad5fd5b3bae29254 100644 (file)
  * 
  **************************************************************************/
 
+#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;
 }