X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsvga%2Fsvga_draw_arrays.c;h=19d5e5031377e9885383ef1d850421f8f4d0220f;hb=81371a59093d59963a43b7f1becbed9d3c657e45;hp=caf4b17de168d340bae38497816ac89622635878;hpb=99effaa9658a34eb07255bb1964569c8a86e8dda;p=mesa.git diff --git a/src/gallium/drivers/svga/svga_draw_arrays.c b/src/gallium/drivers/svga/svga_draw_arrays.c index caf4b17de16..19d5e503137 100644 --- a/src/gallium/drivers/svga/svga_draw_arrays.c +++ b/src/gallium/drivers/svga/svga_draw_arrays.c @@ -26,6 +26,7 @@ #include "svga_cmd.h" #include "util/u_inlines.h" +#include "util/u_prim.h" #include "indices/u_indices.h" #include "svga_hw_reg.h" @@ -52,11 +53,11 @@ generate_indices(struct svga_hwtnl *hwtnl, dst = pipe_buffer_create(pipe->screen, PIPE_BIND_INDEX_BUFFER, PIPE_USAGE_IMMUTABLE, size); - if (dst == NULL) + if (!dst) goto fail; dst_map = pipe_buffer_map(pipe, dst, PIPE_TRANSFER_WRITE, &transfer); - if (dst_map == NULL) + if (!dst_map) goto fail; generate(0, nr, dst_map); @@ -89,7 +90,7 @@ compare(unsigned cached_nr, unsigned nr, unsigned type) static enum pipe_error retrieve_or_generate_indices(struct svga_hwtnl *hwtnl, - unsigned prim, + enum pipe_prim_type prim, unsigned gen_type, unsigned gen_nr, unsigned gen_size, @@ -99,6 +100,8 @@ retrieve_or_generate_indices(struct svga_hwtnl *hwtnl, enum pipe_error ret = PIPE_OK; int i; + SVGA_STATS_TIME_PUSH(svga_sws(hwtnl->svga), SVGA_STATS_TIME_GENERATEINDICES); + for (i = 0; i < IDX_CACHE_MAX; i++) { if (hwtnl->index_cache[prim][i].buffer != NULL && hwtnl->index_cache[prim][i].generate == generate) { @@ -109,7 +112,7 @@ retrieve_or_generate_indices(struct svga_hwtnl *hwtnl, if (DBG) debug_printf("%s retrieve %d/%d\n", __FUNCTION__, i, gen_nr); - return PIPE_OK; + goto done; } else if (gen_type == U_GENERATE_REUSABLE) { pipe_resource_reference(&hwtnl->index_cache[prim][i].buffer, @@ -153,7 +156,7 @@ retrieve_or_generate_indices(struct svga_hwtnl *hwtnl, ret = generate_indices(hwtnl, gen_nr, gen_size, generate, out_buf); if (ret != PIPE_OK) - return ret; + goto done; hwtnl->index_cache[prim][i].generate = generate; hwtnl->index_cache[prim][i].gen_nr = gen_nr; @@ -163,13 +166,15 @@ retrieve_or_generate_indices(struct svga_hwtnl *hwtnl, debug_printf("%s cache %d/%d\n", __FUNCTION__, i, hwtnl->index_cache[prim][i].gen_nr); - return PIPE_OK; +done: + SVGA_STATS_TIME_POP(svga_sws(hwtnl->svga)); + return ret; } static enum pipe_error simple_draw_arrays(struct svga_hwtnl *hwtnl, - unsigned prim, unsigned start, unsigned count, + enum pipe_prim_type prim, unsigned start, unsigned count, unsigned start_instance, unsigned instance_count) { SVGA3dPrimitiveRange range; @@ -201,15 +206,24 @@ simple_draw_arrays(struct svga_hwtnl *hwtnl, enum pipe_error svga_hwtnl_draw_arrays(struct svga_hwtnl *hwtnl, - unsigned prim, unsigned start, unsigned count, + enum pipe_prim_type prim, unsigned start, unsigned count, unsigned start_instance, unsigned instance_count) { - unsigned gen_prim, gen_size, gen_nr, gen_type; + enum pipe_prim_type gen_prim; + unsigned gen_size, gen_nr; + enum indices_mode gen_type; u_generate_func gen_func; enum pipe_error ret = PIPE_OK; unsigned api_pv = hwtnl->api_pv; struct svga_context *svga = hwtnl->svga; + SVGA_STATS_TIME_PUSH(svga_sws(svga), SVGA_STATS_TIME_HWTNLDRAWARRAYS); + + if (svga->curr.rast->templ.fill_front != + svga->curr.rast->templ.fill_back) { + assert(hwtnl->api_fillmode == PIPE_POLYGON_MODE_FILL); + } + if (svga->curr.rast->templ.flatshade && svga->state.hw_draw.fs->constant_color_output) { /* The fragment color is a constant, not per-vertex so the whole @@ -234,8 +248,7 @@ svga_hwtnl_draw_arrays(struct svga_hwtnl *hwtnl, } } - if (hwtnl->api_fillmode != PIPE_POLYGON_MODE_FILL && - prim >= PIPE_PRIM_TRIANGLES) { + if (svga_need_unfilled_fallback(hwtnl, prim)) { /* Convert unfilled polygons into points, lines, triangles */ gen_type = u_unfilled_generator(prim, start, @@ -259,7 +272,7 @@ svga_hwtnl_draw_arrays(struct svga_hwtnl *hwtnl, } if (gen_type == U_GENERATE_LINEAR) { - return simple_draw_arrays(hwtnl, gen_prim, start, count, + ret = simple_draw_arrays(hwtnl, gen_prim, start, count, start_instance, instance_count); } else { @@ -273,25 +286,27 @@ svga_hwtnl_draw_arrays(struct svga_hwtnl *hwtnl, gen_type, gen_nr, gen_size, gen_func, &gen_buf); - if (ret != PIPE_OK) - goto done; - - ret = svga_hwtnl_simple_draw_range_elements(hwtnl, - gen_buf, - gen_size, - start, - 0, - count - 1, - gen_prim, 0, gen_nr, - start_instance, - instance_count); - if (ret != PIPE_OK) - goto done; + if (ret == PIPE_OK) { + pipe_debug_message(&svga->debug.callback, PERF_INFO, + "generating temporary index buffer for drawing %s", + u_prim_name(prim)); + + ret = svga_hwtnl_simple_draw_range_elements(hwtnl, + gen_buf, + gen_size, + start, + 0, + count - 1, + gen_prim, 0, gen_nr, + start_instance, + instance_count); + } -done: - if (gen_buf) + if (gen_buf) { pipe_resource_reference(&gen_buf, NULL); - - return ret; + } } + + SVGA_STATS_TIME_POP(svga_sws(svga)); + return ret; }