r600g: emit CS using radeon_winsys

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
diff --git a/src/gallium/drivers/r600/r600.h b/src/gallium/drivers/r600/r600.h
index 0562b6d..84cfa2a 100644
--- a/src/gallium/drivers/r600/r600.h
+++ b/src/gallium/drivers/r600/r600.h
@@ -236,16 +236,16 @@
 	struct list_head	resource_dirty;
 	struct list_head	enable_list;
 	unsigned		pm4_ndwords;
-	unsigned		pm4_cdwords;
 	unsigned		pm4_dirty_cdwords;
 	unsigned		ctx_pm4_ndwords;
 	unsigned		init_dwords;
 
 	unsigned		creloc;
-	unsigned		*reloc;
 	struct radeon_bo	**bo;
 
 	u32			*pm4;
+	unsigned		pm4_cdwords;
+
 	struct list_head	query_list;
 	unsigned		num_query_running;
 	unsigned		backend_mask;
diff --git a/src/gallium/winsys/r600/drm/evergreen_hw_context.c b/src/gallium/winsys/r600/drm/evergreen_hw_context.c
index cd63c8d..29da7be 100644
--- a/src/gallium/winsys/r600/drm/evergreen_hw_context.c
+++ b/src/gallium/winsys/r600/drm/evergreen_hw_context.c
@@ -995,11 +995,7 @@
 		goto out_err;
 	}
 	ctx->pm4_ndwords = RADEON_CTX_MAX_PM4;
-	ctx->pm4 = calloc(ctx->pm4_ndwords, 4);
-	if (ctx->pm4 == NULL) {
-		r = -ENOMEM;
-		goto out_err;
-	}
+	ctx->pm4 = ctx->cs->buf;
 
 	r600_init_cs(ctx);
 	/* save 16dwords space for fence mecanism */
diff --git a/src/gallium/winsys/r600/drm/r600_drm.c b/src/gallium/winsys/r600/drm/r600_drm.c
index f0ef55e..270a07a 100644
--- a/src/gallium/winsys/r600/drm/r600_drm.c
+++ b/src/gallium/winsys/r600/drm/r600_drm.c
@@ -292,6 +292,9 @@
 		radeon_get_backend_map(radeon);
 	}
 
+	/* XXX disable ioctl thread offloading until the porting is done. */
+	setenv("RADEON_THREAD", "0", 0);
+
 	return radeon;
 }
 
diff --git a/src/gallium/winsys/r600/drm/r600_hw_context.c b/src/gallium/winsys/r600/drm/r600_hw_context.c
index 1950e58..59450b5 100644
--- a/src/gallium/winsys/r600/drm/r600_hw_context.c
+++ b/src/gallium/winsys/r600/drm/r600_hw_context.c
@@ -776,7 +776,6 @@
 	free(ctx->range);
 	free(ctx->blocks);
 	free(ctx->bo);
-	free(ctx->pm4);
 	ctx->radeon->ws->cs_destroy(ctx->cs);
 
 	memset(ctx, 0, sizeof(struct r600_context));
@@ -920,11 +919,7 @@
 		goto out_err;
 	}
 	ctx->pm4_ndwords = RADEON_CTX_MAX_PM4;
-	ctx->pm4 = calloc(ctx->pm4_ndwords, 4);
-	if (ctx->pm4 == NULL) {
-		r = -ENOMEM;
-		goto out_err;
-	}
+	ctx->pm4 = ctx->cs->buf;
 
 	r600_init_cs(ctx);
 	/* save 16dwords space for fence mecanism */
@@ -1492,10 +1487,6 @@
 
 void r600_context_flush(struct r600_context *ctx)
 {
-	struct drm_radeon_cs drmib = {};
-	struct drm_radeon_cs_chunk chunks[2];
-	uint64_t chunk_array[2];
-	int r;
 	struct r600_block *enable_block = NULL;
 
 	if (ctx->pm4_cdwords == ctx->init_dwords)
@@ -1513,27 +1504,12 @@
 	ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_EVENT_WRITE, 0, 0);
 	ctx->pm4[ctx->pm4_cdwords++] = EVENT_TYPE(EVENT_TYPE_PS_PARTIAL_FLUSH) | EVENT_INDEX(4);
 
-#if 1
-	/* emit cs */
-	drmib.num_chunks = 2;
-	drmib.chunks = (uint64_t)(uintptr_t)chunk_array;
-	chunks[0].chunk_id = RADEON_CHUNK_ID_IB;
-	chunks[0].length_dw = ctx->pm4_cdwords;
-	chunks[0].chunk_data = (uint64_t)(uintptr_t)ctx->pm4;
-	chunks[1].chunk_id = RADEON_CHUNK_ID_RELOCS;
-	chunks[1].length_dw = ctx->creloc * 4;
-	chunks[1].chunk_data = (uint64_t)(uintptr_t)ctx->reloc;
-	chunk_array[0] = (uint64_t)(uintptr_t)&chunks[0];
-	chunk_array[1] = (uint64_t)(uintptr_t)&chunks[1];
-	r = drmCommandWriteRead(ctx->radeon->info.fd, DRM_RADEON_CS, &drmib,
-				sizeof(struct drm_radeon_cs));
-	if (r) {
-		fprintf(stderr, "radeon: The kernel rejected CS, "
-			"see dmesg for more information.\n");
-	}
-#else
-	*ctx->radeon->cfence = ctx->radeon->fence;
-#endif
+	/* Flush the CS. */
+	ctx->cs->cdw = ctx->pm4_cdwords;
+	ctx->radeon->ws->cs_flush(ctx->cs, 0);
+	/* We need to get the pointer to the other CS,
+	 * the command streams are double-buffered. */
+	ctx->pm4 = ctx->cs->buf;
 
 	/* restart */
 	for (int i = 0; i < ctx->creloc; i++) {
@@ -1544,7 +1520,6 @@
 	ctx->pm4_dirty_cdwords = 0;
 	ctx->pm4_cdwords = 0;
 	ctx->flags = 0;
-	ctx->radeon->ws->cs_flush(ctx->cs, 0);
 
 	r600_init_cs(ctx);
 
diff --git a/src/gallium/winsys/r600/drm/r600_priv.h b/src/gallium/winsys/r600/drm/r600_priv.h
index 5bb515d..83e964b 100644
--- a/src/gallium/winsys/r600/drm/r600_priv.h
+++ b/src/gallium/winsys/r600/drm/r600_priv.h
@@ -134,10 +134,11 @@
 
 	assert(bo != NULL);
 
-	reloc_index = ctx->radeon->ws->trans_add_reloc(
-				ctx->cs, bo->cs_buf,
-				rbo->domains, rbo->domains,
-				(void**)&ctx->reloc, &ctx->creloc);
+	reloc_index =
+		ctx->radeon->ws->trans_add_reloc(ctx->cs, bo->cs_buf, rbo->domains, rbo->domains);
+
+	if (reloc_index >= ctx->creloc)
+		ctx->creloc = reloc_index+1;
 
 	radeon_bo_reference(ctx->radeon, &ctx->bo[reloc_index], bo);
 	return reloc_index * 4;
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
index 9a1e169..09befb3 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
@@ -473,8 +473,7 @@
 static unsigned trans_add_reloc(struct radeon_winsys_cs *rcs,
 				struct radeon_winsys_cs_handle *buf,
 				enum radeon_bo_domain rd,
-                                enum radeon_bo_domain wd,
-				void **reloc_list, unsigned *reloc_count)
+                                enum radeon_bo_domain wd)
 {
 	struct radeon_drm_cs *cs = radeon_drm_cs(rcs);
         struct radeon_bo *bo = (struct radeon_bo*)buf;
@@ -487,8 +486,6 @@
         if (added_domains & RADEON_DOMAIN_VRAM)
             cs->csc->used_vram += bo->size;
 
-	*reloc_list = cs->csc->relocs;
-	*reloc_count = cs->csc->crelocs;
 	return index;
 }
 
diff --git a/src/gallium/winsys/radeon/drm/radeon_winsys.h b/src/gallium/winsys/radeon/drm/radeon_winsys.h
index 8e81fa1..073b6aa 100644
--- a/src/gallium/winsys/radeon/drm/radeon_winsys.h
+++ b/src/gallium/winsys/radeon/drm/radeon_winsys.h
@@ -332,8 +332,7 @@
     unsigned (*trans_add_reloc)(struct radeon_winsys_cs *cs,
 				struct radeon_winsys_cs_handle *buf,
 				enum radeon_bo_domain rd,
-                                enum radeon_bo_domain wd,
-				void **reloc_list, unsigned *reloc_count);
+                                enum radeon_bo_domain wd);
 };
 
 #endif