38,6 → 38,29 |
#define sse2 |
#endif |
|
void gen4_vertex_align(struct sna *sna, const struct sna_composite_op *op) |
{ |
int vertex_index; |
|
assert(op->floats_per_rect == 3*op->floats_per_vertex); |
|
vertex_index = (sna->render.vertex_used + op->floats_per_vertex - 1) / op->floats_per_vertex; |
if ((int)sna->render.vertex_size - vertex_index * op->floats_per_vertex < 2*op->floats_per_rect) { |
DBG(("%s: flushing vertex buffer: new index=%d, max=%d\n", |
__FUNCTION__, vertex_index, sna->render.vertex_size / op->floats_per_vertex)); |
if (gen4_vertex_finish(sna) < op->floats_per_rect) { |
kgem_submit(&sna->kgem); |
_kgem_set_mode(&sna->kgem, KGEM_RENDER); |
} |
|
vertex_index = (sna->render.vertex_used + op->floats_per_vertex - 1) / op->floats_per_vertex; |
assert(vertex_index * op->floats_per_vertex <= sna->render.vertex_size); |
} |
|
sna->render.vertex_index = vertex_index; |
sna->render.vertex_used = vertex_index * op->floats_per_vertex; |
} |
|
void gen4_vertex_flush(struct sna *sna) |
{ |
DBG(("%s[%x] = %d\n", __FUNCTION__, |
45,7 → 68,9 |
sna->render.vertex_index - sna->render.vertex_start)); |
|
assert(sna->render.vertex_offset); |
assert(sna->render.vertex_offset <= sna->kgem.nbatch); |
assert(sna->render.vertex_index > sna->render.vertex_start); |
assert(sna->render.vertex_used <= sna->render.vertex_size); |
|
sna->kgem.batch[sna->render.vertex_offset] = |
sna->render.vertex_index - sna->render.vertex_start; |
62,11 → 87,14 |
sna->render.vertex_used, sna->render.vertex_size)); |
assert(sna->render.vertex_offset == 0); |
assert(sna->render.vertex_used); |
assert(sna->render.vertex_used <= sna->render.vertex_size); |
|
sna_vertex_wait__locked(&sna->render); |
|
/* Note: we only need dword alignment (currently) */ |
|
hint = CREATE_GTT_MAP; |
|
bo = sna->render.vbo; |
if (bo) { |
for (i = 0; i < sna->render.nvertex_reloc; i++) { |
88,11 → 116,15 |
sna->render.vb_id = 0; |
|
kgem_bo_destroy(&sna->kgem, bo); |
hint |= CREATE_CACHED | CREATE_NO_THROTTLE; |
} else { |
if (kgem_is_idle(&sna->kgem)) { |
sna->render.vertices = sna->render.vertex_data; |
sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data); |
return 0; |
} |
} |
|
hint = CREATE_GTT_MAP; |
if (bo) |
hint |= CREATE_CACHED | CREATE_NO_THROTTLE; |
|
size = 256*1024; |
assert(!sna->render.active); |
163,7 → 195,7 |
sna->render.vertices = sna->render.vertex_data; |
sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data); |
free_bo = bo; |
} else if (IS_CPU_MAP(bo->map) && !sna->kgem.has_llc) { |
} else if (!sna->kgem.has_llc && sna->render.vertices == MAP(bo->map__cpu)) { |
DBG(("%s: converting CPU map to GTT\n", __FUNCTION__)); |
sna->render.vertices = |
kgem_bo_map__gtt(&sna->kgem, sna->render.vbo); |
176,9 → 208,16 |
|
} |
} else { |
if (sna->kgem.nbatch + sna->render.vertex_used <= sna->kgem.surface) { |
int size; |
|
size = sna->kgem.nbatch; |
size += sna->kgem.batch_size - sna->kgem.surface; |
size += sna->render.vertex_used; |
|
if (size <= 1024) { |
DBG(("%s: copy to batch: %d @ %d\n", __FUNCTION__, |
sna->render.vertex_used, sna->kgem.nbatch)); |
assert(sna->kgem.nbatch + sna->render.vertex_used <= sna->kgem.surface); |
memcpy(sna->kgem.batch + sna->kgem.nbatch, |
sna->render.vertex_data, |
sna->render.vertex_used * 4); |
186,6 → 225,37 |
bo = NULL; |
sna->kgem.nbatch += sna->render.vertex_used; |
} else { |
size = 256 * 1024; |
do { |
bo = kgem_create_linear(&sna->kgem, size, |
CREATE_GTT_MAP | CREATE_NO_RETIRE | CREATE_NO_THROTTLE | CREATE_CACHED); |
} while (bo == NULL && (size>>=1) > sizeof(float)*sna->render.vertex_used); |
|
sna->render.vertices = NULL; |
if (bo) |
sna->render.vertices = kgem_bo_map(&sna->kgem, bo); |
if (sna->render.vertices != NULL) { |
DBG(("%s: new vbo: %d / %d\n", __FUNCTION__, |
sna->render.vertex_used, __kgem_bo_size(bo)/4)); |
|
assert(sizeof(float)*sna->render.vertex_used <= __kgem_bo_size(bo)); |
memcpy(sna->render.vertices, |
sna->render.vertex_data, |
sizeof(float)*sna->render.vertex_used); |
|
size = __kgem_bo_size(bo)/4; |
if (size >= UINT16_MAX) |
size = UINT16_MAX - 1; |
|
sna->render.vbo = bo; |
sna->render.vertex_size = size; |
} else { |
DBG(("%s: tmp vbo: %d\n", __FUNCTION__, |
sna->render.vertex_used)); |
|
if (bo) |
kgem_bo_destroy(&sna->kgem, bo); |
|
bo = kgem_create_linear(&sna->kgem, |
4*sna->render.vertex_used, |
CREATE_NO_THROTTLE); |
195,11 → 265,14 |
kgem_bo_destroy(&sna->kgem, bo); |
bo = NULL; |
} |
DBG(("%s: new vbo: %d\n", __FUNCTION__, |
sna->render.vertex_used)); |
|
assert(sna->render.vbo == NULL); |
sna->render.vertices = sna->render.vertex_data; |
sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data); |
free_bo = bo; |
} |
} |
} |
|
assert(sna->render.nvertex_reloc); |
for (i = 0; i < sna->render.nvertex_reloc; i++) { |