summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2010-02-18 23:24:09 +0100
committerJerome Glisse <jglisse@redhat.com>2010-02-18 23:31:36 +0100
commit897890568fbad6f267b5d627077d2b041ed6da32 (patch)
treed6ec8ce461e447b156ec02163a2e4388affff36c
parentbe8877f64e4ff7718a607a57999ae73e6c75f260 (diff)
cleanup
-rw-r--r--r600_atom.c32
-rw-r--r--r600_atom.h63
-rw-r--r--r600_atom_kernel.h36
-rw-r--r--r600_batch.c115
-rw-r--r--r600_winsys.h64
-rw-r--r--r700_atom.c2
-rw-r--r--radeon_atom.c19
-rw-r--r--radeon_device.c29
-rw-r--r--radeon_device.h119
-rw-r--r--test.c40
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)
{
diff --git a/test.c b/test.c
index 17b87af..27d3a8d 100644
--- a/test.c
+++ b/test.c
@@ -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;