radeonsi: move si_upload_const_buffer to a better place
[mesa.git] / src / gallium / drivers / radeonsi / si_state_draw.c
index 4d347ed07746b13050fcc579e6e27cb86a253c80..8dbf373d5f0fe98d91dccb5e47ad0ec5ab5d2015 100644 (file)
@@ -27,6 +27,8 @@
 #include "util/u_memory.h"
 #include "util/u_framebuffer.h"
 #include "util/u_blitter.h"
+#include "util/u_index_modify.h"
+#include "util/u_upload_mgr.h"
 #include "tgsi/tgsi_parse.h"
 #include "si_pipe.h"
 #include "si_shader.h"
@@ -545,7 +547,7 @@ static void si_state_draw(struct si_context *sctx,
 
        /* queries need some special values
         * (this is non-zero if any query is active) */
-       if (sctx->num_cs_dw_nontimer_queries_suspend) {
+       if (sctx->b.num_occlusion_queries > 0) {
                if (sctx->b.chip_class >= CIK) {
                        si_pm4_set_reg(pm4, R_028004_DB_COUNT_CONTROL,
                                       S_028004_PERFECT_ZPASS_COUNTS(1) |
@@ -592,11 +594,11 @@ static void si_state_draw(struct si_context *sctx,
                si_pm4_cmd_add(pm4, V_028A7C_VGT_INDEX_16 | (SI_BIG_ENDIAN ?
                                V_028A7C_VGT_DMA_SWAP_16_BIT : 0));
        }
-       si_pm4_cmd_end(pm4, sctx->predicate_drawing);
+       si_pm4_cmd_end(pm4, sctx->b.predicate_drawing);
 
        si_pm4_cmd_begin(pm4, PKT3_NUM_INSTANCES);
        si_pm4_cmd_add(pm4, info->instance_count);
-       si_pm4_cmd_end(pm4, sctx->predicate_drawing);
+       si_pm4_cmd_end(pm4, sctx->b.predicate_drawing);
 
        if (info->indexed) {
                uint32_t max_size = (ib->buffer->width0 - ib->offset) /
@@ -608,11 +610,11 @@ static void si_state_draw(struct si_context *sctx,
                si_pm4_add_bo(pm4, (struct r600_resource *)ib->buffer, RADEON_USAGE_READ);
                si_cmd_draw_index_2(pm4, max_size, va, info->count,
                                    V_0287F0_DI_SRC_SEL_DMA,
-                                   sctx->predicate_drawing);
+                                   sctx->b.predicate_drawing);
        } else {
                uint32_t initiator = V_0287F0_DI_SRC_SEL_AUTO_INDEX;
                initiator |= S_0287F0_USE_OPAQUE(!!info->count_from_stream_output);
-               si_cmd_draw_index_auto(pm4, info->count, initiator, sctx->predicate_drawing);
+               si_cmd_draw_index_auto(pm4, info->count, initiator, sctx->b.predicate_drawing);
        }
 
        si_pm4_set_state(sctx, draw, pm4);
@@ -718,10 +720,27 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
                ib.offset = sctx->index_buffer.offset + info->start * ib.index_size;
 
                /* Translate or upload, if needed. */
-               si_translate_index_buffer(sctx, &ib, info->count);
+               if (ib.index_size == 1) {
+                       struct pipe_resource *out_buffer = NULL;
+                       unsigned out_offset;
+                       void *ptr;
+
+                       u_upload_alloc(sctx->b.uploader, 0, info->count * 2,
+                                      &out_offset, &out_buffer, &ptr);
+
+                       util_shorten_ubyte_elts_to_userptr(
+                                               &sctx->b.b, &ib, 0, ib.offset, info->count, ptr);
+
+                       pipe_resource_reference(&ib.buffer, NULL);
+                       ib.user_buffer = NULL;
+                       ib.buffer = out_buffer;
+                       ib.offset = out_offset;
+                       ib.index_size = 2;
+               }
 
                if (ib.user_buffer && !ib.buffer) {
-                       si_upload_index_buffer(sctx, &ib, info->count);
+                       u_upload_data(sctx->b.uploader, 0, info->count * ib.index_size,
+                                     ib.user_buffer, &ib.offset, &ib.buffer);
                }
        }
 
@@ -750,7 +769,7 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
        sctx->pm4_dirty_cdwords = 0;
 
 #if SI_TRACE_CS
-       if (sctx->screen->trace_bo) {
+       if (sctx->screen->b.trace_bo) {
                si_trace_emit(sctx);
        }
 #endif
@@ -777,4 +796,5 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
        }
 
        pipe_resource_reference(&ib.buffer, NULL);
+       sctx->b.num_draw_calls++;
 }