diff options
author | Rob Clark <[email protected]> | 2014-10-15 08:12:24 -0400 |
---|---|---|
committer | Rob Clark <[email protected]> | 2014-10-15 15:49:48 -0400 |
commit | 8233b36a172820edf18ea4612f1979dc6089a1d7 (patch) | |
tree | 6d6e7b46ed4356e718bc6a2bf78e6817e25488c9 /src/gallium/drivers/freedreno/freedreno_draw.h | |
parent | 368466b7b72aed74b917aeb3225d7a0a7101678c (diff) |
freedreno: inline fd_draw_emit()
Manual LTO
Signed-off-by: Rob Clark <[email protected]>
Diffstat (limited to 'src/gallium/drivers/freedreno/freedreno_draw.h')
-rw-r--r-- | src/gallium/drivers/freedreno/freedreno_draw.h | 51 |
1 files changed, 47 insertions, 4 deletions
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_ */ |