forked from KolibriOS/kolibrios
intel-2d: sna-2.99.906
git-svn-id: svn://kolibrios.org@4501 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
@@ -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 @@ void gen4_vertex_flush(struct sna *sna)
|
||||
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 @@ int gen4_vertex_finish(struct sna *sna)
|
||||
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 @@ int gen4_vertex_finish(struct sna *sna)
|
||||
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 @@ void gen4_vertex_close(struct sna *sna)
|
||||
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 @@ void gen4_vertex_close(struct sna *sna)
|
||||
|
||||
}
|
||||
} 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 @@ void gen4_vertex_close(struct sna *sna)
|
||||
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 @@ void gen4_vertex_close(struct sna *sna)
|
||||
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++) {
|
||||
|
Reference in New Issue
Block a user