r300: respect radeon common code fallbacks
[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 buf->map_gtt = TRUE;
32 } else if (type == INTEL_NEW_SCANOUT) {
33 name = "gallium3d_scanout";
34 pool = idws->pools.gem;
35 buf->map_gtt = TRUE;
36 } else {
37 assert(0);
38 name = "gallium3d_unknown";
39 pool = idws->pools.gem;
40 }
41
42 buf->bo = drm_intel_bo_alloc(pool, name, size, alignment);
43
44 if (!buf->bo)
45 goto err;
46
47 return (struct intel_buffer *)buf;
48
49 err:
50 assert(0);
51 FREE(buf);
52 return NULL;
53 }
54
55 static int
56 intel_drm_buffer_set_fence_reg(struct intel_winsys *iws,
57 struct intel_buffer *buffer,
58 unsigned stride,
59 enum intel_buffer_tile tile)
60 {
61 struct intel_drm_buffer *buf = intel_drm_buffer(buffer);
62 assert(I915_TILING_NONE == INTEL_TILE_NONE);
63 assert(I915_TILING_X == INTEL_TILE_X);
64 assert(I915_TILING_Y == INTEL_TILE_Y);
65
66 if (tile != INTEL_TILE_NONE) {
67 assert(buf->map_count == 0);
68 buf->map_gtt = TRUE;
69 }
70
71 return drm_intel_bo_set_tiling(buf->bo, &tile, stride);
72 }
73
74 static void *
75 intel_drm_buffer_map(struct intel_winsys *iws,
76 struct intel_buffer *buffer,
77 boolean write)
78 {
79 struct intel_drm_buffer *buf = intel_drm_buffer(buffer);
80 drm_intel_bo *bo = intel_bo(buffer);
81 int ret = 0;
82
83 assert(bo);
84
85 if (buf->map_count)
86 goto out;
87
88 if (buf->map_gtt)
89 ret = drm_intel_gem_bo_map_gtt(bo);
90 else
91 ret = drm_intel_bo_map(bo, write);
92
93 buf->ptr = bo->virtual;
94
95 assert(ret == 0);
96 out:
97 if (ret)
98 return NULL;
99
100 buf->map_count++;
101 return buf->ptr;
102 }
103
104 static void
105 intel_drm_buffer_unmap(struct intel_winsys *iws,
106 struct intel_buffer *buffer)
107 {
108 struct intel_drm_buffer *buf = intel_drm_buffer(buffer);
109
110 if (--buf->map_count)
111 return;
112
113 if (buf->map_gtt)
114 drm_intel_gem_bo_unmap_gtt(intel_bo(buffer));
115 else
116 drm_intel_bo_unmap(intel_bo(buffer));
117 }
118
119 static int
120 intel_drm_buffer_write(struct intel_winsys *iws,
121 struct intel_buffer *buffer,
122 size_t offset,
123 size_t size,
124 const void *data)
125 {
126 struct intel_drm_buffer *buf = intel_drm_buffer(buffer);
127
128 return drm_intel_bo_subdata(buf->bo, offset, size, (void*)data);
129 }
130
131 static void
132 intel_drm_buffer_destroy(struct intel_winsys *iws,
133 struct intel_buffer *buffer)
134 {
135 drm_intel_bo_unreference(intel_bo(buffer));
136
137 #ifdef DEBUG
138 intel_drm_buffer(buffer)->magic = 0;
139 intel_drm_buffer(buffer)->bo = NULL;
140 #endif
141
142 FREE(buffer);
143 }
144
145 void
146 intel_drm_winsys_init_buffer_functions(struct intel_drm_winsys *idws)
147 {
148 idws->base.buffer_create = intel_drm_buffer_create;
149 idws->base.buffer_set_fence_reg = intel_drm_buffer_set_fence_reg;
150 idws->base.buffer_map = intel_drm_buffer_map;
151 idws->base.buffer_unmap = intel_drm_buffer_unmap;
152 idws->base.buffer_write = intel_drm_buffer_write;
153 idws->base.buffer_destroy = intel_drm_buffer_destroy;
154 }