summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2010-02-16 22:39:49 +0100
committerJerome Glisse <jglisse@redhat.com>2010-02-16 22:39:49 +0100
commitf2891214515d6f5e2f46d31402c7d21ee13467a7 (patch)
treea52e9a76085d72df964d414fe8b6c14a4b28d668
parent1b2eaa4ba82e772403dc1d82d38286f9ce8cda03 (diff)
convert vb
-rw-r--r--r600_atom.c27
-rw-r--r--r600_atom.h6
-rw-r--r--r600_atom_kernel.h2
-rw-r--r--radeon_atom.c10
-rw-r--r--radeon_atom.h3
-rw-r--r--test.c6
6 files changed, 38 insertions, 16 deletions
diff --git a/r600_atom.c b/r600_atom.c
index 751f40d..daf5db7 100644
--- a/r600_atom.c
+++ b/r600_atom.c
@@ -925,9 +925,8 @@ int r600_atom_create(struct radeon_device *rdev,
memset(atom, 0, sizeof(struct radeon_atom));
cont = patom->data;
patom->id = 0;
+ radeon_device_set_bo_list(rdev, cont->nbo, cont->bo);
atom->type = patom->type;
- memcpy(rdev->bo, cont->bo, sizeof(void*) * cont->nbo);
- rdev->nbo = cont->nbo;
mutex_lock(&atoms->mutex);
switch (patom->type) {
case R600_ATOM_CB:
@@ -1029,15 +1028,18 @@ static int r600_batches_fs_resource_is_present(struct radeon_device *rdev,
return 0;
}
-static void r600_batches_fs_resource_add(struct radeon_device *rdev,
+static int r600_batches_fs_resource_add(struct radeon_device *rdev,
struct r600_batches *batches,
struct drm_r600_vs_buffer *buffer)
{
int i = batches->nfs_resources++;
buffer->resource_id = i;
- memcpy(&batches->fs_resource[i], buffer, sizeof(struct drm_r600_vs_buffer));
- radeon_bo_ref(buffer->bo);
+ memcpy(&batches->fs_resource[i].drm, buffer, sizeof(struct drm_r600_vs_buffer));
+ batches->fs_resource[i].bo = radeon_bo_lookup(rdev, buffer->handle);
+ if (batches->fs_resource[i].bo == NULL)
+ return -EINVAL;
+ return 0;
}
static void r600_batches_clear_locked(struct radeon_device *rdev, struct r600_batches *batches)
@@ -1074,12 +1076,12 @@ static int r600_batches_flush_locked(struct radeon_device *rdev, struct r600_bat
for (i = 0; i < batches->nfs_resources; i++) {
r600_emit_resources(rdev, batches->ib, batches->fs_resource[i].bo,
- (batches->fs_resource[i].resource_id + 160) * 7,
- batches->fs_resource[i].sq_vtx_constant_word0,
+ (batches->fs_resource[i].drm.resource_id + 160) * 7,
+ batches->fs_resource[i].drm.sq_vtx_constant_word0,
radeon_bo_size(batches->fs_resource[i].bo) -
- batches->fs_resource[i].sq_vtx_constant_word0,
- batches->fs_resource[i].sq_vtx_constant_word2,
- batches->fs_resource[i].sq_vtx_constant_word3,
+ batches->fs_resource[i].drm.sq_vtx_constant_word0,
+ batches->fs_resource[i].drm.sq_vtx_constant_word2,
+ batches->fs_resource[i].drm.sq_vtx_constant_word3,
0, 0, 0xC0000000);
}
list_for_each_entry(batch, &batches->batches, list) {
@@ -1217,9 +1219,12 @@ reprocess:
batches->last_id[i] = rbatch->atoms[i]->id;
}
}
+ radeon_device_set_bo_list(rdev, rbatch->inputs.nbo, rbatch->inputs.bo);
for (i = 0; i < rbatch->inputs.drm.nbuffers; i++) {
if (rbatch->inputs.drm.buffers[i].resource_id == -1) {
- r600_batches_fs_resource_add(rdev, batches, &rbatch->inputs.drm.buffers[i]);
+ r = r600_batches_fs_resource_add(rdev, batches, &rbatch->inputs.drm.buffers[i]);
+ if (r)
+ goto out_err;
}
}
batches->npkts += rbatch->npkts;
diff --git a/r600_atom.h b/r600_atom.h
index 5fafaf5..2c4da8b 100644
--- a/r600_atom.h
+++ b/r600_atom.h
@@ -35,9 +35,15 @@ 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 {
diff --git a/r600_atom_kernel.h b/r600_atom_kernel.h
index 9b3f729..fc1d39d 100644
--- a/r600_atom_kernel.h
+++ b/r600_atom_kernel.h
@@ -188,7 +188,7 @@ struct drm_r600_ps_shader {
};
struct drm_r600_vs_buffer {
- struct radeon_bo *bo;
+ u32 handle;
u32 resource_id;
u32 sq_vtx_constant_word0;
u32 sq_vtx_constant_word2;
diff --git a/radeon_atom.c b/radeon_atom.c
index b46002e..3b9de9a 100644
--- a/radeon_atom.c
+++ b/radeon_atom.c
@@ -118,8 +118,16 @@ struct radeon_bo *radeon_bo_lookup(struct radeon_device *rdev, u32 handle)
int i;
for (i = 0; i < rdev->nbo; i++) {
- if (rdev->bo[i] && rdev->bo[i]->handle == handle)
+ if (rdev->bo[i] && rdev->bo[i]->handle == handle) {
+ radeon_bo_ref(rdev->bo[i]);
return rdev->bo[i];
+ }
}
return NULL;
}
+
+void radeon_device_set_bo_list(struct radeon_device *rdev, u32 nbo, struct radeon_bo **bo)
+{
+ memcpy(rdev->bo, bo, sizeof(void*) * nbo);
+ rdev->nbo = nbo;
+}
diff --git a/radeon_atom.h b/radeon_atom.h
index 0c57287..accbc66 100644
--- a/radeon_atom.h
+++ b/radeon_atom.h
@@ -73,7 +73,7 @@ struct r600_batches {
u32 npkts;
struct list_head batches;
u32 nfs_resources;
- struct drm_r600_vs_buffer fs_resource[160];
+ struct r600_vs_buffer fs_resource[160];
u32 last_id[R600_BATCH_NATOMS];
};
@@ -119,6 +119,7 @@ static void radeon_atom_release(struct kref *kref)
free(atom->state);
free(atom);
}
+void radeon_device_set_bo_list(struct radeon_device *rdev, u32 nbo, struct radeon_bo **bo);
static inline void radeon_atom_put(struct radeon_atom *atom)
{
diff --git a/test.c b/test.c
index 0b5c0a8..9e5db4b 100644
--- a/test.c
+++ b/test.c
@@ -316,13 +316,15 @@ int r600_tri_flat(struct radeon *radeon)
return r;
/* inputs */
+ batch.inputs.bo[0] = vbo1;
+ batch.inputs.nbo = 1;
batch.inputs.drm.nelements = 2;
batch.inputs.drm.nbuffers = 2;
- batch.inputs.drm.buffers[0].bo = vbo1;
+ batch.inputs.drm.buffers[0].handle = vbo1->handle;
batch.inputs.drm.buffers[0].sq_vtx_constant_word0 = 0x00000000;
batch.inputs.drm.buffers[0].sq_vtx_constant_word2 = 0x03001C00;
batch.inputs.drm.buffers[0].sq_vtx_constant_word3 = 0x00000001;
- batch.inputs.drm.buffers[1].bo = vbo1;
+ batch.inputs.drm.buffers[1].handle = vbo1->handle;
batch.inputs.drm.buffers[1].sq_vtx_constant_word0 = 0x0000000C;
batch.inputs.drm.buffers[1].sq_vtx_constant_word2 = 0x02301C00;
batch.inputs.drm.buffers[1].sq_vtx_constant_word3 = 0x00000001;