radeon_vbo.h revision ad43ddac
1ad43ddacSmrg
2ad43ddacSmrg#ifndef RADEON_VBO_H
3ad43ddacSmrg#define RADEON_VBO_H
4ad43ddacSmrg
5ad43ddacSmrgextern void r600_vb_no_space(ScrnInfoPtr pScrn, int vert_size);
6ad43ddacSmrgextern void radeon_vbo_init_lists(ScrnInfoPtr pScrn);
7ad43ddacSmrgextern void radeon_vbo_free_lists(ScrnInfoPtr pScrn);
8ad43ddacSmrgextern void radeon_vbo_flush_bos(ScrnInfoPtr pScrn);
9ad43ddacSmrgextern void radeon_vbo_get(ScrnInfoPtr pScrn);
10ad43ddacSmrgextern void radeon_vbo_put(ScrnInfoPtr pScrn);
11ad43ddacSmrg
12ad43ddacSmrgstatic inline void radeon_vbo_check(ScrnInfoPtr pScrn, int vert_size)
13ad43ddacSmrg{
14ad43ddacSmrg    RADEONInfoPtr info = RADEONPTR(pScrn);
15ad43ddacSmrg    struct radeon_accel_state *accel_state = info->accel_state;
16ad43ddacSmrg
17ad43ddacSmrg    if ((accel_state->vb_offset + (3 * vert_size)) > accel_state->vb_total) {
18ad43ddacSmrg	r600_vb_no_space(pScrn, vert_size);
19ad43ddacSmrg    }
20ad43ddacSmrg}
21ad43ddacSmrg
22ad43ddacSmrgstatic inline void *
23ad43ddacSmrgradeon_vbo_space(ScrnInfoPtr pScrn, int vert_size)
24ad43ddacSmrg{
25ad43ddacSmrg    RADEONInfoPtr info = RADEONPTR(pScrn);
26ad43ddacSmrg    struct radeon_accel_state *accel_state = info->accel_state;
27ad43ddacSmrg    void *vb;
28ad43ddacSmrg
29ad43ddacSmrg    /* we've ran out of space in the vertex buffer - need to get a
30ad43ddacSmrg       new one */
31ad43ddacSmrg    if ((accel_state->vb_offset + (3 * vert_size)) > accel_state->vb_total) {
32ad43ddacSmrg	r600_vb_no_space(pScrn, vert_size);
33ad43ddacSmrg    }
34ad43ddacSmrg    accel_state->vb_op_vert_size = vert_size;
35ad43ddacSmrg#if defined(XF86DRM_MODE)
36ad43ddacSmrg    if (info->cs) {
37ad43ddacSmrg	int ret;
38ad43ddacSmrg	struct radeon_bo *bo = accel_state->vb_bo;
39ad43ddacSmrg
40ad43ddacSmrg	if (!bo->ptr) {
41ad43ddacSmrg	    ret = radeon_bo_map(bo, 1);
42ad43ddacSmrg	    if (ret) {
43ad43ddacSmrg		FatalError("Failed to map vb %d\n", ret);
44ad43ddacSmrg		return NULL;
45ad43ddacSmrg	    }
46ad43ddacSmrg	}
47ad43ddacSmrg	vb = (pointer)((char *)bo->ptr + accel_state->vb_offset);
48ad43ddacSmrg    } else
49ad43ddacSmrg#endif
50ad43ddacSmrg	vb = (pointer)((char *)accel_state->vb_ptr + accel_state->vb_offset);
51ad43ddacSmrg    return vb;
52ad43ddacSmrg}
53ad43ddacSmrg
54ad43ddacSmrgstatic inline void radeon_vbo_commit(ScrnInfoPtr pScrn)
55ad43ddacSmrg{
56ad43ddacSmrg    RADEONInfoPtr info = RADEONPTR(pScrn);
57ad43ddacSmrg    struct radeon_accel_state *accel_state = info->accel_state;
58ad43ddacSmrg
59ad43ddacSmrg    accel_state->vb_offset += 3 * accel_state->vb_op_vert_size;
60ad43ddacSmrg}
61ad43ddacSmrg
62ad43ddacSmrg#endif
63