X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fwinsys%2Fr600%2Fdrm%2Fr600_priv.h;h=1f311c4d5e3e0c75a321dfd3aa8a41cd7557fc73;hb=5229ba494b4b3f19085d13131a37626b914d4014;hp=ee48754625aa916d9dcca461b6abc21349996314;hpb=d2c06b5037fe9282cbbc0c7acd84a1b286716507;p=mesa.git diff --git a/src/gallium/winsys/r600/drm/r600_priv.h b/src/gallium/winsys/r600/drm/r600_priv.h index ee48754625a..1f311c4d5e3 100644 --- a/src/gallium/winsys/r600/drm/r600_priv.h +++ b/src/gallium/winsys/r600/drm/r600_priv.h @@ -26,144 +26,110 @@ #ifndef R600_PRIV_H #define R600_PRIV_H -#include -#include -#include -#include -#include -#include "util/u_double_list.h" #include "r600.h" +#include "../../radeon/drm/radeon_winsys.h" +#include "util/u_hash_table.h" +#include "os/os_thread.h" +#include "radeon_drm.h" + +#define PKT_COUNT_C 0xC000FFFF +#define PKT_COUNT_S(x) (((x) & 0x3FFF) << 16) struct radeon { - int fd; - int refcount; - unsigned device; + struct radeon_winsys *ws; + struct radeon_info info; unsigned family; enum chip_class chip_class; - struct pb_manager *kman; /* kernel bo manager */ - struct pb_manager *cman; /* cached bo manager */ + struct r600_tiling_info tiling_info; }; -struct radeon *r600_new(int fd, unsigned device); -void r600_delete(struct radeon *r600); +/* these flags are used in register flags and added into block flags */ +#define REG_FLAG_NEED_BO 1 +#define REG_FLAG_DIRTY_ALWAYS 2 +#define REG_FLAG_RV6XX_SBU 4 +#define REG_FLAG_NOT_R600 8 +#define REG_FLAG_ENABLE_ALWAYS 16 +#define BLOCK_FLAG_RESOURCE 32 +#define REG_FLAG_FLUSH_CHANGE 64 struct r600_reg { - unsigned opcode; - unsigned offset_base; unsigned offset; - unsigned need_bo; + unsigned flags; unsigned flush_flags; + unsigned flush_mask; }; +#define BO_BOUND_TEXTURE 1 struct radeon_bo { struct pipe_reference reference; - unsigned handle; + struct pb_buffer *buf; + struct radeon_winsys_cs_handle *cs_buf; unsigned size; - unsigned alignment; - unsigned map_count; - void *data; - struct list_head fencedlist; - boolean shared; - int64_t last_busy; - boolean set_busy; + + unsigned last_flush; + unsigned binding; }; struct r600_bo { - struct pipe_reference reference; - struct pb_buffer *pb; - unsigned size; + struct pipe_reference reference; /* this must be the first member for the r600_bo_reference inline to work */ + /* DO NOT MOVE THIS ^ */ + unsigned domains; + struct radeon_bo *bo; }; - -/* radeon_pciid.c */ +/* + * radeon_pciid.c + */ unsigned radeon_family_from_device(unsigned device); -/* r600_drm.c */ -struct radeon *radeon_decref(struct radeon *radeon); - -/* radeon_bo.c */ +/* + * radeon_bo.c + */ struct radeon_bo *radeon_bo(struct radeon *radeon, unsigned handle, - unsigned size, unsigned alignment, void *ptr); + unsigned size, unsigned alignment, unsigned bind, unsigned initial_domain); void radeon_bo_reference(struct radeon *radeon, struct radeon_bo **dst, struct radeon_bo *src); -int radeon_bo_wait(struct radeon *radeon, struct radeon_bo *bo); -int radeon_bo_busy(struct radeon *radeon, struct radeon_bo *bo, uint32_t *domain); -void radeon_bo_pbmgr_flush_maps(struct pb_manager *_mgr); -int radeon_bo_fencelist(struct radeon *radeon, struct radeon_bo **bolist, uint32_t num_bo); - -/* radeon_bo_pb.c */ -struct radeon_bo *radeon_bo_pb_get_bo(struct pb_buffer *_buf); -struct pb_manager *radeon_bo_pbmgr_create(struct radeon *radeon); -struct pb_buffer *radeon_bo_pb_create_buffer_from_handle(struct pb_manager *_mgr, - uint32_t handle); - -/* r600_hw_context.c */ -void r600_context_bo_reloc(struct r600_context *ctx, u32 *pm4, struct r600_bo *rbo); +/* + * r600_hw_context.c + */ +void r600_context_bo_flush(struct r600_context *ctx, unsigned flush_flags, + unsigned flush_mask, struct r600_bo *rbo); struct r600_bo *r600_context_reg_bo(struct r600_context *ctx, unsigned offset); -int r600_context_add_block(struct r600_context *ctx, const struct r600_reg *reg, unsigned nreg); - -/* r600_bo.c */ -unsigned r600_bo_get_handle(struct r600_bo *bo); -unsigned r600_bo_get_size(struct r600_bo *bo); -static INLINE struct radeon_bo *r600_bo_get_bo(struct r600_bo *bo) +int r600_context_add_block(struct r600_context *ctx, const struct r600_reg *reg, unsigned nreg, + unsigned opcode, unsigned offset_base); +void r600_context_pipe_state_set_resource(struct r600_context *ctx, struct r600_pipe_resource_state *state, struct r600_block *block); +void r600_context_block_emit_dirty(struct r600_context *ctx, struct r600_block *block); +void r600_context_block_resource_emit_dirty(struct r600_context *ctx, struct r600_block *block); +void r600_context_dirty_block(struct r600_context *ctx, struct r600_block *block, + int dirty, int index); +int r600_setup_block_table(struct r600_context *ctx); +void r600_context_reg(struct r600_context *ctx, + unsigned offset, unsigned value, + unsigned mask); +void r600_init_cs(struct r600_context *ctx); +int r600_resource_init(struct r600_context *ctx, struct r600_range *range, unsigned offset, unsigned nblocks, unsigned stride, struct r600_reg *reg, int nreg, unsigned offset_base); + +static INLINE unsigned r600_context_bo_reloc(struct r600_context *ctx, struct r600_bo *rbo) { - return radeon_bo_pb_get_bo(bo->pb); -} + struct radeon_bo *bo = rbo->bo; + unsigned reloc_index; -#define CTX_RANGE_ID(ctx, offset) (((offset) >> (ctx)->hash_shift) & 255) -#define CTX_BLOCK_ID(ctx, offset) ((offset) & ((1 << (ctx)->hash_shift) - 1)) + assert(bo != NULL); -static void inline r600_context_reg(struct r600_context *ctx, - unsigned offset, unsigned value, - unsigned mask) -{ - struct r600_range *range; - struct r600_block *block; - unsigned id; - - range = &ctx->range[CTX_RANGE_ID(ctx, offset)]; - block = range->blocks[CTX_BLOCK_ID(ctx, offset)]; - id = (offset - block->start_offset) >> 2; - block->reg[id] &= ~mask; - block->reg[id] |= value; - if (!(block->status & R600_BLOCK_STATUS_DIRTY)) { - ctx->pm4_dirty_cdwords += block->pm4_ndwords; - block->status |= R600_BLOCK_STATUS_ENABLED; - block->status |= R600_BLOCK_STATUS_DIRTY; - } -} + reloc_index = ctx->radeon->ws->cs_add_reloc(ctx->cs, bo->cs_buf, + rbo->domains, rbo->domains); -static inline void r600_context_block_emit_dirty(struct r600_context *ctx, struct r600_block *block) -{ - int id; - - for (int j = 0; j < block->nreg; j++) { - if (block->pm4_bo_index[j]) { - /* find relocation */ - id = block->pm4_bo_index[j]; - for (int k = 0; k < block->reloc[id].nreloc; k++) { - r600_context_bo_reloc(ctx, - &block->pm4[block->reloc[id].bo_pm4_index[k]], - block->reloc[id].bo); - } - } - } - memcpy(&ctx->pm4[ctx->pm4_cdwords], block->pm4, block->pm4_ndwords * 4); - ctx->pm4_cdwords += block->pm4_ndwords; - block->status ^= R600_BLOCK_STATUS_DIRTY; -} + if (reloc_index >= ctx->creloc) + ctx->creloc = reloc_index+1; -static inline int radeon_bo_map(struct radeon *radeon, struct radeon_bo *bo) -{ - bo->map_count++; - return 0; + radeon_bo_reference(ctx->radeon, &ctx->bo[reloc_index], bo); + return reloc_index * 4; } -static inline void radeon_bo_unmap(struct radeon *radeon, struct radeon_bo *bo) -{ - bo->map_count--; - assert(bo->map_count >= 0); -} +/* + * r600_bo.c + */ +void r600_bo_destroy(struct radeon *radeon, struct r600_bo *bo); #endif