X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsvga%2Fsvga_swtnl_draw.c;h=96d8a52eb6244608c0afff0726a39a94c219f68d;hb=8a4b0d852c1f28c302e0df6fa63dbc08a32bc683;hp=66e4adfdcbe46cb3c3c4fb27a8d5df9eb084bedc;hpb=ccd6bf8272cba7c57e4ae09ab8a03db63472648e;p=mesa.git diff --git a/src/gallium/drivers/svga/svga_swtnl_draw.c b/src/gallium/drivers/svga/svga_swtnl_draw.c index 66e4adfdcbe..96d8a52eb62 100644 --- a/src/gallium/drivers/svga/svga_swtnl_draw.c +++ b/src/gallium/drivers/svga/svga_swtnl_draw.c @@ -42,12 +42,15 @@ svga_swtnl_draw_vbo(struct svga_context *svga, { struct pipe_transfer *vb_transfer[PIPE_MAX_ATTRIBS] = { 0 }; struct pipe_transfer *ib_transfer = NULL; - struct pipe_transfer *cb_transfer = NULL; + struct pipe_transfer *cb_transfer[SVGA_MAX_CONST_BUFS] = { 0 }; struct draw_context *draw = svga->swtnl.draw; + ASSERTED unsigned old_num_vertex_buffers; unsigned i; const void *map; enum pipe_error ret; + SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_SWTNLDRAWVBO); + assert(!svga->dirty); assert(svga->state.sw.need_swtnl); assert(draw); @@ -67,37 +70,49 @@ svga_swtnl_draw_vbo(struct svga_context *svga, * Map vertex buffers */ for (i = 0; i < svga->curr.num_vertex_buffers; i++) { - if (svga->curr.vb[i].buffer) { + if (svga->curr.vb[i].buffer.resource) { map = pipe_buffer_map(&svga->pipe, - svga->curr.vb[i].buffer, - PIPE_TRANSFER_READ, + svga->curr.vb[i].buffer.resource, + PIPE_TRANSFER_READ | + PIPE_TRANSFER_UNSYNCHRONIZED, &vb_transfer[i]); draw_set_mapped_vertex_buffer(draw, i, map, ~0); } } + old_num_vertex_buffers = svga->curr.num_vertex_buffers; /* Map index buffer, if present */ map = NULL; - if (info->indexed && svga->curr.ib.buffer) { - map = pipe_buffer_map(&svga->pipe, svga->curr.ib.buffer, - PIPE_TRANSFER_READ, - &ib_transfer); + if (info->index_size) { + if (info->has_user_indices) { + map = (ubyte *) info->index.user; + } else { + map = pipe_buffer_map(&svga->pipe, info->index.resource, + PIPE_TRANSFER_READ | + PIPE_TRANSFER_UNSYNCHRONIZED, &ib_transfer); + } draw_set_indexes(draw, - (const ubyte *) map + svga->curr.ib.offset, - svga->curr.ib.index_size, ~0); + (const ubyte *) map, + info->index_size, ~0); } - if (svga->curr.cb[PIPE_SHADER_VERTEX]) { + /* Map constant buffers */ + for (i = 0; i < ARRAY_SIZE(svga->curr.constbufs[PIPE_SHADER_VERTEX]); ++i) { + if (svga->curr.constbufs[PIPE_SHADER_VERTEX][i].buffer == NULL) { + continue; + } + map = pipe_buffer_map(&svga->pipe, - svga->curr.cb[PIPE_SHADER_VERTEX], - PIPE_TRANSFER_READ, - &cb_transfer); + svga->curr.constbufs[PIPE_SHADER_VERTEX][i].buffer, + PIPE_TRANSFER_READ | + PIPE_TRANSFER_UNSYNCHRONIZED, + &cb_transfer[i]); assert(map); draw_set_mapped_constant_buffer( - draw, PIPE_SHADER_VERTEX, 0, + draw, PIPE_SHADER_VERTEX, i, map, - svga->curr.cb[PIPE_SHADER_VERTEX]->width0); + svga->curr.constbufs[PIPE_SHADER_VERTEX][i].buffer->width0); } draw_vbo(draw, info); @@ -105,13 +120,13 @@ svga_swtnl_draw_vbo(struct svga_context *svga, draw_flush(svga->swtnl.draw); /* Ensure the draw module didn't touch this */ - assert(i == svga->curr.num_vertex_buffers); - + assert(old_num_vertex_buffers == svga->curr.num_vertex_buffers); + /* * unmap vertex/index buffers */ for (i = 0; i < svga->curr.num_vertex_buffers; i++) { - if (svga->curr.vb[i].buffer) { + if (svga->curr.vb[i].buffer.resource) { pipe_buffer_unmap(&svga->pipe, vb_transfer[i]); draw_set_mapped_vertex_buffer(draw, i, NULL, 0); } @@ -122,26 +137,28 @@ svga_swtnl_draw_vbo(struct svga_context *svga, draw_set_indexes(draw, NULL, 0, 0); } - if (svga->curr.cb[PIPE_SHADER_VERTEX]) { - pipe_buffer_unmap(&svga->pipe, cb_transfer); + for (i = 0; i < ARRAY_SIZE(svga->curr.constbufs[PIPE_SHADER_VERTEX]); ++i) { + if (svga->curr.constbufs[PIPE_SHADER_VERTEX][i].buffer) { + pipe_buffer_unmap(&svga->pipe, cb_transfer[i]); + } } /* Now safe to remove the need_swtnl flag in any update_state call */ svga->state.sw.in_swtnl_draw = FALSE; svga->dirty |= SVGA_NEW_NEED_PIPELINE | SVGA_NEW_NEED_SWVFETCH; + SVGA_STATS_TIME_POP(svga_sws(svga)); return ret; } - - -boolean svga_init_swtnl( struct svga_context *svga ) +boolean +svga_init_swtnl(struct svga_context *svga) { struct svga_screen *screen = svga_screen(svga->pipe.screen); svga->swtnl.backend = svga_vbuf_render_create(svga); - if(!svga->swtnl.backend) + if (!svga->swtnl.backend) goto fail; /* @@ -152,8 +169,8 @@ boolean svga_init_swtnl( struct svga_context *svga ) goto fail; - draw_set_rasterize_stage(svga->swtnl.draw, - draw_vbuf_stage( svga->swtnl.draw, svga->swtnl.backend )); + draw_set_rasterize_stage(svga->swtnl.draw, + draw_vbuf_stage(svga->swtnl.draw, svga->swtnl.backend)); draw_set_render(svga->swtnl.draw, svga->swtnl.backend); @@ -167,9 +184,6 @@ boolean svga_init_swtnl( struct svga_context *svga ) if (!screen->haveLineSmooth) draw_install_aaline_stage(svga->swtnl.draw, &svga->pipe); - /* always install polygon stipple stage */ - draw_install_pstipple_stage(svga->swtnl.draw, &svga->pipe); - /* enable/disable line stipple stage depending on device caps */ draw_enable_line_stipple(svga->swtnl.draw, !screen->haveLineStipple); @@ -183,7 +197,7 @@ boolean svga_init_swtnl( struct svga_context *svga ) screen->maxLineWidthAA)); if (debug_get_bool_option("SVGA_SWTNL_FSE", FALSE)) - draw_set_driver_clipping(svga->swtnl.draw, TRUE, TRUE, TRUE); + draw_set_driver_clipping(svga->swtnl.draw, TRUE, TRUE, TRUE, FALSE); return TRUE; @@ -192,16 +206,17 @@ fail: util_blitter_destroy(svga->blitter); if (svga->swtnl.backend) - svga->swtnl.backend->destroy( svga->swtnl.backend ); + svga->swtnl.backend->destroy(svga->swtnl.backend); if (svga->swtnl.draw) - draw_destroy( svga->swtnl.draw ); + draw_destroy(svga->swtnl.draw); return FALSE; } -void svga_destroy_swtnl( struct svga_context *svga ) +void +svga_destroy_swtnl(struct svga_context *svga) { - draw_destroy( svga->swtnl.draw ); + draw_destroy(svga->swtnl.draw); }