diff options
author | Jerome Glisse <jglisse@redhat.com> | 2010-02-22 21:56:58 +0100 |
---|---|---|
committer | Jerome Glisse <jglisse@redhat.com> | 2010-02-22 21:56:58 +0100 |
commit | da16b025f39b316852eb85f63b67363046de8bb5 (patch) | |
tree | 2cf40615752cc4c3eaaf2bbda2b9dcde9412885f /r600_atom.c | |
parent | fd7e27e0f952dc63966a3f0c9aa5b46d2fa44151 (diff) |
merge cb/db to framebuffer
Diffstat (limited to 'r600_atom.c')
-rw-r--r-- | r600_atom.c | 386 |
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 |