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
diff --git a/src/gallium/winsys/r600/drm/r600_priv.h b/src/gallium/winsys/r600/drm/r600_priv.h
index 710c66b..92dadf8 100644
--- a/src/gallium/winsys/r600/drm/r600_priv.h
+++ b/src/gallium/winsys/r600/drm/r600_priv.h
@@ -49,25 +49,30 @@
 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 @@
 	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