Rev 4359 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4359 | Rev 4501 | ||
---|---|---|---|
Line 36... | Line 36... | ||
36 | 36 | ||
37 | #ifndef sse2 |
37 | #ifndef sse2 |
38 | #define sse2 |
38 | #define sse2 |
Line -... | Line 39... | ||
- | 39 | #endif |
|
- | 40 | ||
- | 41 | void gen4_vertex_align(struct sna *sna, const struct sna_composite_op *op) |
|
- | 42 | { |
|
- | 43 | int vertex_index; |
|
- | 44 | ||
- | 45 | assert(op->floats_per_rect == 3*op->floats_per_vertex); |
|
- | 46 | ||
- | 47 | vertex_index = (sna->render.vertex_used + op->floats_per_vertex - 1) / op->floats_per_vertex; |
|
- | 48 | if ((int)sna->render.vertex_size - vertex_index * op->floats_per_vertex < 2*op->floats_per_rect) { |
|
- | 49 | DBG(("%s: flushing vertex buffer: new index=%d, max=%d\n", |
|
- | 50 | __FUNCTION__, vertex_index, sna->render.vertex_size / op->floats_per_vertex)); |
|
- | 51 | if (gen4_vertex_finish(sna) < op->floats_per_rect) { |
|
- | 52 | kgem_submit(&sna->kgem); |
|
- | 53 | _kgem_set_mode(&sna->kgem, KGEM_RENDER); |
|
- | 54 | } |
|
- | 55 | ||
- | 56 | vertex_index = (sna->render.vertex_used + op->floats_per_vertex - 1) / op->floats_per_vertex; |
|
- | 57 | assert(vertex_index * op->floats_per_vertex <= sna->render.vertex_size); |
|
- | 58 | } |
|
- | 59 | ||
- | 60 | sna->render.vertex_index = vertex_index; |
|
- | 61 | sna->render.vertex_used = vertex_index * op->floats_per_vertex; |
|
39 | #endif |
62 | } |
40 | 63 | ||
41 | void gen4_vertex_flush(struct sna *sna) |
64 | void gen4_vertex_flush(struct sna *sna) |
42 | { |
65 | { |
43 | DBG(("%s[%x] = %d\n", __FUNCTION__, |
66 | DBG(("%s[%x] = %d\n", __FUNCTION__, |
Line 44... | Line 67... | ||
44 | 4*sna->render.vertex_offset, |
67 | 4*sna->render.vertex_offset, |
- | 68 | sna->render.vertex_index - sna->render.vertex_start)); |
|
45 | sna->render.vertex_index - sna->render.vertex_start)); |
69 | |
- | 70 | assert(sna->render.vertex_offset); |
|
Line 46... | Line 71... | ||
46 | 71 | assert(sna->render.vertex_offset <= sna->kgem.nbatch); |
|
47 | assert(sna->render.vertex_offset); |
72 | assert(sna->render.vertex_index > sna->render.vertex_start); |
48 | assert(sna->render.vertex_index > sna->render.vertex_start); |
73 | assert(sna->render.vertex_used <= sna->render.vertex_size); |
49 | 74 | ||
Line 60... | Line 85... | ||
60 | 85 | ||
61 | DBG(("%s: used=%d / %d\n", __FUNCTION__, |
86 | DBG(("%s: used=%d / %d\n", __FUNCTION__, |
62 | sna->render.vertex_used, sna->render.vertex_size)); |
87 | sna->render.vertex_used, sna->render.vertex_size)); |
63 | assert(sna->render.vertex_offset == 0); |
88 | assert(sna->render.vertex_offset == 0); |
- | 89 | assert(sna->render.vertex_used); |
|
Line 64... | Line 90... | ||
64 | assert(sna->render.vertex_used); |
90 | assert(sna->render.vertex_used <= sna->render.vertex_size); |
Line 65... | Line 91... | ||
65 | 91 | ||
Line -... | Line 92... | ||
- | 92 | sna_vertex_wait__locked(&sna->render); |
|
- | 93 | ||
66 | sna_vertex_wait__locked(&sna->render); |
94 | /* Note: we only need dword alignment (currently) */ |
67 | 95 | ||
68 | /* Note: we only need dword alignment (currently) */ |
96 | hint = CREATE_GTT_MAP; |
69 | 97 | ||
70 | bo = sna->render.vbo; |
98 | bo = sna->render.vbo; |
Line 86... | Line 114... | ||
86 | sna->render.vertex_index = 0; |
114 | sna->render.vertex_index = 0; |
87 | sna->render.vbo = NULL; |
115 | sna->render.vbo = NULL; |
88 | sna->render.vb_id = 0; |
116 | sna->render.vb_id = 0; |
Line 89... | Line 117... | ||
89 | 117 | ||
- | 118 | kgem_bo_destroy(&sna->kgem, bo); |
|
- | 119 | hint |= CREATE_CACHED | CREATE_NO_THROTTLE; |
|
- | 120 | } else { |
|
- | 121 | if (kgem_is_idle(&sna->kgem)) { |
|
- | 122 | sna->render.vertices = sna->render.vertex_data; |
|
- | 123 | sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data); |
|
- | 124 | return 0; |
|
90 | kgem_bo_destroy(&sna->kgem, bo); |
125 | } |
Line 91... | Line -... | ||
91 | } |
- | |
92 | - | ||
93 | hint = CREATE_GTT_MAP; |
- | |
Line 94... | Line 126... | ||
94 | if (bo) |
126 | } |
95 | hint |= CREATE_CACHED | CREATE_NO_THROTTLE; |
127 | |
96 | 128 | ||
97 | size = 256*1024; |
129 | size = 256*1024; |
Line 161... | Line 193... | ||
161 | DBG(("%s: discarding vbo (full), handle=%d\n", __FUNCTION__, sna->render.vbo->handle)); |
193 | DBG(("%s: discarding vbo (full), handle=%d\n", __FUNCTION__, sna->render.vbo->handle)); |
162 | sna->render.vbo = NULL; |
194 | sna->render.vbo = NULL; |
163 | sna->render.vertices = sna->render.vertex_data; |
195 | sna->render.vertices = sna->render.vertex_data; |
164 | sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data); |
196 | sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data); |
165 | free_bo = bo; |
197 | free_bo = bo; |
166 | } else if (IS_CPU_MAP(bo->map) && !sna->kgem.has_llc) { |
198 | } else if (!sna->kgem.has_llc && sna->render.vertices == MAP(bo->map__cpu)) { |
167 | DBG(("%s: converting CPU map to GTT\n", __FUNCTION__)); |
199 | DBG(("%s: converting CPU map to GTT\n", __FUNCTION__)); |
168 | sna->render.vertices = |
200 | sna->render.vertices = |
169 | kgem_bo_map__gtt(&sna->kgem, sna->render.vbo); |
201 | kgem_bo_map__gtt(&sna->kgem, sna->render.vbo); |
170 | if (sna->render.vertices == NULL) { |
202 | if (sna->render.vertices == NULL) { |
171 | sna->render.vbo = NULL; |
203 | sna->render.vbo = NULL; |
Line 174... | Line 206... | ||
174 | free_bo = bo; |
206 | free_bo = bo; |
175 | } |
207 | } |
Line 176... | Line 208... | ||
176 | 208 | ||
177 | } |
209 | } |
- | 210 | } else { |
|
- | 211 | int size; |
|
- | 212 | ||
178 | } else { |
213 | size = sna->kgem.nbatch; |
- | 214 | size += sna->kgem.batch_size - sna->kgem.surface; |
|
- | 215 | size += sna->render.vertex_used; |
|
- | 216 | ||
179 | if (sna->kgem.nbatch + sna->render.vertex_used <= sna->kgem.surface) { |
217 | if (size <= 1024) { |
180 | DBG(("%s: copy to batch: %d @ %d\n", __FUNCTION__, |
218 | DBG(("%s: copy to batch: %d @ %d\n", __FUNCTION__, |
- | 219 | sna->render.vertex_used, sna->kgem.nbatch)); |
|
181 | sna->render.vertex_used, sna->kgem.nbatch)); |
220 | assert(sna->kgem.nbatch + sna->render.vertex_used <= sna->kgem.surface); |
182 | memcpy(sna->kgem.batch + sna->kgem.nbatch, |
221 | memcpy(sna->kgem.batch + sna->kgem.nbatch, |
183 | sna->render.vertex_data, |
222 | sna->render.vertex_data, |
184 | sna->render.vertex_used * 4); |
223 | sna->render.vertex_used * 4); |
185 | delta = sna->kgem.nbatch * 4; |
224 | delta = sna->kgem.nbatch * 4; |
186 | bo = NULL; |
225 | bo = NULL; |
187 | sna->kgem.nbatch += sna->render.vertex_used; |
226 | sna->kgem.nbatch += sna->render.vertex_used; |
- | 227 | } else { |
|
- | 228 | size = 256 * 1024; |
|
- | 229 | do { |
|
- | 230 | bo = kgem_create_linear(&sna->kgem, size, |
|
- | 231 | CREATE_GTT_MAP | CREATE_NO_RETIRE | CREATE_NO_THROTTLE | CREATE_CACHED); |
|
- | 232 | } while (bo == NULL && (size>>=1) > sizeof(float)*sna->render.vertex_used); |
|
- | 233 | ||
- | 234 | sna->render.vertices = NULL; |
|
- | 235 | if (bo) |
|
- | 236 | sna->render.vertices = kgem_bo_map(&sna->kgem, bo); |
|
- | 237 | if (sna->render.vertices != NULL) { |
|
- | 238 | DBG(("%s: new vbo: %d / %d\n", __FUNCTION__, |
|
- | 239 | sna->render.vertex_used, __kgem_bo_size(bo)/4)); |
|
- | 240 | ||
- | 241 | assert(sizeof(float)*sna->render.vertex_used <= __kgem_bo_size(bo)); |
|
- | 242 | memcpy(sna->render.vertices, |
|
- | 243 | sna->render.vertex_data, |
|
- | 244 | sizeof(float)*sna->render.vertex_used); |
|
- | 245 | ||
- | 246 | size = __kgem_bo_size(bo)/4; |
|
- | 247 | if (size >= UINT16_MAX) |
|
- | 248 | size = UINT16_MAX - 1; |
|
- | 249 | ||
- | 250 | sna->render.vbo = bo; |
|
- | 251 | sna->render.vertex_size = size; |
|
- | 252 | } else { |
|
- | 253 | DBG(("%s: tmp vbo: %d\n", __FUNCTION__, |
|
- | 254 | sna->render.vertex_used)); |
|
- | 255 | ||
- | 256 | if (bo) |
|
- | 257 | kgem_bo_destroy(&sna->kgem, bo); |
|
188 | } else { |
258 | |
189 | bo = kgem_create_linear(&sna->kgem, |
259 | bo = kgem_create_linear(&sna->kgem, |
190 | 4*sna->render.vertex_used, |
260 | 4*sna->render.vertex_used, |
191 | CREATE_NO_THROTTLE); |
261 | CREATE_NO_THROTTLE); |
192 | if (bo && !kgem_bo_write(&sna->kgem, bo, |
262 | if (bo && !kgem_bo_write(&sna->kgem, bo, |
193 | sna->render.vertex_data, |
263 | sna->render.vertex_data, |
194 | 4*sna->render.vertex_used)) { |
264 | 4*sna->render.vertex_used)) { |
195 | kgem_bo_destroy(&sna->kgem, bo); |
265 | kgem_bo_destroy(&sna->kgem, bo); |
196 | bo = NULL; |
266 | bo = NULL; |
- | 267 | } |
|
197 | } |
268 | |
198 | DBG(("%s: new vbo: %d\n", __FUNCTION__, |
269 | assert(sna->render.vbo == NULL); |
- | 270 | sna->render.vertices = sna->render.vertex_data; |
|
199 | sna->render.vertex_used)); |
271 | sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data); |
200 | free_bo = bo; |
272 | free_bo = bo; |
201 | } |
273 | } |
- | 274 | } |
|
Line 202... | Line 275... | ||
202 | } |
275 | } |
203 | 276 | ||
204 | assert(sna->render.nvertex_reloc); |
277 | assert(sna->render.nvertex_reloc); |
205 | for (i = 0; i < sna->render.nvertex_reloc; i++) { |
278 | for (i = 0; i < sna->render.nvertex_reloc; i++) { |