Merge branch 'mesa_7_5_branch' into mesa_7_6_branch
[mesa.git] / src / gallium / winsys / drm / intel / gem / intel_drm_buffer.c
1
2 #include "intel_drm_winsys.h"
3 #include "util/u_memory.h"
4
5 #include "i915_drm.h"
6
7 static struct intel_buffer *
8 intel_drm_buffer_create(struct intel_winsys *iws,
9 unsigned size, unsigned alignment,
10 enum intel_buffer_type type)
11 {
12 struct intel_drm_buffer *buf = CALLOC_STRUCT(intel_drm_buffer);
13 struct intel_drm_winsys *idws = intel_drm_winsys(iws);
14 drm_intel_bufmgr *pool;
15 char *name;
16
17 if (!buf)
18 return NULL;
19
20 buf->magic = 0xDEAD1337;
21 buf->flinked = FALSE;
22 buf->flink = 0;
23 buf->map_gtt = FALSE;
24
25 if (type == INTEL_NEW_TEXTURE) {
26 name = "gallium3d_texture";
27 pool = idws->pools.gem;
28 } else if (type == INTEL_NEW_VERTEX) {
29 name = "gallium3d_vertex";
30 pool = idws->pools.gem;
31 } else if (type == INTEL_NEW_SCANOUT) {
32 name = "gallium3d_scanout";
33 pool = idws->pools.gem;
34 buf->map_gtt = TRUE;
35 } else {
36 assert(0);
37 name = "gallium3d_unknown";
38 pool = idws->pools.gem;
39 }
40
41 buf->bo = drm_intel_bo_alloc(pool, name, size, alignment);
42
43 if (!buf->bo)
44 goto err;
45
46 return (struct intel_buffer *)buf;
47
48 err:
49 assert(0);
50 FREE(buf);
51 return NULL;
52 }
53
54 static int
55 intel_drm_buffer_set_fence_reg(struct intel_winsys *iws,
56 struct intel_buffer *buffer,
57 unsigned stride,
58 enum intel_buffer_tile tile)
59 {
60 assert(I915_TILING_NONE == INTEL_TILE_NONE);
61 assert(I915_TILING_X == INTEL_TILE_X);
62 assert(I915_TILING_Y == INTEL_TILE_Y);
63
64 return drm_intel_bo_set_tiling(intel_bo(buffer), &tile, stride);
65 }
66
67 static void *
68 intel_drm_buffer_map(struct intel_winsys *iws,
69 struct intel_buffer *buffer,
70 boolean write)
71 {
72 struct intel_drm_buffer *buf = intel_drm_buffer(buffer);
73 drm_intel_bo *bo = intel_bo(buffer);
74 int ret = 0;
75
76 assert(bo);
77
78 if (buf->map_count)
79 goto out;
80
81 if (buf->map_gtt)
82 ret = drm_intel_gem_bo_map_gtt(bo);
83 else
84 ret = drm_intel_bo_map(bo, write);
85
86 buf->ptr = bo->virtual;
87
88 assert(ret == 0);
89 out:
90 if (ret)
91 return NULL;
92
93 buf->map_count++;
94 return buf->ptr;
95 }
96
97 static void
98 intel_drm_buffer_unmap(struct intel_winsys *iws,
99 struct intel_buffer *buffer)
100 {
101 struct intel_drm_buffer *buf = intel_drm_buffer(buffer);
102
103 if (--buf->map_count)
104 return;
105
106 if (buf->map_gtt)
107 drm_intel_gem_bo_unmap_gtt(intel_bo(buffer));
108 else
109 drm_intel_bo_unmap(intel_bo(buffer));
110 }
111
112 static void
113 intel_drm_buffer_destroy(struct intel_winsys *iws,
114 struct intel_buffer *buffer)
115 {
116 drm_intel_bo_unreference(intel_bo(buffer));
117
118 #ifdef DEBUG
119 intel_drm_buffer(buffer)->magic = 0;
120 intel_drm_buffer(buffer)->bo = NULL;
121 #endif
122
123 FREE(buffer);
124 }
125
126 void
127 intel_drm_winsys_init_buffer_functions(struct intel_drm_winsys *idws)
128 {
129 idws->base.buffer_create = intel_drm_buffer_create;
130 idws->base.buffer_set_fence_reg = intel_drm_buffer_set_fence_reg;
131 idws->base.buffer_map = intel_drm_buffer_map;
132 idws->base.buffer_unmap = intel_drm_buffer_unmap;
133 idws->base.buffer_destroy = intel_drm_buffer_destroy;
134 }