From 6cdfb7ad904a6bdd02f902fea97d5bae58d36890 Mon Sep 17 00:00:00 2001 From: Jerome Glisse Date: Mon, 22 Feb 2010 22:42:41 +0100 Subject: add draw support --- r600_atom.c | 62 +++++++++++++++++++++++++++++------------------------------ r600_batch.c | 3 +++ r600_winsys.h | 5 +++++ r600d.h | 16 +++++++++++++++ test.c | 5 +++++ 5 files changed, 59 insertions(+), 32 deletions(-) diff --git a/r600_atom.c b/r600_atom.c index 12417d1..930490b 100644 --- a/r600_atom.c +++ b/r600_atom.c @@ -17,9 +17,6 @@ #include "r600.h" #include "r600d.h" -/* FIXME delete */ -void r600_tflat(struct r600_atom *atom); - /* * drm_r600_framebuffer */ @@ -159,7 +156,6 @@ int r600_framebuffer_create(struct r600_winsys *rdev, struct r600_atom *atom, vo atom->pkts[atom->npkts++] = 0x0000008E; atom->pkts[atom->npkts++] = cb_target_mask; atom->pkts[atom->npkts++] = cb_shader_mask; - r600_tflat(atom); fprintf(stderr, "%s %d pkts\n", __func__, atom->npkts); return 0; } @@ -540,8 +536,7 @@ int r600_fs_shader_emit(struct r600_winsys *rdev, int r; atom->pkts[4] = radeon_ib_reloc(ib, atom->bo[0], RADEON_GEM_DOMAIN_GTT); - r = radeon_ib_copy(ib, atom->pkts, atom->npkts); - return r; + return radeon_ib_copy(ib, atom->pkts, atom->npkts); } int r600_fs_shader_create(struct r600_winsys *rdev, struct r600_atom *atom, void *data) @@ -592,31 +587,34 @@ fprintf(stderr, "%s %d pkts\n", __func__, atom->npkts); return 0; } -#define WPKT(a) (atom->pkts[atom->npkts++] = (a)) -#define WPKT_RELOC(s)\ - do {\ - WPKT(PKT3(PKT3_NOP, 0));\ - if (!strcmp("bo", s)) {\ - fprintf(stderr, "cb->pkts[%d] = radeon_ib_reloc(ib, cb->"s", cb->placements[0] | cb->placements[1]);\n", atom->npkts);\ - } else {\ - fprintf(stderr, "cb->pkts[%d] = radeon_ib_reloc(ib, cb->"s", RADEON_GEM_DOMAIN_GTT);\n", atom->npkts);\ - }\ - WPKT(0x00000000);\ - } while (0) -void r600_tflat(struct r600_atom *atom) +int r600_draw_cmd_size(struct drm_r600_batch *batch) +{ + switch (G_0287F0_SOURCE_SELECT(batch->vgt_draw_initiator)) { + case 2: + return 10; + default: + return 0; + } +} + +int r600_draw_cmd_emit(struct radeon_ib *ib, struct drm_r600_batch *batch) { - WPKT(PKT3(PKT3_SET_CONTEXT_REG, 2)); - WPKT(0x00000094); - WPKT(0x80000000); - WPKT(0x00FA00FA); - WPKT(PKT3(PKT3_SET_CONFIG_REG, 1)); - WPKT(0x00000256); - WPKT(0x00000005); - WPKT(PKT3(PKT3_INDEX_TYPE, 0)); - WPKT(0x00000000); - WPKT(PKT3(PKT3_NUM_INSTANCES, 0)); - WPKT(0x00000001); - WPKT(PKT3(PKT3_DRAW_INDEX_AUTO, 1)); - WPKT(0x00000004); - WPKT(0x00000002); + u32 pkts[32], i = 0; + + switch (G_0287F0_SOURCE_SELECT(batch->vgt_draw_initiator)) { + case 2: + pkts[i++] = PKT3(PKT3_SET_CONFIG_REG, 1); + pkts[i++] = 0x00000256; + pkts[i++] = batch->vgt_primitive_type; + pkts[i++] = PKT3(PKT3_INDEX_TYPE, 0); + pkts[i++] = batch->vgt_dma_index_type; + pkts[i++] = PKT3(PKT3_NUM_INSTANCES, 0); + pkts[i++] = batch->vgt_dma_num_instances; + pkts[i++] = PKT3(PKT3_DRAW_INDEX_AUTO, 1); + pkts[i++] = batch->vgt_num_indices; + pkts[i++] = batch->vgt_draw_initiator; + return radeon_ib_copy(ib, pkts, i); + default: + return 0; + } } diff --git a/r600_batch.c b/r600_batch.c index 38e8c83..3c4ef58 100644 --- a/r600_batch.c +++ b/r600_batch.c @@ -179,6 +179,7 @@ static int r600_batches_flush_locked(struct r600_winsys *rdev, struct r600_batch if (r) goto out_err; } + r = r600_draw_cmd_emit(batches->ib, &batch->drm); /* flush + wait until */ batches->ib->ptr[batches->ib->cpkts++] = PKT3(PKT3_EVENT_WRITE, 0); batches->ib->ptr[batches->ib->cpkts++] = 0x00000016; @@ -230,6 +231,7 @@ int r600_batches_queue(struct r600_winsys *rdev, struct r600_request *rq) rbatch->atoms[i++] = batch->vs_constants; rbatch->atoms[i++] = batch->ps_constants; rbatch->atoms[i++] = batch->framebuffer; + memcpy(&rbatch->drm, batch, sizeof(struct drm_r600_batch)); reprocess: r600_atom_flush_cleanup(&rbatch->pre_flushes); r600_atom_flush_cleanup(&rbatch->post_flushes); @@ -237,6 +239,7 @@ reprocess: rbatch->npkts = 0; /* flush + wait until = 5dw */ rbatch->npkts += 5; + rbatch->npkts += r600_draw_cmd_size(batch); for (i = 0; i < rbatch->inputs.drm.nbuffers; i++) { if (!r600_batches_fs_resource_is_present(rdev, batches, &rbatch->inputs.drm.buffers[i])) { rbatch->nfs_resources += 1; diff --git a/r600_winsys.h b/r600_winsys.h index 9cbc503..bf162e5 100644 --- a/r600_winsys.h +++ b/r600_winsys.h @@ -226,6 +226,11 @@ struct drm_r600_batch { struct r600_atom *vs_shader; struct r600_atom *fs_shader; struct drm_r600_vs_input inputs; + u32 vgt_primitive_type; + u32 vgt_dma_index_type; + u32 vgt_dma_num_instances; + u32 vgt_num_indices; + u32 vgt_draw_initiator; }; struct r600_request { diff --git a/r600d.h b/r600d.h index 77ad2ec..7436cee 100644 --- a/r600d.h +++ b/r600d.h @@ -722,5 +722,21 @@ #define S_028208_BR_Y(x) (((x) & 0x3FFF) << 16) #define G_028208_BR_Y(x) (((x) >> 16) & 0x3FFF) #define C_028208_BR_Y 0xC000FFFF +#define R_0287F0_VGT_DRAW_INITIATOR 0x0287F0 +#define S_0287F0_SOURCE_SELECT(x) (((x) & 0x3) << 0) +#define G_0287F0_SOURCE_SELECT(x) (((x) >> 0) & 0x3) +#define C_0287F0_SOURCE_SELECT 0xFFFFFFFC +#define S_0287F0_MAJOR_MODE(x) (((x) & 0x3) << 2) +#define G_0287F0_MAJOR_MODE(x) (((x) >> 2) & 0x3) +#define C_0287F0_MAJOR_MODE 0xFFFFFFF3 +#define S_0287F0_SPRITE_EN(x) (((x) & 0x1) << 4) +#define G_0287F0_SPRITE_EN(x) (((x) >> 4) & 0x1) +#define C_0287F0_SPRITE_EN 0xFFFFFFEF +#define S_0287F0_NOT_EOP(x) (((x) & 0x1) << 5) +#define G_0287F0_NOT_EOP(x) (((x) >> 5) & 0x1) +#define C_0287F0_NOT_EOP 0xFFFFFFDF +#define S_0287F0_USE_OPAQUE(x) (((x) & 0x1) << 6) +#define G_0287F0_USE_OPAQUE(x) (((x) >> 6) & 0x1) +#define C_0287F0_USE_OPAQUE 0xFFFFFFBF #endif diff --git a/test.c b/test.c index ac92cd2..825d2f1 100644 --- a/test.c +++ b/test.c @@ -318,6 +318,11 @@ int r600_tri_flat(struct radeon *radeon) batch.inputs.elements[1].sq_vtx_word0 = 0x7C000000; batch.inputs.elements[1].sq_vtx_word1 = 0x18ED1000; batch.inputs.elements[1].sq_vtx_word2 = 0x00080000; + batch.vgt_primitive_type = 5; + batch.vgt_dma_index_type = 0; + batch.vgt_dma_num_instances = 1; + batch.vgt_num_indices = 4; + batch.vgt_draw_initiator = 2; rq.type = 0; rq.data = &batch; rq.bo[0] = vbo1; -- cgit v1.2.3