struct pipe_transfer *ib_transfer = NULL;
struct pipe_transfer *cb_transfer[SVGA_MAX_CONST_BUFS] = { 0 };
struct draw_context *draw = svga->swtnl.draw;
- MAYBE_UNUSED unsigned old_num_vertex_buffers;
+ ASSERTED unsigned old_num_vertex_buffers;
unsigned i;
const void *map;
- enum pipe_error ret;
+ boolean retried;
SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_SWTNLDRAWVBO);
/* Make sure that the need_swtnl flag does not go away */
svga->state.sw.in_swtnl_draw = TRUE;
- ret = svga_update_state(svga, SVGA_STATE_SWTNL_DRAW);
- if (ret != PIPE_OK) {
- svga_context_flush(svga, NULL);
- ret = svga_update_state(svga, SVGA_STATE_SWTNL_DRAW);
+ SVGA_RETRY_CHECK(svga, svga_update_state(svga, SVGA_STATE_SWTNL_DRAW), retried);
+ if (retried) {
svga->swtnl.new_vbuf = TRUE;
- assert(ret == PIPE_OK);
}
/*
* 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);
/* 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);
}
/* Map constant buffers */
map = pipe_buffer_map(&svga->pipe,
svga->curr.constbufs[PIPE_SHADER_VERTEX][i].buffer,
- PIPE_TRANSFER_READ,
+ PIPE_TRANSFER_READ |
+ PIPE_TRANSFER_UNSYNCHRONIZED,
&cb_transfer[i]);
assert(map);
draw_set_mapped_constant_buffer(
* 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);
}
svga->dirty |= SVGA_NEW_NEED_PIPELINE | SVGA_NEW_NEED_SWVFETCH;
SVGA_STATS_TIME_POP(svga_sws(svga));
- return ret;
+ return PIPE_OK;
}
-
-
-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;
/*
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);
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);
}