From: Marek Olšák Date: Wed, 12 Sep 2012 22:48:58 +0000 (+0200) Subject: softpipe: implement blit X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3d9d4b1ce6e700d85920eca84ae58a4dcf7288c2;p=mesa.git softpipe: implement blit Tested-by: Michel Dänzer Reviewed-by: Brian Paul --- diff --git a/src/gallium/drivers/softpipe/sp_context.c b/src/gallium/drivers/softpipe/sp_context.c index 0360b3ba9fb..891bb261d8a 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 44599dd4845..86efcd9d664 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 55b27e60100..bb143f4cb3a 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; }