summaryrefslogtreecommitdiff
path: root/r600_atom.c
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2010-02-22 21:56:58 +0100
committerJerome Glisse <jglisse@redhat.com>2010-02-22 21:56:58 +0100
commitda16b025f39b316852eb85f63b67363046de8bb5 (patch)
tree2cf40615752cc4c3eaaf2bbda2b9dcde9412885f /r600_atom.c
parentfd7e27e0f952dc63966a3f0c9aa5b46d2fa44151 (diff)
merge cb/db to framebuffer
Diffstat (limited to 'r600_atom.c')
-rw-r--r--r600_atom.c386
1 files changed, 263 insertions, 123 deletions
diff --git a/r600_atom.c b/r600_atom.c
index f5d012f..56d14e1 100644
--- a/r600_atom.c
+++ b/r600_atom.c
@@ -17,6 +17,268 @@
#include "r600.h"
#include "r600d.h"
+/* FIXME delete */
+void r600_tflat(struct r600_atom *atom);
+
+/*
+ * drm_r600_framebuffer
+ */
+int r600_framebuffer_emit(struct r600_winsys *rdev,
+ struct r600_atom *atom,
+ void *data,
+ struct radeon_ib *ib)
+{
+ struct drm_r600_framebuffer *fb = atom->state;
+ int i, j;
+
+ for (i = 0, j = 0; i < (fb->ncb * 26); i += 26, j++) {
+ atom->pkts[i + 4] = radeon_ib_reloc(ib, atom->bo[j], fb->cb[i].placements[0] | fb->cb[i].placements[1]);
+ atom->pkts[i + 18] = radeon_ib_reloc(ib, atom->bo[j], fb->cb[i].placements[0] | fb->cb[i].placements[1]);
+ atom->pkts[i + 23] = radeon_ib_reloc(ib, atom->bo[j], fb->cb[i].placements[0] | fb->cb[i].placements[1]);
+ }
+ if (fb->db_handle) {
+ atom->pkts[i + 5] = radeon_ib_reloc(ib, atom->bo[j], fb->db_placements[0] | fb->db_placements[1]);
+ }
+ return radeon_ib_copy(ib, atom->pkts, atom->npkts);
+}
+
+int r600_framebuffer_create(struct r600_winsys *rdev, struct r600_atom *atom, void *data)
+{
+ struct drm_r600_framebuffer *fb;
+ u32 bpe, tmp;
+ int r, i;
+
+ fb = malloc(sizeof(struct drm_r600_framebuffer));
+ if (fb == NULL)
+ return -ENOMEM;
+ memcpy(fb, data, sizeof(struct drm_r600_framebuffer));
+ atom->state = fb;
+ atom->nflushes = 1;
+ /* take a references on the bo */
+ for (i = 0, atom->nbo = 0; i < fb->ncb; i++, atom->nbo++) {
+ atom->bo[i] = radeon_bo_lookup(rdev, fb->cb[i].handle);
+ atom->flags[i] = 0x02000040;
+ if (atom->bo[i] == NULL) {
+ return -EINVAL;
+ }
+ }
+ if (fb->db_handle) {
+ atom->bo[atom->nbo] = radeon_bo_lookup(rdev, fb->db_handle);
+ atom->flags[atom->nbo] = 0x04004000;
+ if (atom->bo[atom->nbo] == NULL) {
+ return -EINVAL;
+ }
+ atom->nbo++;
+ }
+ for (i = 0; i < fb->ncb; i++) {
+ /* CB_COLOR0_BASE */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
+ atom->pkts[atom->npkts++] = 0x00000010 + i;
+ atom->pkts[atom->npkts++] = 0x00000000;
+ atom->pkts[atom->npkts++] = PKT3(PKT3_NOP, 0);
+ fprintf(stderr, "atom->pkts[%d] = radeon_ib_reloc(ib, cb->bo, cb->placements[0] | cb->placements[1]);\n", atom->npkts);
+ atom->pkts[atom->npkts++] = 0x00000000;
+ /* CB_COLOR0_SIZE */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
+ atom->pkts[atom->npkts++] = 0x00000018 + i;
+ atom->pkts[atom->npkts++] =
+ S_028060_PITCH_TILE_MAX((fb->cb[i].width >> 3) - 1) |
+ S_028060_SLICE_TILE_MAX(((fb->cb[i].width * fb->cb[i].height) >> 6) - 1);
+ /* CB_COLOR0_VIEW */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
+ atom->pkts[atom->npkts++] = 0x00000020 + i;
+ atom->pkts[atom->npkts++] = 0x00000000;
+ /* CB_COLOR0_INFO */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
+ atom->pkts[atom->npkts++] = 0x00000028 + i;
+ atom->pkts[atom->npkts++] = fb->cb[i].color_info;
+ /* CB_COLOR0_TILE */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
+ atom->pkts[atom->npkts++] = 0x00000030 + i;
+ atom->pkts[atom->npkts++] = 0x00000000;
+ atom->pkts[atom->npkts++] = PKT3(PKT3_NOP, 0);
+ fprintf(stderr, "atom->pkts[%d] = radeon_ib_reloc(ib, cb->bo, cb->placements[0] | cb->placements[1]);\n", atom->npkts);
+ atom->pkts[atom->npkts++] = 0x00000000;
+ /* CB_COLOR0_FRAG */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
+ atom->pkts[atom->npkts++] = 0x00000038 + i;
+ atom->pkts[atom->npkts++] = 0x00000000;
+ atom->pkts[atom->npkts++] = PKT3(PKT3_NOP, 0);
+ fprintf(stderr, "atom->pkts[%d] = radeon_ib_reloc(ib, cb->bo, cb->placements[0] | cb->placements[1]);\n", atom->npkts);
+ atom->pkts[atom->npkts++] = 0x00000000;
+ /* CB_COLOR0_MASK */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
+ atom->pkts[atom->npkts++] = 0x00000040 + i;
+ atom->pkts[atom->npkts++] = 0x00000000;
+ }
+ if (fb->db_handle) {
+ /* R_02800C_DB_DEPTH_BASE */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
+ atom->pkts[atom->npkts++] = 0x00000003;
+ atom->pkts[atom->npkts++] = 0x00000000;
+ atom->pkts[atom->npkts++] = PKT3(PKT3_NOP, 0);
+ fprintf(stderr, "atom->pkts[%d] = radeon_ib_reloc(ib, db->db, db->db_placements[0] | db->db_placements[1]);\n", atom->npkts);
+ atom->pkts[atom->npkts++] = 0x00000000;
+ }
+ /* R_028000_DB_DEPTH_SIZE */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 2);
+ atom->pkts[atom->npkts++] = 0x00000000;
+ atom->pkts[atom->npkts++] = fb->db_depth_size;
+ atom->pkts[atom->npkts++] = fb->db_depth_view;
+ /* R_028010_DB_DEPTH_INFO */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
+ atom->pkts[atom->npkts++] = 0x00000004;
+ atom->pkts[atom->npkts++] = fb->db_depth_info;
+ /* R_028D24_DB_HTILE_SURFACE */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
+ atom->pkts[atom->npkts++] = 0x00000349;
+ atom->pkts[atom->npkts++] = fb->db_htile_surface;
+ /* R_028D34_DB_PREFETCH_LIMIT */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
+ atom->pkts[atom->npkts++] = 0x0000034D;
+ atom->pkts[atom->npkts++] = fb->db_prefetch_limit;
+ /* PA_SC_GENERIC_SCISSOR_TL */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 2);
+ atom->pkts[atom->npkts++] = 0x00000090;
+ atom->pkts[atom->npkts++] = 0x80000000;
+ atom->pkts[atom->npkts++] = S_028244_BR_X(fb->width) | S_028244_BR_Y(fb->height);
+ /* PA_SC_SCREEN_SCISSOR_TL */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 2);
+ atom->pkts[atom->npkts++] = 0x0000000C;
+ atom->pkts[atom->npkts++] = 0x80000000;
+ atom->pkts[atom->npkts++] = S_028034_BR_X(fb->width) | S_028034_BR_Y(fb->height);
+ /* PA_SC_WINDOW_OFFSET */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 2);
+ atom->pkts[atom->npkts++] = 0x00000081;
+ atom->pkts[atom->npkts++] = 0x80000000;
+ atom->pkts[atom->npkts++] = S_028208_BR_X(fb->width) | S_028208_BR_Y(fb->height);
+ r600_tflat(atom);
+fprintf(stderr, "%s %d pkts\n", __func__, atom->npkts);
+ return 0;
+}
+
+#if 0
+/*
+ * r600_db
+ */
+int r600_db_emit(struct r600_winsys *rdev,
+ struct r600_atom *atom,
+ void *data,
+ struct radeon_ib *ib)
+{
+ struct drm_r600_db *db = atom->state;
+ int r;
+
+ atom->pkts[4] = radeon_ib_reloc(ib, atom->bo[0], db->db_placements[0] | db->db_placements[1]);
+ if (atom->nbo > 1)
+ atom->pkts[9] = radeon_ib_reloc(ib, atom->bo[1], db->hz_placements[0] | db->hz_placements[1]);
+ r = radeon_ib_copy(ib, atom->pkts, atom->npkts);
+ return r;
+}
+
+int r600_db_create(struct r600_winsys *rdev, struct r600_atom *atom, void *data)
+{
+ struct drm_r600_db *db;
+ u32 nslices, ntiles_per_slice, ntiles, bpe;
+ int has_s;
+ int r;
+
+ db = malloc(sizeof(struct drm_r600_db));
+ if (db == NULL)
+ return -ENOMEM;
+ memcpy(db, data, sizeof(struct drm_r600_db));
+ atom->state = db;
+ atom->bo[0] = radeon_bo_lookup(rdev, db->db_handle);
+ if (atom->bo[0] == NULL)
+ return -EINVAL;
+ atom->flags[0] = 0x04004000;
+ atom->nbo = 1;
+ if (db->hz_handle) {
+ atom->bo[1] = radeon_bo_lookup(rdev, db->hz_handle);
+ if (atom->bo[1] == NULL)
+ return -EINVAL;
+ atom->flags[1] = 0x04004000;
+ atom->nbo = 2;
+ }
+ switch (G_028010_FORMAT(db->db_depth_info)) {
+ case V_028010_DEPTH_16:
+ bpe = 2;
+ has_s = 0;
+ break;
+ case V_028010_DEPTH_X8_24:
+ case V_028010_DEPTH_X8_24_FLOAT:
+ case V_028010_DEPTH_32_FLOAT:
+ bpe = 4;
+ has_s = 0;
+ break;
+ case V_028010_DEPTH_8_24:
+ case V_028010_DEPTH_8_24_FLOAT:
+ bpe = 4;
+ has_s = 1;
+ break;
+ case V_028010_DEPTH_X24_8_32_FLOAT:
+ bpe = 8;
+ has_s = 1;
+ break;
+ case V_028010_DEPTH_INVALID:
+ default:
+ fprintf(stderr, "invalid db format %d\n", G_028010_FORMAT(db->db_depth_info));
+ return -EINVAL;
+ break;
+ }
+ nslices = G_028004_SLICE_MAX(db->db_depth_view) + 1;
+ ntiles_per_slice = G_028000_SLICE_TILE_MAX(db->db_depth_size) + 1;
+ ntiles = nslices * ntiles_per_slice;
+ if ((ntiles * 64 * bpe) > radeon_bo_size(atom->bo[0])) {
+ fprintf(stderr, "db buffer too small %d need %d (%d %d)\n",
+ radeon_bo_size(atom->bo[0]), ntiles * 64 * bpe,
+ nslices, ntiles_per_slice);
+ return -EINVAL;
+ }
+ if (db->hz_handle) {
+ fprintf(stderr, "we don't know how to compute hiz buffer size\n");
+ return -EINVAL;
+ }
+ if (!db->hz_handle && G_028010_TILE_SURFACE_ENABLE(db->db_depth_info)) {
+ fprintf(stderr, "hyperz enabled but no buffer supplied\n");
+ return -EINVAL;
+ }
+ /* R_02800C_DB_DEPTH_BASE */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
+ atom->pkts[atom->npkts++] = 0x00000003;
+ atom->pkts[atom->npkts++] = 0x00000000;
+ atom->pkts[atom->npkts++] = PKT3(PKT3_NOP, 0);
+fprintf(stderr, "atom->pkts[%d] = radeon_ib_reloc(ib, db->db, db->db_placements[0] | db->db_placements[1]);\n", atom->npkts);
+ atom->pkts[atom->npkts++] = 0x00000000;
+ if (db->hz_handle) {
+ /* R_028014_DB_HTILE_DATA_BASE */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
+ atom->pkts[atom->npkts++] = 0x00000005;
+ atom->pkts[atom->npkts++] = 0x00000000;
+ atom->pkts[atom->npkts++] = PKT3(PKT3_NOP, 0);
+ fprintf(stderr, "atom->pkts[%d] = radeon_ib_reloc(ib, db->hz, db->hz_placements[0] | db->hz_placements[1]);\n", atom->npkts);
+ atom->pkts[atom->npkts++] = 0x00000000;
+ }
+ /* R_028000_DB_DEPTH_SIZE */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 2);
+ atom->pkts[atom->npkts++] = 0x00000000;
+ atom->pkts[atom->npkts++] = db->db_depth_size;
+ atom->pkts[atom->npkts++] = db->db_depth_view;
+ /* R_028010_DB_DEPTH_INFO */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
+ atom->pkts[atom->npkts++] = 0x00000004;
+ atom->pkts[atom->npkts++] = db->db_depth_info;
+ /* R_028D24_DB_HTILE_SURFACE */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
+ atom->pkts[atom->npkts++] = 0x00000349;
+ atom->pkts[atom->npkts++] = db->db_htile_surface;
+ /* R_028D34_DB_PREFETCH_LIMIT */
+ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
+ atom->pkts[atom->npkts++] = 0x0000034D;
+ atom->pkts[atom->npkts++] = db->db_prefetch_limit;
+fprintf(stderr, "%s %d pkts\n", __func__, atom->npkts);
+ return 0;
+}
/*
* r600_cb
*/
@@ -35,8 +297,6 @@ int r600_cb_emit(struct r600_winsys *rdev,
return r;
}
-/* FIXME delete */
-void r600_tflat(struct r600_atom *atom);
int r600_cb_create(struct r600_winsys *rdev, struct r600_atom *atom, void *data)
{
struct drm_r600_cb *cb;
@@ -227,6 +487,7 @@ fprintf(stderr, "atom->pkts[%d] = radeon_ib_reloc(ib, cb->bo, cb->placements[0]
fprintf(stderr, "%s %d pkts\n", __func__, atom->npkts);
return 0;
}
+#endif
/*
* r600_cb_cntl
@@ -471,127 +732,6 @@ int r600_constants_create(struct r600_winsys *rdev, struct r600_atom *atom, void
return 0;
}
-/*
- * r600_db
- */
-int r600_db_emit(struct r600_winsys *rdev,
- struct r600_atom *atom,
- void *data,
- struct radeon_ib *ib)
-{
- struct drm_r600_db *db = atom->state;
- int r;
-
- atom->pkts[4] = radeon_ib_reloc(ib, atom->bo[0], db->db_placements[0] | db->db_placements[1]);
- if (atom->nbo > 1)
- atom->pkts[9] = radeon_ib_reloc(ib, atom->bo[1], db->hz_placements[0] | db->hz_placements[1]);
- r = radeon_ib_copy(ib, atom->pkts, atom->npkts);
- return r;
-}
-
-int r600_db_create(struct r600_winsys *rdev, struct r600_atom *atom, void *data)
-{
- struct drm_r600_db *db;
- u32 nslices, ntiles_per_slice, ntiles, bpe;
- int has_s;
- int r;
-
- db = malloc(sizeof(struct drm_r600_db));
- if (db == NULL)
- return -ENOMEM;
- memcpy(db, data, sizeof(struct drm_r600_db));
- atom->state = db;
- atom->bo[0] = radeon_bo_lookup(rdev, db->db_handle);
- if (atom->bo[0] == NULL)
- return -EINVAL;
- atom->flags[0] = 0x04004000;
- atom->nbo = 1;
- if (db->hz_handle) {
- atom->bo[1] = radeon_bo_lookup(rdev, db->hz_handle);
- if (atom->bo[1] == NULL)
- return -EINVAL;
- atom->flags[1] = 0x04004000;
- atom->nbo = 2;
- }
- switch (G_028010_FORMAT(db->db_depth_info)) {
- case V_028010_DEPTH_16:
- bpe = 2;
- has_s = 0;
- break;
- case V_028010_DEPTH_X8_24:
- case V_028010_DEPTH_X8_24_FLOAT:
- case V_028010_DEPTH_32_FLOAT:
- bpe = 4;
- has_s = 0;
- break;
- case V_028010_DEPTH_8_24:
- case V_028010_DEPTH_8_24_FLOAT:
- bpe = 4;
- has_s = 1;
- break;
- case V_028010_DEPTH_X24_8_32_FLOAT:
- bpe = 8;
- has_s = 1;
- break;
- case V_028010_DEPTH_INVALID:
- default:
- fprintf(stderr, "invalid db format %d\n", G_028010_FORMAT(db->db_depth_info));
- return -EINVAL;
- break;
- }
- nslices = G_028004_SLICE_MAX(db->db_depth_view) + 1;
- ntiles_per_slice = G_028000_SLICE_TILE_MAX(db->db_depth_size) + 1;
- ntiles = nslices * ntiles_per_slice;
- if ((ntiles * 64 * bpe) > radeon_bo_size(atom->bo[0])) {
- fprintf(stderr, "db buffer too small %d need %d (%d %d)\n",
- radeon_bo_size(atom->bo[0]), ntiles * 64 * bpe,
- nslices, ntiles_per_slice);
- return -EINVAL;
- }
- if (db->hz_handle) {
- fprintf(stderr, "we don't know how to compute hiz buffer size\n");
- return -EINVAL;
- }
- if (!db->hz_handle && G_028010_TILE_SURFACE_ENABLE(db->db_depth_info)) {
- fprintf(stderr, "hyperz enabled but no buffer supplied\n");
- return -EINVAL;
- }
- /* R_02800C_DB_DEPTH_BASE */
- atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
- atom->pkts[atom->npkts++] = 0x00000003;
- atom->pkts[atom->npkts++] = 0x00000000;
- atom->pkts[atom->npkts++] = PKT3(PKT3_NOP, 0);
-fprintf(stderr, "atom->pkts[%d] = radeon_ib_reloc(ib, db->db, db->db_placements[0] | db->db_placements[1]);\n", atom->npkts);
- atom->pkts[atom->npkts++] = 0x00000000;
- if (db->hz_handle) {
- /* R_028014_DB_HTILE_DATA_BASE */
- atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
- atom->pkts[atom->npkts++] = 0x00000005;
- atom->pkts[atom->npkts++] = 0x00000000;
- atom->pkts[atom->npkts++] = PKT3(PKT3_NOP, 0);
- fprintf(stderr, "atom->pkts[%d] = radeon_ib_reloc(ib, db->hz, db->hz_placements[0] | db->hz_placements[1]);\n", atom->npkts);
- atom->pkts[atom->npkts++] = 0x00000000;
- }
- /* R_028000_DB_DEPTH_SIZE */
- atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 2);
- atom->pkts[atom->npkts++] = 0x00000000;
- atom->pkts[atom->npkts++] = db->db_depth_size;
- atom->pkts[atom->npkts++] = db->db_depth_view;
- /* R_028010_DB_DEPTH_INFO */
- atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
- atom->pkts[atom->npkts++] = 0x00000004;
- atom->pkts[atom->npkts++] = db->db_depth_info;
- /* R_028D24_DB_HTILE_SURFACE */
- atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
- atom->pkts[atom->npkts++] = 0x00000349;
- atom->pkts[atom->npkts++] = db->db_htile_surface;
- /* R_028D34_DB_PREFETCH_LIMIT */
- atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1);
- atom->pkts[atom->npkts++] = 0x0000034D;
- atom->pkts[atom->npkts++] = db->db_prefetch_limit;
-fprintf(stderr, "%s %d pkts\n", __func__, atom->npkts);
- return 0;
-}
/*
* r600_db_cntl