diff options
-rw-r--r-- | src/gallium/drivers/freedreno/freedreno_draw.c | 45 | ||||
-rw-r--r-- | src/gallium/drivers/freedreno/freedreno_draw.h | 51 |
2 files changed, 47 insertions, 49 deletions
diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c index eb4637db1a5..897f26a6534 100644 --- a/src/gallium/drivers/freedreno/freedreno_draw.c +++ b/src/gallium/drivers/freedreno/freedreno_draw.c @@ -40,51 +40,6 @@ #include "freedreno_util.h" -static enum pc_di_index_size -size2indextype(unsigned index_size) -{ - switch (index_size) { - case 1: return INDEX_SIZE_8_BIT; - case 2: return INDEX_SIZE_16_BIT; - case 4: return INDEX_SIZE_32_BIT; - } - DBG("unsupported index size: %d", index_size); - assert(0); - return INDEX_SIZE_IGN; -} - -/* this is same for a2xx/a3xx, so split into helper: */ -void -fd_draw_emit(struct fd_context *ctx, struct fd_ringbuffer *ring, - enum pc_di_vis_cull_mode vismode, - 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 + (info->start * idx->index_size); - 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, ring, ctx->primtypes[info->mode], vismode, src_sel, - info->count, idx_type, idx_size, idx_offset, idx_bo); -} - static void fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) { diff --git a/src/gallium/drivers/freedreno/freedreno_draw.h b/src/gallium/drivers/freedreno/freedreno_draw.h index 2a4fe06e300..6c890e7b97e 100644 --- a/src/gallium/drivers/freedreno/freedreno_draw.h +++ b/src/gallium/drivers/freedreno/freedreno_draw.h @@ -33,15 +33,12 @@ #include "pipe/p_context.h" #include "freedreno_context.h" +#include "freedreno_resource.h" #include "freedreno_screen.h" #include "freedreno_util.h" struct fd_ringbuffer; -void fd_draw_emit(struct fd_context *ctx, struct fd_ringbuffer *ring, - enum pc_di_vis_cull_mode vismode, - const struct pipe_draw_info *info); - void fd_draw_init(struct pipe_context *pctx); static inline void @@ -98,4 +95,50 @@ fd_draw(struct fd_context *ctx, struct fd_ringbuffer *ring, fd_reset_wfi(ctx); } + +static inline enum pc_di_index_size +size2indextype(unsigned index_size) +{ + switch (index_size) { + case 1: return INDEX_SIZE_8_BIT; + case 2: return INDEX_SIZE_16_BIT; + case 4: return INDEX_SIZE_32_BIT; + } + DBG("unsupported index size: %d", index_size); + assert(0); + return INDEX_SIZE_IGN; +} + +/* this is same for a2xx/a3xx, so split into helper: */ +static inline void +fd_draw_emit(struct fd_context *ctx, struct fd_ringbuffer *ring, + enum pc_di_vis_cull_mode vismode, + 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 + (info->start * idx->index_size); + 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, ring, ctx->primtypes[info->mode], vismode, src_sel, + info->count, idx_type, idx_size, idx_offset, idx_bo); +} + #endif /* FREEDRENO_DRAW_H_ */ |