diff options
author | Jerome Glisse <jglisse@redhat.com> | 2010-02-18 23:24:09 +0100 |
---|---|---|
committer | Jerome Glisse <jglisse@redhat.com> | 2010-02-18 23:31:36 +0100 |
commit | 897890568fbad6f267b5d627077d2b041ed6da32 (patch) | |
tree | d6ec8ce461e447b156ec02163a2e4388affff36c | |
parent | be8877f64e4ff7718a607a57999ae73e6c75f260 (diff) |
cleanup
-rw-r--r-- | r600_atom.c | 32 | ||||
-rw-r--r-- | r600_atom.h | 63 | ||||
-rw-r--r-- | r600_atom_kernel.h | 36 | ||||
-rw-r--r-- | r600_batch.c | 115 | ||||
-rw-r--r-- | r600_winsys.h | 64 | ||||
-rw-r--r-- | r700_atom.c | 2 | ||||
-rw-r--r-- | radeon_atom.c | 19 | ||||
-rw-r--r-- | radeon_device.c | 29 | ||||
-rw-r--r-- | radeon_device.h | 119 | ||||
-rw-r--r-- | test.c | 40 |
10 files changed, 264 insertions, 255 deletions
diff --git a/r600_atom.c b/r600_atom.c index 8008cc3..1254935 100644 --- a/r600_atom.c +++ b/r600_atom.c @@ -14,8 +14,8 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "radeon.h" #include "radeon_device.h" +#include "r600_atom.h" #include "r600d.h" /* @@ -49,9 +49,6 @@ int r600_cb_create(struct radeon_device *rdev, struct radeon_atom *atom, void *d return -ENOMEM; memcpy(cb, data, sizeof(struct drm_r600_cb)); atom->state = cb; - r = radeon_atom_init(atom, &r600_cb_emit); - if (r) - return r; atom->nflushes = 1; /* take a references on the bo */ atom->bo[0] = radeon_bo_lookup(rdev, cb->handle); @@ -230,9 +227,6 @@ int r600_cb_cntl_create(struct radeon_device *rdev, struct radeon_atom *atom, vo return -ENOMEM; memcpy(cb_cntl, data, sizeof(struct drm_r600_cb_cntl)); atom->state = cb_cntl; - r = radeon_atom_init(atom, &radeon_atom_emit_default); - if (r) - return r; /* CB_TARGET_MASK */ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 2); atom->pkts[atom->npkts++] = 0x0000008E; @@ -286,9 +280,6 @@ int r600_pa_create(struct radeon_device *rdev, struct radeon_atom *atom, void *d return -ENOMEM; memcpy(pa, data, sizeof(struct drm_r600_pa)); atom->state = pa; - r = radeon_atom_init(atom, &radeon_atom_emit_default); - if (r) - return r; /* PA_SC_MPASS_PS_CNTL */ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1); atom->pkts[atom->npkts++] = 0x00000292; @@ -376,9 +367,6 @@ int r600_vport_create(struct radeon_device *rdev, struct radeon_atom *atom, void return -ENOMEM; memcpy(vport, data, sizeof(struct drm_r600_vport)); atom->state = vport; - r = radeon_atom_init(atom, &radeon_atom_emit_default); - if (r) - return r; /* PA_SC_VPORT_ZMIN_0 */ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 2); atom->pkts[atom->npkts++] = 0x000000B4; @@ -435,9 +423,6 @@ int r600_blend_create(struct radeon_device *rdev, struct radeon_atom *atom, void return -ENOMEM; memcpy(blend, data, sizeof(struct drm_r600_blend)); atom->state = blend; - r = radeon_atom_init(atom, &radeon_atom_emit_default); - if (r) - return r; /* CB_BLEND0_CONTROL */ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 8); atom->pkts[atom->npkts++] = 0x000001E0; @@ -470,9 +455,6 @@ int r600_constants_create(struct radeon_device *rdev, struct radeon_atom *atom, return -ENOMEM; memcpy(constants, data, sizeof(struct drm_r600_constants)); atom->state = constants; - r = radeon_atom_init(atom, &radeon_atom_emit_default); - if (r) - return r; if ((constants->nconstants & 0x3) || (constants->offset & 0x3)) { dev_err(rdev->dev, "invalid offset or number of constants (0x%08X %d)\n", constants->offset, constants->nconstants); @@ -518,9 +500,6 @@ int r600_db_create(struct radeon_device *rdev, struct radeon_atom *atom, void *d return -ENOMEM; memcpy(db, data, sizeof(struct drm_r600_db)); atom->state = db; - r = radeon_atom_init(atom, &r600_db_emit); - if (r) - return r; atom->bo[0] = radeon_bo_lookup(rdev, db->db_handle); if (atom->bo[0] == NULL) return -EINVAL; @@ -626,9 +605,6 @@ int r600_db_cntl_create(struct radeon_device *rdev, struct radeon_atom *atom, vo return -ENOMEM; memcpy(db_cntl, data, sizeof(struct drm_r600_db_cntl)); atom->state = db_cntl; - r = radeon_atom_init(atom, &radeon_atom_emit_default); - if (r) - return r; /* DB_STENCIL_CLEAR */ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 2); atom->pkts[atom->npkts++] = 0x0000000A; @@ -704,9 +680,6 @@ int r600_vs_shader_create(struct radeon_device *rdev, struct radeon_atom *atom, return -ENOMEM; memcpy(vs_shader, data, sizeof(struct drm_r600_vs_shader)); atom->state = vs_shader; - r = radeon_atom_init(atom, &r600_vs_shader_emit); - if (r) - return r; /* SQ_PGM_START_FS */ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1); atom->pkts[atom->npkts++] = 0x00000225; @@ -797,9 +770,6 @@ int r600_ps_shader_create(struct radeon_device *rdev, struct radeon_atom *atom, return -ENOMEM; memcpy(ps_shader, data, sizeof(struct drm_r600_ps_shader)); atom->state = ps_shader; - r = radeon_atom_init(atom, &r600_ps_shader_emit); - if (r) - return r; /* SQ_PGM_START_PS */ atom->pkts[atom->npkts++] = PKT3(PKT3_SET_CONTEXT_REG, 1); atom->pkts[atom->npkts++] = 0x00000210; diff --git a/r600_atom.h b/r600_atom.h index ab5c61d..fdf7942 100644 --- a/r600_atom.h +++ b/r600_atom.h @@ -35,73 +35,12 @@ struct r600_state_container { struct radeon_bo *bo[32]; }; -struct r600_vs_buffer { - struct drm_r600_vs_buffer drm; - struct radeon_bo *bo; -}; - -struct r600_vs_input { - struct drm_r600_vs_input drm; - struct radeon_bo *bo[32]; - u32 nbo; -}; - -struct drm_r600_batch { - struct radeon_atom *vs_constants; - struct radeon_atom *ps_constants; - struct radeon_atom *blend; - struct radeon_atom *cb; - struct radeon_atom *cb_cntl; - struct radeon_atom *pa; - struct radeon_atom *vport; - struct radeon_atom *db; - struct radeon_atom *db_cntl; - struct radeon_atom *vs_shader; - struct radeon_atom *ps_shader; - struct r600_vs_input inputs; -}; - -/* R600 */ -#define R600_BATCH_NATOMS 11 -struct r600_batch { - struct list_head list; - struct list_head pre_flushes; - struct list_head post_flushes; - struct radeon_atom *atoms[R600_BATCH_NATOMS]; - struct radeon_atom *emit_atoms[R600_BATCH_NATOMS]; - u32 nemit_atoms; - u32 nflushes; - u32 npkts; - struct radeon_bo *shaders; - u32 shaders_idx; - struct r600_vs_input inputs; - u32 nfs_resources; -}; - -struct r600_batches { - struct radeon_ib *ib; - u32 npkts; - struct list_head batches; - u32 nfs_resources; - struct r600_vs_buffer fs_resource[160]; - u32 last_id[R600_BATCH_NATOMS]; -}; /* 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, - struct drm_r600_vs_shader *vs); extern int r600_atoms_init(struct radeon_device *rdev); extern void r600_atoms_release(struct radeon_device *rdev); -extern int r600_atom_create(struct radeon_device *rdev, - struct drm_radeon_atom *patom, - struct radeon_atom **atomptr); -extern int r600_batches_queue(struct radeon_device *rdev, - struct drm_r600_batch *batch); +extern struct radeon_atom *r600_atom_create(struct radeon_device *rdev, struct drm_radeon_atom *patom); extern int r600_batches_flush(struct radeon_device *rdev); -/* R700 */ -extern void r700_batches_states_default(struct radeon_device *rdev, struct r600_batches *batches); #endif diff --git a/r600_atom_kernel.h b/r600_atom_kernel.h index fc1d39d..ba646a1 100644 --- a/r600_atom_kernel.h +++ b/r600_atom_kernel.h @@ -163,19 +163,6 @@ struct drm_r600_db_cntl { u32 db_alpha_to_mask; }; -/* vs_shader - vertex shader */ -struct drm_r600_vs_shader { - u32 sq_pgm_resources_vs; - u8 input_semantic[32]; - u8 input_gpr[32]; - u8 ninputs; - u8 output_semantic[32]; - u8 fog_output_id; - u8 noutputs; - u32 ndwords; - u32 opcodes[512]; -}; - /* ps_shader - pixel shader */ struct drm_r600_ps_shader { u32 spi_ps_in_control_0; @@ -187,27 +174,4 @@ struct drm_r600_ps_shader { u32 opcodes[512]; }; -struct drm_r600_vs_buffer { - u32 handle; - u32 resource_id; - u32 sq_vtx_constant_word0; - u32 sq_vtx_constant_word2; - u32 sq_vtx_constant_word3; -}; - -struct drm_r600_vs_element { - u32 buffer_id; - u32 semantic; - u32 sq_vtx_word0; - u32 sq_vtx_word1; - u32 sq_vtx_word2; -}; - -struct drm_r600_vs_input { - u32 nelements; - u32 nbuffers; - struct drm_r600_vs_element elements[32]; - struct drm_r600_vs_buffer buffers[32]; -}; - #endif diff --git a/r600_batch.c b/r600_batch.c index 9e87d20..b6432d5 100644 --- a/r600_batch.c +++ b/r600_batch.c @@ -14,8 +14,8 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "radeon.h" #include "radeon_device.h" +#include "r600_atom.h" #include "r600d.h" /* state creation functions prototype */ @@ -224,7 +224,7 @@ int r600_batches_queue(struct radeon_device *rdev, struct drm_r600_batch *batch) fprintf(stderr, "invalid batch\n"); return -EINVAL; } - rbatch->shaders = radeon_bo_open(rdev->radeon->bom, 0, 4096 * 16, 0, RADEON_GEM_DOMAIN_GTT, 0); + rbatch->shaders = radeon_bo_open(rdev->bom, 0, 4096 * 16, 0, RADEON_GEM_DOMAIN_GTT, 0); if (rbatch->shaders == NULL) { free(rbatch); fprintf(stderr, "can't create buffer for shaders\n"); @@ -370,76 +370,63 @@ void r600_atoms_release(struct radeon_device *rdev) /* * r600 atom core functions */ -int r600_atom_create(struct radeon_device *rdev, struct drm_radeon_atom *patom, struct radeon_atom **atomptr) +static struct r600_atom_funcs _r600_atom_funcs[] = { + {0, 0, NULL, NULL}, + {R600_ATOM_CB, sizeof(struct drm_r600_cb), + &r600_cb_create, &r600_cb_emit}, + {R600_ATOM_PA, sizeof(struct drm_r600_pa), + &r600_pa_create, &radeon_atom_emit_default}, + {R600_ATOM_CB_CNTL, sizeof(struct drm_r600_cb_cntl), + &r600_cb_cntl_create, &radeon_atom_emit_default}, + {R600_ATOM_VPORT, sizeof(struct drm_r600_vport), + &r600_vport_create, &radeon_atom_emit_default}, + {R600_ATOM_BLEND, sizeof(struct drm_r600_blend), + &r600_blend_create, &radeon_atom_emit_default}, + {R600_ATOM_CONSTANTS, sizeof(struct drm_r600_constants), + &r600_constants_create, &radeon_atom_emit_default}, + {R600_ATOM_DB, sizeof(struct drm_r600_db), + &r600_db_create, &r600_db_emit}, + {R600_ATOM_DB_CNTL, sizeof(struct drm_r600_db_cntl), + &r600_db_cntl_create, &radeon_atom_emit_default}, + {R600_ATOM_VS_SHADER, sizeof(struct drm_r600_vs_shader), + &r600_vs_shader_create, &r600_vs_shader_emit}, + {R600_ATOM_PS_SHADER, sizeof(struct drm_r600_ps_shader), + &r600_ps_shader_create, &r600_ps_shader_emit}, +}; + + +struct radeon_atom *r600_atom_create(struct radeon_device *rdev, struct drm_radeon_atom *patom) { struct radeon_atom *atom; struct r600_state_container *cont; int r; - *atomptr = NULL; + if (!patom->type || patom->type >= R600_BATCH_NATOMS) { + fprintf(stderr, "%s %d invalid atom type %d\n", __func__, __LINE__); + return NULL; + } + if (_r600_atom_funcs[patom->type].type != patom->type) { + fprintf(stderr, "%s %d mismatch for type %d have %d\n", + __func__, __LINE__, _r600_atom_funcs[patom->type].type, patom->type); + return NULL; + } + cont = patom->data; + radeon_device_set_bo_list(rdev, cont->nbo, cont->bo); + /* create the atom */ atom = malloc(sizeof(struct radeon_atom)); if (atom == NULL) - return -ENOMEM; + return NULL; memset(atom, 0, sizeof(struct radeon_atom)); - cont = patom->data; - patom->id = 0; - radeon_device_set_bo_list(rdev, cont->nbo, cont->bo); + INIT_LIST_HEAD(&atom->list); + kref_init(&atom->kref); + atom->emit = _r600_atom_funcs[patom->type].emit; + atom->nflushes = 0; + atom->id = crc_64(cont->data, _r600_atom_funcs[patom->type].size); atom->type = patom->type; - switch (patom->type) { - case R600_ATOM_CB: - r = r600_cb_create(rdev, atom, cont->data); - if (r) - return r; - break; - case R600_ATOM_CB_CNTL: - r = r600_cb_cntl_create(rdev, atom, cont->data); - if (r) - return r; - break; - case R600_ATOM_PA: - r = r600_pa_create(rdev, atom, cont->data); - if (r) - return r; - break; - case R600_ATOM_VPORT: - r = r600_vport_create(rdev, atom, cont->data); - if (r) - return r; - break; - case R600_ATOM_BLEND: - r = r600_blend_create(rdev, atom, cont->data); - if (r) - return r; - break; - case R600_ATOM_CONSTANTS: - r = r600_constants_create(rdev, atom, cont->data); - if (r) - return r; - break; - case R600_ATOM_DB: - r = r600_db_create(rdev, atom, cont->data); - if (r) - return r; - break; - case R600_ATOM_DB_CNTL: - r = r600_db_cntl_create(rdev, atom, cont->data); - if (r) - return r; - break; - case R600_ATOM_VS_SHADER: - r = r600_vs_shader_create(rdev, atom, cont->data); - if (r) - return r; - break; - case R600_ATOM_PS_SHADER: - r = r600_ps_shader_create(rdev, atom, cont->data); - if (r) - return r; - break; - default: - return -EINVAL; + r = _r600_atom_funcs[patom->type].create(rdev, atom, cont->data); + if (r) { + radeon_atom_put(atom); + return NULL; } - patom->id = atom->id; - *atomptr = atom; - return 0; + return atom; } diff --git a/r600_winsys.h b/r600_winsys.h index 42096d1..11242c3 100644 --- a/r600_winsys.h +++ b/r600_winsys.h @@ -23,13 +23,73 @@ struct radeon_device *rdev; struct radeon_atom *atom; + + +struct drm_r600_vs_buffer { + u32 handle; + u32 resource_id; + u32 sq_vtx_constant_word0; + u32 sq_vtx_constant_word2; + u32 sq_vtx_constant_word3; +}; + +struct drm_r600_vs_element { + u32 buffer_id; + u32 semantic; + u32 sq_vtx_word0; + u32 sq_vtx_word1; + u32 sq_vtx_word2; +}; +struct drm_r600_vs_input { + u32 nelements; + u32 nbuffers; + struct drm_r600_vs_element elements[32]; + struct drm_r600_vs_buffer buffers[32]; +}; +struct r600_vs_input { + struct drm_r600_vs_input drm; + struct radeon_bo *bo[32]; + u32 nbo; +}; + +struct r600_vs_buffer { + struct drm_r600_vs_buffer drm; + struct radeon_bo *bo; +}; + +struct drm_r600_batch { + struct radeon_atom *vs_constants; + struct radeon_atom *ps_constants; + struct radeon_atom *blend; + struct radeon_atom *cb; + struct radeon_atom *cb_cntl; + struct radeon_atom *pa; + struct radeon_atom *vport; + struct radeon_atom *db; + struct radeon_atom *db_cntl; + struct radeon_atom *vs_shader; + struct radeon_atom *ps_shader; + struct r600_vs_input inputs; +}; +/* vs_shader - vertex shader */ +struct drm_r600_vs_shader { + u32 sq_pgm_resources_vs; + u8 input_semantic[32]; + u8 input_gpr[32]; + u8 ninputs; + u8 output_semantic[32]; + u8 fog_output_id; + u8 noutputs; + u32 ndwords; + u32 opcodes[512]; +}; + /* atom */ -extern int radeon_atom_create(struct radeon_device*, struct drm_radeon_atom*, struct radeon_atom **atom); extern int radeon_batches_queue(struct radeon_device *rdev, void *batch); extern int radeon_batches_flush(struct radeon_device *rdev); /* core functions */ -extern int radeon_device_init(struct radeon_device **rdev, struct radeon *radeon); +extern int radeon_device_init(struct radeon_device **rdev, struct radeon_bo_manager *bom, int fd); extern void radeon_device_release(struct radeon_device *rdev); #endif diff --git a/r700_atom.c b/r700_atom.c index fe5d4f3..0359bcd 100644 --- a/r700_atom.c +++ b/r700_atom.c @@ -14,8 +14,8 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "radeon.h" #include "radeon_device.h" +#include "r600_atom.h" #include "r600d.h" void r700_batches_states_default(struct radeon_device *rdev, struct r600_batches *batches) diff --git a/radeon_atom.c b/radeon_atom.c index e27116f..e862757 100644 --- a/radeon_atom.c +++ b/radeon_atom.c @@ -15,17 +15,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "radeon_device.h" - -int radeon_atom_init(struct radeon_atom *atom, radeon_atom_emit_t emit) -{ - int r; - - INIT_LIST_HEAD(&atom->list); - kref_init(&atom->kref); - atom->emit = emit; - atom->nflushes = 0; - return 0; -} +#include "r600_atom.h" void radeon_atom_flush_cleanup(struct list_head *flushes) { @@ -62,13 +52,6 @@ int radeon_atom_emit_default(struct radeon_device *rdev, struct radeon_atom *ato return radeon_ib_copy(ib, atom->pkts, atom->npkts); } -int radeon_atom_create(struct radeon_device *rdev, - struct drm_radeon_atom *patom, - struct radeon_atom **atom) -{ - return r600_atom_create(rdev, patom, atom); -} - int radeon_batches_queue(struct radeon_device *rdev, void *batch) { return r600_batches_queue(rdev, batch); diff --git a/radeon_device.c b/radeon_device.c index 22490f3..7027e7a 100644 --- a/radeon_device.c +++ b/radeon_device.c @@ -15,6 +15,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "radeon_device.h" +#include "r600_atom.h" #pragma pack(1) struct ib_reloc_gem { @@ -114,7 +115,7 @@ int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib) return r; } -int radeon_device_init(struct radeon_device **rdev, struct radeon *radeon) +int radeon_device_init(struct radeon_device **rdev, struct radeon_bo_manager *bom, int fd) { struct radeon_device *dev; int r; @@ -124,8 +125,8 @@ int radeon_device_init(struct radeon_device **rdev, struct radeon *radeon) if (dev == NULL) return -ENOMEM; memset(dev, 0, sizeof(struct radeon_device)); - dev->radeon = radeon; - dev->fd = radeon->fd; + dev->fd = fd; + dev->bom = bom; r = r600_atoms_init(dev); if (r) return r; @@ -186,3 +187,25 @@ int kref_put(struct kref *kref, void (*release)(struct kref *kref)) } return 0; } + +u64 crc_64(void *d, size_t len) +{ + u8 *data = (uint8_t*)d; + u64 div = 0x42F0E1EBA9EA3693; + u64 crc = 0xFFFFFFFFFFFFFFFF; + u8 t; + int i, j; + + for (j = 0; j < len; j++) { + t = data[j]; + for (i = 0; i < 8; i++) { + if ((t >> 7) ^ (crc >> 63)) { + crc = (crc << 1) ^ div; + } else { + crc = (crc << 1); + } + t = (t << 1) & 0xFF; + } + } + return crc; +} diff --git a/radeon_device.h b/radeon_device.h index cd623b3..505576a 100644 --- a/radeon_device.h +++ b/radeon_device.h @@ -24,11 +24,12 @@ #include "xf86drm.h" #include "radeon_bo.h" #include "radeon_drm.h" -#include "radeon.h" #include "list.h" -#include "r600_atom.h" -/* UTILITIES END ************************************************************/ +/* UTILITIES ****************************************************************/ +typedef uint8_t u8; +typedef uint32_t u32; +typedef uint64_t u64; #define GFP_KERNEL 0 #define kmalloc(s, gfp) malloc(s) #define kfree(p) free(p) @@ -57,6 +58,7 @@ int kref_put(struct kref *kref, void (*release) (struct kref *kref)); /* UTILITIES END ************************************************************/ struct radeon_device; +struct radeon_atom; struct radeon_ib { u32 *ptr; @@ -73,10 +75,8 @@ struct radeon_atom_flush { struct radeon_bo *bo; }; -typedef int (*radeon_atom_emit_t)(struct radeon_device*, - struct radeon_atom*, - void *data, - struct radeon_ib*); +typedef int (*radeon_atom_create_t)(struct radeon_device*, struct radeon_atom*, void*); +typedef int (*radeon_atom_emit_t)(struct radeon_device*, struct radeon_atom*, void*, struct radeon_ib*); struct radeon_atom { struct list_head list; @@ -93,8 +93,100 @@ struct radeon_atom { radeon_atom_emit_t emit; }; + +struct r600_atom_funcs { + u32 type; + u32 size; + radeon_atom_create_t create; + radeon_atom_emit_t emit; +}; + +/* R600 */ + +struct drm_r600_vs_buffer { + u32 handle; + u32 resource_id; + u32 sq_vtx_constant_word0; + u32 sq_vtx_constant_word2; + u32 sq_vtx_constant_word3; +}; + +struct drm_r600_vs_element { + u32 buffer_id; + u32 semantic; + u32 sq_vtx_word0; + u32 sq_vtx_word1; + u32 sq_vtx_word2; +}; +struct drm_r600_vs_input { + u32 nelements; + u32 nbuffers; + struct drm_r600_vs_element elements[32]; + struct drm_r600_vs_buffer buffers[32]; +}; +struct r600_vs_input { + struct drm_r600_vs_input drm; + struct radeon_bo *bo[32]; + u32 nbo; +}; + +struct r600_vs_buffer { + struct drm_r600_vs_buffer drm; + struct radeon_bo *bo; +}; +struct drm_r600_batch { + struct radeon_atom *vs_constants; + struct radeon_atom *ps_constants; + struct radeon_atom *blend; + struct radeon_atom *cb; + struct radeon_atom *cb_cntl; + struct radeon_atom *pa; + struct radeon_atom *vport; + struct radeon_atom *db; + struct radeon_atom *db_cntl; + struct radeon_atom *vs_shader; + struct radeon_atom *ps_shader; + struct r600_vs_input inputs; +}; +#define R600_BATCH_NATOMS 11 +struct r600_batch { + struct list_head list; + struct list_head pre_flushes; + struct list_head post_flushes; + struct radeon_atom *atoms[R600_BATCH_NATOMS]; + struct radeon_atom *emit_atoms[R600_BATCH_NATOMS]; + u32 nemit_atoms; + u32 nflushes; + u32 npkts; + struct radeon_bo *shaders; + u32 shaders_idx; + struct r600_vs_input inputs; + u32 nfs_resources; +}; + +struct r600_batches { + struct radeon_ib *ib; + u32 npkts; + struct list_head batches; + u32 nfs_resources; + struct r600_vs_buffer fs_resource[160]; + u32 last_id[R600_BATCH_NATOMS]; +}; +/* vs_shader - vertex shader */ +struct drm_r600_vs_shader { + u32 sq_pgm_resources_vs; + u8 input_semantic[32]; + u8 input_gpr[32]; + u8 ninputs; + u8 output_semantic[32]; + u8 fog_output_id; + u8 noutputs; + u32 ndwords; + u32 opcodes[512]; +}; + + struct radeon_device { - struct radeon *radeon; int fd; struct radeon_bo *bo[32]; u32 nbo; @@ -102,13 +194,19 @@ struct radeon_device { unsigned npipes; unsigned nbanks; unsigned group_bytes; + struct radeon_bo_manager *bom; }; +extern int r600_shader_build_fs(struct radeon_device *rdev, + u32 *bytecode, u32 *ndwords, + struct drm_r600_vs_input *inputs, + struct drm_r600_vs_shader *vs); +extern int r600_batches_queue(struct radeon_device *rdev, + struct drm_r600_batch *batch); extern u32 radeon_ib_reloc(struct radeon_ib *ib, struct radeon_bo *bo, u32 d); extern int radeon_ib_get(struct radeon_device *rdev, struct radeon_ib **ib); extern void radeon_ib_free(struct radeon_ib *ib); extern int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib); -extern int radeon_atom_init(struct radeon_atom *atom, radeon_atom_emit_t emit); extern void radeon_atom_flush_cleanup(struct list_head *flushes); extern int radeon_atom_flush_add(struct list_head *flushes, struct radeon_bo *bo, u32 flags); extern int radeon_atom_emit_default(struct radeon_device *rdev, struct radeon_atom *atom, @@ -116,6 +214,9 @@ extern int radeon_atom_emit_default(struct radeon_device *rdev, struct radeon_at extern void radeon_atom_release(struct kref *kref); extern void radeon_device_set_bo_list(struct radeon_device *rdev, u32 nbo, struct radeon_bo **bo); extern struct radeon_bo *radeon_bo_lookup(struct radeon_device *rdev, u32 handle); +extern u64 crc_64(void *d, size_t len); +/* R700 */ +extern void r700_batches_states_default(struct radeon_device *rdev, struct r600_batches *batches); static inline void radeon_atom_put(struct radeon_atom *atom) { @@ -37,7 +37,7 @@ int main(void) radeon_fini(&radeon); return r; } - memset_bo(radeon.mode.bo, 0x0000FF); + memset_bo(radeon.mode.bo, 0x000000FF); r600_tri_flat(&radeon); getchar(); radeon_fini(&radeon); @@ -116,7 +116,7 @@ int r600_tri_flat(struct radeon *radeon) memset_bo(vbo1, 0); memcpy_bo(vbo1, (u32*)rvbo1, 32); - r = radeon_device_init(&rdev, radeon); + r = radeon_device_init(&rdev, radeon->bom, radeon->fd); if (r) return r; /* build cb */ @@ -133,9 +133,7 @@ int r600_tri_flat(struct radeon *radeon) cont.nbo = 1; cont.data = &cb; atom.data = &cont; - r = radeon_atom_create(rdev, &atom, &batch.cb); - if (r) - return r; + batch.cb = r600_atom_create(rdev, &atom); /* build pa */ pa.pa_sc_mpass_ps_cntl = 0x00000000; pa.pa_sc_mode_cntl = 0x00514000; @@ -166,9 +164,7 @@ int r600_tri_flat(struct radeon *radeon) atom.id = 0; cont.data = &pa; atom.data = &cont; - r = radeon_atom_create(rdev, &atom, &batch.pa); - if (r) - return r; + batch.pa = r600_atom_create(rdev, &atom); /* cb control */ cb_cntl.cb_target_mask = 0x0000000f; cb_cntl.cb_shader_mask = 0x0000000f; @@ -192,9 +188,7 @@ int r600_tri_flat(struct radeon *radeon) atom.id = 0; cont.data = &cb_cntl; atom.data = &cont; - r = radeon_atom_create(rdev, &atom, &batch.cb_cntl); - if (r) - return r; + batch.cb_cntl = r600_atom_create(rdev, &atom); /* viewport */ vport.pa_sc_vport_zmin_0 = 0x00000000; vport.pa_sc_vport_zmax_0 = 0x3f800000; @@ -224,9 +218,7 @@ int r600_tri_flat(struct radeon *radeon) atom.id = 0; cont.data = &vport; atom.data = &cont; - r = radeon_atom_create(rdev, &atom, &batch.vport); - if (r) - return r; + batch.vport = r600_atom_create(rdev, &atom); /* blend */ blend.cb_blend0_control = 0x00010001; blend.cb_blend1_control = 0x00000000; @@ -241,9 +233,7 @@ int r600_tri_flat(struct radeon *radeon) atom.id = 0; cont.data = &blend; atom.data = &cont; - r = radeon_atom_create(rdev, &atom, &batch.blend); - if (r) - return r; + batch.blend = r600_atom_create(rdev, &atom); /* ps constant */ batch.ps_constants = NULL; /* vs constant */ @@ -255,9 +245,7 @@ int r600_tri_flat(struct radeon *radeon) atom.id = 0; cont.data = &vs_constants; atom.data = &cont; - r = radeon_atom_create(rdev, &atom, &batch.vs_constants); - if (r) - return r; + batch.vs_constants = r600_atom_create(rdev, &atom); /* db */ batch.db = NULL; /* db control */ @@ -276,9 +264,7 @@ int r600_tri_flat(struct radeon *radeon) atom.id = 0; cont.data = &db_cntl; atom.data = &cont; - r = radeon_atom_create(rdev, &atom, &batch.db_cntl); - if (r) - return r; + batch.db_cntl = r600_atom_create(rdev, &atom); /* vs_shader */ vs_shader.ninputs = 2; vs_shader.input_semantic[0] = 1; @@ -294,9 +280,7 @@ int r600_tri_flat(struct radeon *radeon) atom.id = 0; cont.data = &vs_shader; atom.data = &cont; - r = radeon_atom_create(rdev, &atom, &batch.vs_shader); - if (r) - return r; + batch.vs_shader = r600_atom_create(rdev, &atom); /* ps_shader */ ps_shader.spi_ps_input_cntl[0] = 0x00000804; ps_shader.spi_ps_input_cntl[1] = 0x00000000; @@ -310,9 +294,7 @@ int r600_tri_flat(struct radeon *radeon) atom.id = 0; cont.data = &ps_shader; atom.data = &cont; - r = radeon_atom_create(rdev, &atom, &batch.ps_shader); - if (r) - return r; + batch.ps_shader = r600_atom_create(rdev, &atom); /* inputs */ batch.inputs.bo[0] = vbo1; |