summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2010-02-22 22:42:41 +0100
committerJerome Glisse <jglisse@redhat.com>2010-02-22 22:42:41 +0100
commit6cdfb7ad904a6bdd02f902fea97d5bae58d36890 (patch)
treedfafdaca9938b257da14006a4a81203280fbf1c5
parente4ad86c56947f8be5acda0555e7e5e45ff56c4c1 (diff)
add draw support
-rw-r--r--r600_atom.c62
-rw-r--r--r600_batch.c3
-rw-r--r--r600_winsys.h5
-rw-r--r--r600d.h16
-rw-r--r--test.c5
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;