#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"
/* 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) |
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) /
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);
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);
}
}
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
}
pipe_resource_reference(&ib.buffer, NULL);
+ sctx->b.num_draw_calls++;
}