diff options
author | Jerome Glisse <jglisse@redhat.com> | 2010-02-15 20:31:19 +0100 |
---|---|---|
committer | Jerome Glisse <jglisse@redhat.com> | 2010-02-15 23:03:09 +0100 |
commit | c3bb9a0870d5e886aa547d99f6bd39c498113c8d (patch) | |
tree | 7ce8f07a36dc6dbf57f4f924666b25cc72d573db | |
parent | 70067590ff73a2d7343a4b262323c48fb38663cd (diff) |
remove spi
-rw-r--r-- | r600_atom.c | 198 | ||||
-rw-r--r-- | r600_atom_api.h | 81 | ||||
-rw-r--r-- | r600d.h | 75 | ||||
-rw-r--r-- | r700_atom.c | 13 | ||||
-rw-r--r-- | radeon_atom.h | 4 | ||||
-rw-r--r-- | test.c | 67 |
6 files changed, 159 insertions, 279 deletions
diff --git a/r600_atom.c b/r600_atom.c index 0b353f7..a91ee26 100644 --- a/r600_atom.c +++ b/r600_atom.c @@ -1238,118 +1238,11 @@ out_err: } /* - * r600_spi - */ -struct r600_spi { - struct radeon_atom atom; - u32 pkts[64]; - struct r600_atoms *atoms; -}; - -static void r600_spi_release(struct kref *kref) -{ - struct radeon_atom *atom = container_of(kref, struct radeon_atom, kref); - struct r600_spi *spi = container_of(atom, struct r600_spi, atom); - - mutex_lock(&spi->atoms->mutex); - list_del_init(&spi->atom.list); - mutex_unlock(&spi->atoms->mutex); - kfree(spi); -} - -static int r600_spi_create(struct radeon_device *rdev, - struct r600_atoms *atoms, - struct drm_radeon_atom *patom, - struct radeon_atom **atom) -{ - struct drm_r600_spi pspi; - struct r600_spi *spi; - int r; - - spi = kmalloc(sizeof(*spi), GFP_KERNEL); - if (spi == NULL) - return -ENOMEM; - /* make sure structure properly initialized */ - memset(spi, 0, sizeof(*spi)); - r = radeon_atom_init(&spi->atom, &atoms->idr, &r600_spi_release, - &radeon_atom_emit_default, &r600_atom_process_default, - spi->pkts); - if (r) - goto out_err; - /* KERNEL use get user data */ - memcpy(&pspi, (void*)(unsigned long)patom->data, sizeof(struct drm_r600_spi)); - /* SPI_VS_OUT_ID_0 */ - spi->pkts[spi->atom.npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 10); - spi->pkts[spi->atom.npkts++] = 0x00000185; - spi->pkts[spi->atom.npkts++] = pspi.spi_vs_out_id_0; - spi->pkts[spi->atom.npkts++] = pspi.spi_vs_out_id_1; - spi->pkts[spi->atom.npkts++] = pspi.spi_vs_out_id_2; - spi->pkts[spi->atom.npkts++] = pspi.spi_vs_out_id_3; - spi->pkts[spi->atom.npkts++] = pspi.spi_vs_out_id_4; - spi->pkts[spi->atom.npkts++] = pspi.spi_vs_out_id_5; - spi->pkts[spi->atom.npkts++] = pspi.spi_vs_out_id_6; - spi->pkts[spi->atom.npkts++] = pspi.spi_vs_out_id_7; - spi->pkts[spi->atom.npkts++] = pspi.spi_vs_out_id_8; - spi->pkts[spi->atom.npkts++] = pspi.spi_vs_out_id_9; - /* SPI_PS_INPUT_CNTL_0 */ - spi->pkts[spi->atom.npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 41); - spi->pkts[spi->atom.npkts++] = 0x00000191; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_0; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_1; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_2; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_3; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_4; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_5; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_6; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_7; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_8; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_9; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_10; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_11; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_12; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_13; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_14; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_15; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_16; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_17; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_18; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_19; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_20; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_21; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_22; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_23; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_24; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_25; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_26; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_27; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_28; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_29; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_30; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_input_cntl_31; - spi->pkts[spi->atom.npkts++] = pspi.spi_vs_out_config; - spi->pkts[spi->atom.npkts++] = pspi.spi_thread_grouping; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_in_control_0; - spi->pkts[spi->atom.npkts++] = pspi.spi_ps_in_control_1; - spi->pkts[spi->atom.npkts++] = pspi.spi_interp_control_0; - spi->pkts[spi->atom.npkts++] = pspi.spi_input_z; - spi->pkts[spi->atom.npkts++] = pspi.spi_fog_cntl; - spi->pkts[spi->atom.npkts++] = pspi.spi_fog_func_scale; - spi->pkts[spi->atom.npkts++] = pspi.spi_fog_func_bias; - *atom = &spi->atom; -fprintf(stderr, "%s %d pkts\n", __func__, (*atom)->npkts); - return 0; -out_err: - radeon_atom_put(&spi->atom); - *atom = NULL; - return r; -} - -/* * r600_vs_shader */ struct r600_vs_shader { struct radeon_atom atom; - u32 pkts[64]; + u32 pkts[128]; struct drm_r600_vs_shader vs; struct r600_atoms *atoms; }; @@ -1398,7 +1291,8 @@ static int r600_vs_shader_create(struct radeon_device *rdev, { struct drm_r600_vs_shader pvs_shader; struct r600_vs_shader *vs_shader; - int r, i; + int r, i, j; + u32 tmp; vs_shader = kmalloc(sizeof(*vs_shader), GFP_KERNEL); if (vs_shader == NULL) @@ -1449,11 +1343,34 @@ static int r600_vs_shader_create(struct radeon_device *rdev, /* SQ_PGM_RESOURCES_VS */ vs_shader->pkts[vs_shader->atom.npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1); vs_shader->pkts[vs_shader->atom.npkts++] = 0x0000021A; - vs_shader->pkts[vs_shader->atom.npkts++] = pvs_shader.sq_pgm_resources_vs; + vs_shader->pkts[vs_shader->atom.npkts++] = vs_shader->vs.sq_pgm_resources_vs; /* SQ_PGM_CF_OFFSET_VS */ vs_shader->pkts[vs_shader->atom.npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1); vs_shader->pkts[vs_shader->atom.npkts++] = 0x00000234; vs_shader->pkts[vs_shader->atom.npkts++] = 0; + /* SPI_VS_OUT_CONFIG */ + tmp = S_0286C4_VS_EXPORT_COUNT(vs_shader->vs.noutputs - 1); + if (vs_shader->vs.fog_output_id < 32) { + tmp |= S_0286C4_VS_OUT_FOG_VEC_ADDR(vs_shader->vs.fog_output_id); + tmp |= S_0286C4_VS_EXPORTS_FOG(1); + } + vs_shader->pkts[vs_shader->atom.npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1); + vs_shader->pkts[vs_shader->atom.npkts++] = 0x000001B1; + vs_shader->pkts[vs_shader->atom.npkts++] = tmp; + /* SPI_VS_OUT_ID_* */ + tmp = (vs_shader->vs.noutputs + 3) >> 2; + vs_shader->pkts[vs_shader->atom.npkts++] = PKT3(PKT3_SET_CONTEXT_REG, tmp); + vs_shader->pkts[vs_shader->atom.npkts++] = 0x00000185; + vs_shader->pkts[vs_shader->atom.npkts] = 0; + for (i = 0, j = 0; i < vs_shader->vs.noutputs; i++, j++) { + if (j & 4) { + vs_shader->atom.npkts++; + vs_shader->pkts[vs_shader->atom.npkts] = 0; + } + j &= 3; + vs_shader->pkts[vs_shader->atom.npkts] |= vs_shader->vs.output_semantic[i] << (j * 8); + } + vs_shader->atom.npkts++; *atom = &vs_shader->atom; fprintf(stderr, "%s %d pkts\n", __func__, (*atom)->npkts); return 0; @@ -1467,17 +1384,10 @@ out_err: * r600_ps_shader */ struct r600_ps_shader { - struct radeon_atom atom; - u32 pkts[16]; - u8 input_semantic[32]; - u8 input_gpr[32]; - u8 ninputs; - u8 output_semantic[32]; - u8 output_gpr[32]; - u8 noutputs; - u32 ndwords; - u32 *opcodes; - struct r600_atoms *atoms; + struct radeon_atom atom; + u32 pkts[64]; + struct drm_r600_ps_shader ps; + struct r600_atoms *atoms; }; static void r600_ps_shader_release(struct kref *kref) @@ -1488,7 +1398,7 @@ static void r600_ps_shader_release(struct kref *kref) mutex_lock(&ps_shader->atoms->mutex); list_del_init(&ps_shader->atom.list); mutex_unlock(&ps_shader->atoms->mutex); - kfree(ps_shader->opcodes); + kfree(ps_shader->ps.opcodes); kfree(ps_shader); } @@ -1502,10 +1412,10 @@ static int r600_ps_shader_emit(struct radeon_device *rdev, u32 *opcodes = batch->shaders->ptr; int r; - memcpy(&opcodes[batch->shaders_idx], ps_shader->opcodes, ps_shader->ndwords * 4); + memcpy(&opcodes[batch->shaders_idx], ps_shader->ps.opcodes, ps_shader->ps.ndwords * 4); ps_shader->pkts[2] = batch->shaders_idx >> 6; ps_shader->pkts[4] = radeon_ib_reloc(ib, batch->shaders, RADEON_GEM_DOMAIN_GTT); - batch->shaders_idx += (ps_shader->ndwords + 63) & 0xFFFFFFC0; + batch->shaders_idx += (ps_shader->ps.ndwords + 63) & 0xFFFFFFC0; r = radeon_ib_copy(ib, ps_shader->pkts, atom->npkts); return r; } @@ -1517,6 +1427,7 @@ static int r600_ps_shader_create(struct radeon_device *rdev, { struct drm_r600_ps_shader pps_shader; struct r600_ps_shader *ps_shader; + u32 ninputs; int r, i; ps_shader = kmalloc(sizeof(*ps_shader), GFP_KERNEL); @@ -1536,22 +1447,14 @@ static int r600_ps_shader_create(struct radeon_device *rdev, r = -EINVAL; goto out_err; } - ps_shader->opcodes = kmalloc(4 * pps_shader.ndwords, GFP_KERNEL); - if (ps_shader->opcodes == NULL) { + memcpy(&ps_shader->ps, &pps_shader, sizeof(struct drm_r600_ps_shader)); + ps_shader->ps.opcodes = kmalloc(4 * pps_shader.ndwords, GFP_KERNEL); + if (ps_shader->ps.opcodes == NULL) { dev_err(rdev->dev, "shader too big\n"); r = -ENOMEM; goto out_err; } - memcpy(ps_shader->opcodes, pps_shader.opcodes, 4 * pps_shader.ndwords); - ps_shader->ndwords = pps_shader.ndwords; - ps_shader->ninputs = pps_shader.ninputs; - ps_shader->noutputs = pps_shader.noutputs; - for (i = 0; i < 32; i++) { - ps_shader->input_semantic[i] = pps_shader.input_semantic[i]; - ps_shader->input_gpr[i] = pps_shader.input_gpr[i]; - ps_shader->output_semantic[i] = pps_shader.output_semantic[i]; - ps_shader->output_gpr[i] = pps_shader.output_gpr[i]; - } + memcpy(ps_shader->ps.opcodes, pps_shader.opcodes, 4 * pps_shader.ndwords); ps_shader->atom.npkts = 0; /* SQ_PGM_START_PS */ ps_shader->pkts[ps_shader->atom.npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1); @@ -1568,6 +1471,17 @@ static int r600_ps_shader_create(struct radeon_device *rdev, ps_shader->pkts[ps_shader->atom.npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1); ps_shader->pkts[ps_shader->atom.npkts++] = 0x00000233; ps_shader->pkts[ps_shader->atom.npkts++] = 0; + /* setup pixel shader input */ + ninputs = G_0286CC_NUM_INTERP(ps_shader->ps.spi_ps_in_control_0) + 1; + ps_shader->pkts[ps_shader->atom.npkts++] = PKT3(PKT3_SET_CONTEXT_REG, ninputs); + ps_shader->pkts[ps_shader->atom.npkts++] = 0x00000191; + for (i = 0; i < ninputs; i++) { + ps_shader->pkts[ps_shader->atom.npkts++] = ps_shader->ps.spi_ps_input_cntl[i]; + } + ps_shader->pkts[ps_shader->atom.npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 2); + ps_shader->pkts[ps_shader->atom.npkts++] = 0x000001B3; + ps_shader->pkts[ps_shader->atom.npkts++] = ps_shader->ps.spi_ps_in_control_0; + ps_shader->pkts[ps_shader->atom.npkts++] = ps_shader->ps.spi_ps_in_control_1; *atom = &ps_shader->atom; fprintf(stderr, "%s %d pkts\n", __func__, (*atom)->npkts); return 0; @@ -1661,13 +1575,6 @@ int r600_atom_create(struct radeon_device *rdev, atom->type = patom->type; list_add_tail(&atom->list, &atoms->vgt_atoms); break; - case R600_ATOM_SPI: - r = r600_spi_create(rdev, atoms, patom, &atom); - if (r) - return r; - atom->type = patom->type; - list_add_tail(&atom->list, &atoms->spi_atoms); - break; case R600_ATOM_VS_SHADER: r = r600_vs_shader_create(rdev, atoms, patom, &atom); if (r) @@ -1841,8 +1748,7 @@ int r600_batches_queue(struct radeon_device *rdev, batch->pa == NULL || batch->vport == NULL || batch->tp == NULL || batch->cb == NULL || batch->db_cntl == NULL || batch->vgt == NULL || - batch->spi == NULL || batch->vs_shader == NULL || - batch->ps_shader == NULL) { + batch->vs_shader == NULL || batch->ps_shader == NULL) { mutex_unlock(&atoms->mutex); kfree(rbatch); dev_err(rdev->dev, "invalid batch\n"); @@ -1880,7 +1786,6 @@ int r600_batches_queue(struct radeon_device *rdev, if (batch->db) kref_get(&batch->db->kref); rbatch->atoms[i++] = batch->vgt; kref_get(&batch->vgt->kref); - rbatch->atoms[i++] = batch->spi; kref_get(&batch->spi->kref); rbatch->atoms[i++] = batch->cb; kref_get(&batch->cb->kref); db_cntl = container_of(batch->db_cntl, struct r600_db_cntl, atom); if (db_cntl->need_z || db_cntl->need_h || db_cntl->need_s) { @@ -2020,7 +1925,6 @@ int r600_atoms_init(struct radeon_device *rdev, struct r600_atoms *atoms) INIT_LIST_HEAD(&atoms->db_atoms); INIT_LIST_HEAD(&atoms->db_cntl_atoms); INIT_LIST_HEAD(&atoms->pa_atoms); - INIT_LIST_HEAD(&atoms->spi_atoms); INIT_LIST_HEAD(&atoms->sq_atoms); INIT_LIST_HEAD(&atoms->tp_atoms); INIT_LIST_HEAD(&atoms->vgt_atoms); diff --git a/r600_atom_api.h b/r600_atom_api.h index 5ba1cee..86737e1 100644 --- a/r600_atom_api.h +++ b/r600_atom_api.h @@ -37,9 +37,8 @@ struct drm_radeon_atom { #define R600_ATOM_DB 8 #define R600_ATOM_DB_CNTL 9 #define R600_ATOM_VGT 10 -#define R600_ATOM_SPI 11 -#define R600_ATOM_VS_SHADER 12 -#define R600_ATOM_PS_SHADER 13 +#define R600_ATOM_VS_SHADER 11 +#define R600_ATOM_PS_SHADER 12 struct drm_r600_cb { u32 pitch; @@ -209,87 +208,28 @@ struct drm_r600_vgt { u32 vgt_vtx_vect_eject_reg; }; -/* spi */ -struct drm_r600_spi { - u32 spi_fog_cntl; - u32 spi_fog_func_bias; - u32 spi_fog_func_scale; - u32 spi_input_z; - u32 spi_interp_control_0; - u32 spi_ps_input_cntl_0; - u32 spi_ps_input_cntl_1; - u32 spi_ps_input_cntl_2; - u32 spi_ps_input_cntl_3; - u32 spi_ps_input_cntl_4; - u32 spi_ps_input_cntl_5; - u32 spi_ps_input_cntl_6; - u32 spi_ps_input_cntl_7; - u32 spi_ps_input_cntl_8; - u32 spi_ps_input_cntl_9; - u32 spi_ps_input_cntl_10; - u32 spi_ps_input_cntl_11; - u32 spi_ps_input_cntl_12; - u32 spi_ps_input_cntl_13; - u32 spi_ps_input_cntl_14; - u32 spi_ps_input_cntl_15; - u32 spi_ps_input_cntl_16; - u32 spi_ps_input_cntl_17; - u32 spi_ps_input_cntl_18; - u32 spi_ps_input_cntl_19; - u32 spi_ps_input_cntl_20; - u32 spi_ps_input_cntl_21; - u32 spi_ps_input_cntl_22; - u32 spi_ps_input_cntl_23; - u32 spi_ps_input_cntl_24; - u32 spi_ps_input_cntl_25; - u32 spi_ps_input_cntl_26; - u32 spi_ps_input_cntl_27; - u32 spi_ps_input_cntl_28; - u32 spi_ps_input_cntl_29; - u32 spi_ps_input_cntl_30; - u32 spi_ps_input_cntl_31; - u32 spi_vs_out_config; - u32 spi_thread_grouping; - u32 spi_ps_in_control_0; - u32 spi_ps_in_control_1; - u32 spi_vs_out_id_0; - u32 spi_vs_out_id_1; - u32 spi_vs_out_id_2; - u32 spi_vs_out_id_3; - u32 spi_vs_out_id_4; - u32 spi_vs_out_id_5; - u32 spi_vs_out_id_6; - u32 spi_vs_out_id_7; - u32 spi_vs_out_id_8; - u32 spi_vs_out_id_9; -}; - /* vs_shader - vertex shader */ struct drm_r600_vs_shader { + u32 sq_pgm_resources_vs; u8 input_semantic[32]; - u8 input_resource_id[32]; u8 input_gpr[32]; u8 ninputs; u8 output_semantic[32]; - u8 output_gpr[32]; + u8 fog_output_id; u8 noutputs; - u32 *opcodes; u32 ndwords; - u32 sq_pgm_resources_vs; + u32 *opcodes; }; /* ps_shader - pixel shader */ struct drm_r600_ps_shader { - u8 input_semantic[32]; - u8 input_gpr[32]; - u8 ninputs; - u8 output_semantic[32]; - u8 output_gpr[32]; - u8 noutputs; - u32 *opcodes; - u32 ndwords; + u32 spi_ps_in_control_0; + u32 spi_ps_in_control_1; + u32 spi_ps_input_cntl[32]; u32 sq_pgm_resources_ps; u32 sq_pgm_exports_ps; + u32 ndwords; + u32 *opcodes; }; struct drm_r600_vs_buffer { @@ -327,7 +267,6 @@ struct drm_r600_batch { struct radeon_atom *db; struct radeon_atom *db_cntl; struct radeon_atom *vgt; - struct radeon_atom *spi; struct radeon_atom *vs_shader; struct radeon_atom *ps_shader; struct drm_r600_vs_input inputs; @@ -599,5 +599,80 @@ #define S_008040_CMDFIFO_ENTRIES(x) (((x) & 0x1F) << 20) #define G_008040_CMDFIFO_ENTRIES(x) (((x) >> 20) & 0x1F) #define C_008040_CMDFIFO_ENTRIES 0xFE0FFFFF +#define R_0286CC_SPI_PS_IN_CONTROL_0 0x0286CC +#define S_0286CC_NUM_INTERP(x) (((x) & 0x3F) << 0) +#define G_0286CC_NUM_INTERP(x) (((x) >> 0) & 0x3F) +#define C_0286CC_NUM_INTERP 0xFFFFFFC0 +#define S_0286CC_POSITION_ENA(x) (((x) & 0x1) << 8) +#define G_0286CC_POSITION_ENA(x) (((x) >> 8) & 0x1) +#define C_0286CC_POSITION_ENA 0xFFFFFEFF +#define S_0286CC_POSITION_CENTROID(x) (((x) & 0x1) << 9) +#define G_0286CC_POSITION_CENTROID(x) (((x) >> 9) & 0x1) +#define C_0286CC_POSITION_CENTROID 0xFFFFFDFF +#define S_0286CC_POSITION_ADDR(x) (((x) & 0x1F) << 10) +#define G_0286CC_POSITION_ADDR(x) (((x) >> 10) & 0x1F) +#define C_0286CC_POSITION_ADDR 0xFFFF83FF +#define S_0286CC_PARAM_GEN(x) (((x) & 0xF) << 15) +#define G_0286CC_PARAM_GEN(x) (((x) >> 15) & 0xF) +#define C_0286CC_PARAM_GEN 0xFFF87FFF +#define S_0286CC_PARAM_GEN_ADDR(x) (((x) & 0x7F) << 19) +#define G_0286CC_PARAM_GEN_ADDR(x) (((x) >> 19) & 0x7F) +#define C_0286CC_PARAM_GEN_ADDR 0xFC07FFFF +#define S_0286CC_BARYC_SAMPLE_CNTL(x) (((x) & 0x3) << 26) +#define G_0286CC_BARYC_SAMPLE_CNTL(x) (((x) >> 26) & 0x3) +#define C_0286CC_BARYC_SAMPLE_CNTL 0xF3FFFFFF +#define S_0286CC_PERSP_GRADIENT_ENA(x) (((x) & 0x1) << 28) +#define G_0286CC_PERSP_GRADIENT_ENA(x) (((x) >> 28) & 0x1) +#define C_0286CC_PERSP_GRADIENT_ENA 0xEFFFFFFF +#define S_0286CC_LINEAR_GRADIENT_ENA(x) (((x) & 0x1) << 29) +#define G_0286CC_LINEAR_GRADIENT_ENA(x) (((x) >> 29) & 0x1) +#define C_0286CC_LINEAR_GRADIENT_ENA 0xDFFFFFFF +#define S_0286CC_POSITION_SAMPLE(x) (((x) & 0x1) << 30) +#define G_0286CC_POSITION_SAMPLE(x) (((x) >> 30) & 0x1) +#define C_0286CC_POSITION_SAMPLE 0xBFFFFFFF +#define S_0286CC_BARYC_AT_SAMPLE_ENA(x) (((x) & 0x1) << 31) +#define G_0286CC_BARYC_AT_SAMPLE_ENA(x) (((x) >> 31) & 0x1) +#define C_0286CC_BARYC_AT_SAMPLE_ENA 0x7FFFFFFF +#define R_0286D0_SPI_PS_IN_CONTROL_1 0x0286D0 +#define S_0286D0_GEN_INDEX_PIX(x) (((x) & 0x1) << 0) +#define G_0286D0_GEN_INDEX_PIX(x) (((x) >> 0) & 0x1) +#define C_0286D0_GEN_INDEX_PIX 0xFFFFFFFE +#define S_0286D0_GEN_INDEX_PIX_ADDR(x) (((x) & 0x7F) << 1) +#define G_0286D0_GEN_INDEX_PIX_ADDR(x) (((x) >> 1) & 0x7F) +#define C_0286D0_GEN_INDEX_PIX_ADDR 0xFFFFFF01 +#define S_0286D0_FRONT_FACE_ENA(x) (((x) & 0x1) << 8) +#define G_0286D0_FRONT_FACE_ENA(x) (((x) >> 8) & 0x1) +#define C_0286D0_FRONT_FACE_ENA 0xFFFFFEFF +#define S_0286D0_FRONT_FACE_CHAN(x) (((x) & 0x3) << 9) +#define G_0286D0_FRONT_FACE_CHAN(x) (((x) >> 9) & 0x3) +#define C_0286D0_FRONT_FACE_CHAN 0xFFFFF9FF +#define S_0286D0_FRONT_FACE_ALL_BITS(x) (((x) & 0x1) << 11) +#define G_0286D0_FRONT_FACE_ALL_BITS(x) (((x) >> 11) & 0x1) +#define C_0286D0_FRONT_FACE_ALL_BITS 0xFFFFF7FF +#define S_0286D0_FRONT_FACE_ADDR(x) (((x) & 0x1F) << 12) +#define G_0286D0_FRONT_FACE_ADDR(x) (((x) >> 12) & 0x1F) +#define C_0286D0_FRONT_FACE_ADDR 0xFFFE0FFF +#define S_0286D0_FOG_ADDR(x) (((x) & 0x7F) << 17) +#define G_0286D0_FOG_ADDR(x) (((x) >> 17) & 0x7F) +#define C_0286D0_FOG_ADDR 0xFF01FFFF +#define S_0286D0_FIXED_PT_POSITION_ENA(x) (((x) & 0x1) << 24) +#define G_0286D0_FIXED_PT_POSITION_ENA(x) (((x) >> 24) & 0x1) +#define C_0286D0_FIXED_PT_POSITION_ENA 0xFEFFFFFF +#define S_0286D0_FIXED_PT_POSITION_ADDR(x) (((x) & 0x1F) << 25) +#define G_0286D0_FIXED_PT_POSITION_ADDR(x) (((x) >> 25) & 0x1F) +#define C_0286D0_FIXED_PT_POSITION_ADDR 0xC1FFFFFF +#define R_0286C4_SPI_VS_OUT_CONFIG 0x0286C4 +#define S_0286C4_VS_PER_COMPONENT(x) (((x) & 0x1) << 0) +#define G_0286C4_VS_PER_COMPONENT(x) (((x) >> 0) & 0x1) +#define C_0286C4_VS_PER_COMPONENT 0xFFFFFFFE +#define S_0286C4_VS_EXPORT_COUNT(x) (((x) & 0x1F) << 1) +#define G_0286C4_VS_EXPORT_COUNT(x) (((x) >> 1) & 0x1F) +#define C_0286C4_VS_EXPORT_COUNT 0xFFFFFFC1 +#define S_0286C4_VS_EXPORTS_FOG(x) (((x) & 0x1) << 8) +#define G_0286C4_VS_EXPORTS_FOG(x) (((x) >> 8) & 0x1) +#define C_0286C4_VS_EXPORTS_FOG 0xFFFFFEFF +#define S_0286C4_VS_OUT_FOG_VEC_ADDR(x) (((x) & 0x1F) << 9) +#define G_0286C4_VS_OUT_FOG_VEC_ADDR(x) (((x) >> 9) & 0x1F) +#define C_0286C4_VS_OUT_FOG_VEC_ADDR 0xFFFFC1FF #endif diff --git a/r700_atom.c b/r700_atom.c index 868656e..abfd2a6 100644 --- a/r700_atom.c +++ b/r700_atom.c @@ -88,4 +88,17 @@ void r700_batches_states_default(struct radeon_device *rdev, struct r600_batches ib->ptr[ib->cpkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1); ib->ptr[ib->cpkts++] = 0x0000010E; ib->ptr[ib->cpkts++] = 0x00000000; + /* SPI_THREAD_GROUPING */ + ib->ptr[ib->cpkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1); + ib->ptr[ib->cpkts++] = 0x000001B2; + ib->ptr[ib->cpkts++] = 0x00000001; + /* SPI_INTERP_CONTROL_0 + * SPI_INPUT_Z + * SPI_FOG_CNTL + */ + ib->ptr[ib->cpkts++] = PKT3(PKT3_SET_CONTEXT_REG, 3); + ib->ptr[ib->cpkts++] = 0x000001B5; + ib->ptr[ib->cpkts++] = 0x00000000; + ib->ptr[ib->cpkts++] = 0x00000000; + ib->ptr[ib->cpkts++] = 0x00000000; } diff --git a/radeon_atom.h b/radeon_atom.h index d58e7db..37b045d 100644 --- a/radeon_atom.h +++ b/radeon_atom.h @@ -53,7 +53,7 @@ struct radeon_atom { }; /* R600 */ -#define R600_BATCH_NATOMS 14 +#define R600_BATCH_NATOMS 13 struct r600_batch { struct list_head list; struct list_head pre_flushes; @@ -88,7 +88,6 @@ struct r600_atoms { struct list_head db_atoms; struct list_head db_cntl_atoms; struct list_head pa_atoms; - struct list_head spi_atoms; struct list_head sq_atoms; struct list_head tp_atoms; struct list_head vgt_atoms; @@ -123,6 +122,7 @@ static inline void radeon_atom_put(struct radeon_atom *atom) } /* R600 */ +extern void r600_shader_disassemble(u32 *bytecode, u32 ndwords); extern int r600_shader_build_fs(struct radeon_device *rdev, u32 *bytecode, u32 *ndwords, struct drm_r600_vs_input *inputs, @@ -22,6 +22,7 @@ #include <string.h> #include <errno.h> #include "radeon.h" +#include "radeon_atom.h" #include "r600_winsys.h" int r600_tri_flat(struct radeon *radeon); @@ -101,7 +102,6 @@ int r600_tri_flat(struct radeon *radeon) struct drm_r600_vport vport; struct drm_r600_constants vs_constants; struct drm_r600_vgt vgt; - struct drm_r600_spi spi; struct drm_r600_vs_shader vs_shader; struct drm_r600_ps_shader ps_shader; struct drm_r600_batch batch; @@ -109,6 +109,7 @@ int r600_tri_flat(struct radeon *radeon) struct radeon_bo *vbo1; int r; +// r600_shader_disassemble(vsshaders, 64); vbo1 = radeon_bo_open(radeon->bom, 0, 4096, 0, RADEON_GEM_DOMAIN_GTT, 0); if (vbo1 == NULL) { fprintf(stderr, "Failed to create vbo1 bo\n"); @@ -310,70 +311,14 @@ int r600_tri_flat(struct radeon *radeon) r = radeon_atom_create(rdev, &atom, &batch.vgt); if (r) return r; - /* spi */ - spi.spi_fog_cntl = 0x00000000; - spi.spi_fog_func_bias = 0x00000000; - spi.spi_fog_func_scale = 0x00000000; - spi.spi_input_z = 0x00000000; - spi.spi_interp_control_0 = 0x00000000; - spi.spi_ps_input_cntl_0 = 0x00000800; - spi.spi_ps_input_cntl_1 = 0x00000000; - spi.spi_ps_input_cntl_2 = 0x00000000; - spi.spi_ps_input_cntl_3 = 0x00000000; - spi.spi_ps_input_cntl_4 = 0x00000000; - spi.spi_ps_input_cntl_5 = 0x00000000; - spi.spi_ps_input_cntl_6 = 0x00000000; - spi.spi_ps_input_cntl_7 = 0x00000000; - spi.spi_ps_input_cntl_8 = 0x00000000; - spi.spi_ps_input_cntl_9 = 0x00000000; - spi.spi_ps_input_cntl_10 = 0x00000000; - spi.spi_ps_input_cntl_11 = 0x00000000; - spi.spi_ps_input_cntl_12 = 0x00000000; - spi.spi_ps_input_cntl_13 = 0x00000000; - spi.spi_ps_input_cntl_14 = 0x00000000; - spi.spi_ps_input_cntl_15 = 0x00000000; - spi.spi_ps_input_cntl_16 = 0x00000000; - spi.spi_ps_input_cntl_17 = 0x00000000; - spi.spi_ps_input_cntl_18 = 0x00000000; - spi.spi_ps_input_cntl_19 = 0x00000000; - spi.spi_ps_input_cntl_20 = 0x00000000; - spi.spi_ps_input_cntl_21 = 0x00000000; - spi.spi_ps_input_cntl_22 = 0x00000000; - spi.spi_ps_input_cntl_23 = 0x00000000; - spi.spi_ps_input_cntl_24 = 0x00000000; - spi.spi_ps_input_cntl_25 = 0x00000000; - spi.spi_ps_input_cntl_26 = 0x00000000; - spi.spi_ps_input_cntl_27 = 0x00000000; - spi.spi_ps_input_cntl_28 = 0x00000000; - spi.spi_ps_input_cntl_29 = 0x00000000; - spi.spi_ps_input_cntl_30 = 0x00000000; - spi.spi_ps_input_cntl_31 = 0x00000000; - spi.spi_ps_in_control_0 = 0x10000001; - spi.spi_ps_in_control_1 = 0x00000000; - spi.spi_vs_out_config = 0x00000000; - spi.spi_thread_grouping = 0x00000001; - spi.spi_vs_out_id_0 = 0x03020100; - spi.spi_vs_out_id_1 = 0x07060504; - spi.spi_vs_out_id_2 = 0x0B0A0908; - spi.spi_vs_out_id_3 = 0x0F0E0D0C; - spi.spi_vs_out_id_4 = 0x00000000; - spi.spi_vs_out_id_5 = 0x00000000; - spi.spi_vs_out_id_6 = 0x00000000; - spi.spi_vs_out_id_7 = 0x00000000; - spi.spi_vs_out_id_8 = 0x00000000; - spi.spi_vs_out_id_9 = 0x00000000; - atom.type = R600_ATOM_SPI; - atom.id = 0; - atom.data = (uint64_t)(uintptr_t)&spi; - r = radeon_atom_create(rdev, &atom, &batch.spi); - if (r) - return r; /* vs_shader */ vs_shader.ninputs = 2; vs_shader.input_semantic[0] = 1; vs_shader.input_gpr[0] = 1; vs_shader.input_semantic[1] = 2; vs_shader.input_gpr[1] = 2; + vs_shader.noutputs = 1; + vs_shader.output_semantic[0] = 4; vs_shader.sq_pgm_resources_vs = 0x00000106; vs_shader.ndwords = 64; vs_shader.opcodes = vsshaders; @@ -384,6 +329,10 @@ int r600_tri_flat(struct radeon *radeon) if (r) return r; /* ps_shader */ + ps_shader.spi_ps_input_cntl[0] = 0x00000804; + ps_shader.spi_ps_input_cntl[1] = 0x00000000; + ps_shader.spi_ps_in_control_0 = 0x10000001; + ps_shader.spi_ps_in_control_1 = 0x00000000; ps_shader.sq_pgm_resources_ps = 0x00000003; ps_shader.sq_pgm_exports_ps = 0x00000002; ps_shader.ndwords = 20; |