summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/r600/drm/r600_priv.h
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2010-09-28 17:37:56 -0400
committerJerome Glisse <jglisse@redhat.com>2010-09-29 12:44:32 -0400
commit5646964b1360883b6254e2ebacc198f43869d36f (patch)
tree05f02b140afc27d6e6b781ef228af9d143a91590 /src/gallium/winsys/r600/drm/r600_priv.h
parent0cb545a7f2e823c85309013c4c41e9461f297d06 (diff)
r600g: use a hash table instead of group
Instead of creating group of register use a hash table to lookup into which block each register belongs. This simplify code a bit. Signed-off-by: Jerome Glisse <jglisse@redhat.com
Diffstat (limited to 'src/gallium/winsys/r600/drm/r600_priv.h')
-rw-r--r--src/gallium/winsys/r600/drm/r600_priv.h47
1 files changed, 41 insertions, 6 deletions
diff --git a/src/gallium/winsys/r600/drm/r600_priv.h b/src/gallium/winsys/r600/drm/r600_priv.h
index 710c66bcfd..92dadf8d1c 100644
--- a/src/gallium/winsys/r600/drm/r600_priv.h
+++ b/src/gallium/winsys/r600/drm/r600_priv.h
@@ -49,25 +49,30 @@ struct radeon *r600_new(int fd, unsigned device);
void r600_delete(struct radeon *r600);
struct r600_reg {
+ unsigned opcode;
+ unsigned offset_base;
+ unsigned offset;
unsigned need_bo;
unsigned flush_flags;
- unsigned offset;
};
/* radeon_pciid.c */
unsigned radeon_family_from_device(unsigned device);
+#define CTX_RANGE_ID(ctx, offset) (((offset) >> (ctx)->hash_shift) & 255)
+#define CTX_BLOCK_ID(ctx, offset) ((offset) & ((1 << (ctx)->hash_shift) - 1))
+
-static void inline r600_context_reg(struct r600_context *ctx, unsigned group_id,
+static void inline r600_context_reg(struct r600_context *ctx,
unsigned offset, unsigned value,
unsigned mask)
{
- struct r600_group *group = &ctx->groups[group_id];
- struct r600_group_block *block;
+ struct r600_range *range;
+ struct r600_block *block;
unsigned id;
- id = group->offset_block_id[(offset - group->start_offset) >> 2];
- block = &group->blocks[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;
@@ -78,4 +83,34 @@ static void inline r600_context_reg(struct r600_context *ctx, unsigned group_id,
block->status |= R600_BLOCK_STATUS_DIRTY;
}
+struct radeon_bo *radeon_bo_pb_get_bo(struct pb_buffer *_buf);
+void r600_context_bo_reloc(struct r600_context *ctx, u32 *pm4, struct radeon_bo *bo);
+
+struct radeon_ws_bo {
+ struct pipe_reference reference;
+ struct pb_buffer *pb;
+};
+
+static inline void r600_context_block_emit_dirty(struct r600_context *ctx, struct r600_block *block)
+{
+ struct radeon_bo *bo;
+ int id;
+
+ for (int j = 0; j < block->nreg; j++) {
+ if (block->pm4_bo_index[j]) {
+ /* find relocation */
+ id = block->pm4_bo_index[j];
+ bo = radeon_bo_pb_get_bo(block->reloc[id].bo->pb);
+ for (int k = 0; k < block->reloc[id].nreloc; k++) {
+ r600_context_bo_reloc(ctx,
+ &block->pm4[block->reloc[id].bo_pm4_index[k]],
+ 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;
+}
+
#endif