diff options
author | Lucas Stach <l.stach@pengutronix.de> | 2014-07-29 18:50:04 +0200 |
---|---|---|
committer | Lucas Stach <l.stach@pengutronix.de> | 2014-07-30 12:22:54 +0200 |
commit | 36962c854c61e2731b5155c707b2f99f7f076923 (patch) | |
tree | bb3cdfeb1bb193715bae0ba1c829de34ba83c5e1 | |
parent | 6841b35cb6cd25d82b16109d099c77b2f08baa3b (diff) | |
download | mesa-36962c854c61e2731b5155c707b2f99f7f076923.tar.gz mesa-36962c854c61e2731b5155c707b2f99f7f076923.tar.xz |
etna: implement flush_front_buffer as pipe blit
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
-rw-r--r-- | src/gallium/drivers/etna/etna_screen.c | 68 |
1 files changed, 16 insertions, 52 deletions
diff --git a/src/gallium/drivers/etna/etna_screen.c b/src/gallium/drivers/etna/etna_screen.c index 591596a37e..0a82256238 100644 --- a/src/gallium/drivers/etna/etna_screen.c +++ b/src/gallium/drivers/etna/etna_screen.c @@ -435,62 +435,26 @@ static void etna_screen_flush_frontbuffer( struct pipe_screen *screen, struct etna_resource *drawable = winsys_drawable_handle; struct etna_resource *rt_resource = etna_resource(resource); struct etna_pipe_context *ectx = rt_resource->last_ctx; + struct pipe_blit_info blit; assert(level <= resource->last_level && layer < resource->array_size); assert(ectx); - struct etna_ctx *ctx = ectx->ctx; - etna_set_state(ctx, VIVS_GL_FLUSH_CACHE, VIVS_GL_FLUSH_CACHE_COLOR); - etna_stall(ctx, SYNC_RECIPIENT_RA, SYNC_RECIPIENT_PE); + memset(&blit, 0, sizeof(blit)); + blit.mask = PIPE_MASK_RGBA; + blit.filter = PIPE_TEX_FILTER_LINEAR; + blit.src.resource = &rt_resource->base; + blit.src.format = rt_resource->base.format; + blit.src.level = level; + blit.src.box.width = rt_resource->levels[level].width; + blit.src.box.height = rt_resource->levels[level].height; + blit.dst.resource = &drawable->base; + blit.dst.format = drawable->base.format; + blit.dst.level = 0; + blit.dst.box.width = drawable->levels[0].width; + blit.dst.box.height = drawable->levels[0].height; + + ectx->base.blit(&ectx->base, &blit); - /* Set up color TS to source surface before blit, if needed */ - uint32_t ts_mem_config = 0; - if(rt_resource->base.nr_samples > 1) - ts_mem_config |= VIVS_TS_MEM_CONFIG_MSAA | translate_msaa_format(rt_resource->base.format, false); - if(rt_resource->levels[level].ts_size) - { - etna_set_state_multi(ctx, VIVS_TS_MEM_CONFIG, 4, (uint32_t[]) { - ectx->gpu3d.TS_MEM_CONFIG = VIVS_TS_MEM_CONFIG_COLOR_FAST_CLEAR | ts_mem_config, - ectx->gpu3d.TS_COLOR_STATUS_BASE = etna_bo_gpu_address(rt_resource->ts_bo) + rt_resource->levels[level].ts_offset, - ectx->gpu3d.TS_COLOR_SURFACE_BASE = etna_bo_gpu_address(rt_resource->bo) + rt_resource->levels[level].offset, - ectx->gpu3d.TS_COLOR_CLEAR_VALUE = rt_resource->levels[level].clear_value - }); - } else { - etna_set_state(ctx, VIVS_TS_MEM_CONFIG, - ectx->gpu3d.TS_MEM_CONFIG = ts_mem_config); - } - ectx->dirty_bits |= ETNA_STATE_TS; - - int msaa_xscale=1, msaa_yscale=1; - if(!translate_samples_to_xyscale(resource->nr_samples, &msaa_xscale, &msaa_yscale, NULL)) - return; - - /* Kick off RS here */ - struct compiled_rs_state copy_to_screen; - etna_compile_rs_state(ctx, ©_to_screen, &(struct rs_state){ - .source_format = translate_rt_format(rt_resource->base.format, false), - .source_tiling = rt_resource->layout, - .source_addr[0] = etna_get_level_pipe_addr(rt_resource, level, 0), - .source_addr[1] = etna_get_level_pipe_addr(rt_resource, level, 1), - .source_stride = rt_resource->levels[level].stride, - .dest_format = translate_rt_format(drawable->base.format, false), - .dest_tiling = drawable->layout, - .dest_addr[0] = etna_bo_gpu_address(drawable->bo), - .dest_stride = drawable->levels[0].stride, - .downsample_x = msaa_xscale > 1, - .downsample_y = msaa_yscale > 1, - .swap_rb = translate_rb_src_dst_swap(rt_resource->base.format, - drawable->base.format), - .dither = {0xffffffff, 0xffffffff}, // XXX dither when going from 24 to 16 bit? - .clear_mode = VIVS_RS_CLEAR_CONTROL_MODE_DISABLED, - .width = drawable->levels[0].width * msaa_xscale, - .height = drawable->levels[0].height * msaa_yscale - }); - etna_submit_rs_state(ctx, ©_to_screen); - DBG_F(ETNA_DBG_FRAME_MSGS, - "Queued RS command to flush screen from %08x to %08x stride=%08x width=%i height=%i, ctx %p", - etna_bo_gpu_address(rt_resource->bo) + rt_resource->levels[level].offset, - etna_bo_gpu_address(drawable->bo), drawable->levels[0].stride, - drawable->levels[0].width, drawable->levels[0].height, ctx); ectx->base.flush(&ectx->base, NULL, 0); } |