/* this is same for a2xx/a3xx, so split into helper: */ void fd_draw_emit(struct fd_context *ctx, const struct pipe_draw_info *info) { struct pipe_index_buffer *idx = &ctx->indexbuf; struct fd_bo *idx_bo = NULL; enum pc_di_index_size idx_type = INDEX_SIZE_IGN; enum pc_di_src_sel src_sel; uint32_t idx_size, idx_offset; if (info->indexed) { assert(!idx->user_buffer); idx_bo = fd_resource(idx->buffer)->bo; idx_type = size2indextype(idx->index_size); idx_size = idx->index_size * info->count; idx_offset = idx->offset; src_sel = DI_SRC_SEL_DMA; } else { idx_bo = NULL; idx_type = INDEX_SIZE_IGN; idx_size = 0; idx_offset = 0; src_sel = DI_SRC_SEL_AUTO_INDEX; } fd_draw(ctx, mode2primtype(info->mode), src_sel, info->count, idx_type, idx_size, idx_offset, idx_bo); }
/* this is same for a2xx/a3xx, so split into helper: */ void fd_draw_emit(struct fd_context *ctx, const struct pipe_draw_info *info) { struct fd_ringbuffer *ring = ctx->ring; struct pipe_index_buffer *idx = &ctx->indexbuf; struct fd_bo *idx_bo = NULL; enum pc_di_index_size idx_type = INDEX_SIZE_IGN; enum pc_di_src_sel src_sel; uint32_t idx_size, idx_offset; if (info->indexed) { assert(!idx->user_buffer); idx_bo = fd_resource(idx->buffer)->bo; idx_type = size2indextype(idx->index_size); idx_size = idx->index_size * info->count; idx_offset = idx->offset; src_sel = DI_SRC_SEL_DMA; } else { idx_bo = NULL; idx_type = INDEX_SIZE_IGN; idx_size = 0; idx_offset = 0; src_sel = DI_SRC_SEL_AUTO_INDEX; } OUT_PKT3(ring, CP_DRAW_INDX, info->indexed ? 5 : 3); OUT_RING(ring, 0x00000000); /* viz query info. */ OUT_RING(ring, DRAW(mode2primtype(info->mode), src_sel, idx_type, IGNORE_VISIBILITY)); OUT_RING(ring, info->count); /* NumIndices */ if (info->indexed) { OUT_RELOC(ring, idx_bo, idx_offset, 0); OUT_RING (ring, idx_size); } }