diff options
author | Jerome Glisse <jglisse@redhat.com> | 2010-02-16 22:39:49 +0100 |
---|---|---|
committer | Jerome Glisse <jglisse@redhat.com> | 2010-02-16 22:39:49 +0100 |
commit | f2891214515d6f5e2f46d31402c7d21ee13467a7 (patch) | |
tree | a52e9a76085d72df964d414fe8b6c14a4b28d668 | |
parent | 1b2eaa4ba82e772403dc1d82d38286f9ce8cda03 (diff) |
convert vb
-rw-r--r-- | r600_atom.c | 27 | ||||
-rw-r--r-- | r600_atom.h | 6 | ||||
-rw-r--r-- | r600_atom_kernel.h | 2 | ||||
-rw-r--r-- | radeon_atom.c | 10 | ||||
-rw-r--r-- | radeon_atom.h | 3 | ||||
-rw-r--r-- | test.c | 6 |
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) { @@ -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; |