summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2015-06-24 14:36:32 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2015-06-24 14:37:53 +0100
commit990499c6d98306b4eafeb6405ed209988da301a6 (patch)
tree42df610bab629b0d5e360a6fc88c2da9639784ab
parentf414ed4e40292e91e9c6850fb01a26334e6b43c7 (diff)
sna/gen3: Allow gen3 to use smaller vbo if already available in cache
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/gen3_render.c73
1 files changed, 66 insertions, 7 deletions
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index c3134f44..3c87b366 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -531,6 +531,7 @@ gen3_emit_composite_primitive_affine_gradient(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 12;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = dst_x + r->width;
v[1] = dst_y + r->height;
@@ -596,6 +597,7 @@ gen3_emit_composite_primitive_identity_source(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 12;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[8] = v[4] = r->dst.x + op->dst.x;
v[0] = v[4] + w;
@@ -643,6 +645,7 @@ gen3_emit_composite_primitive_identity_source_no_offset(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 12;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[8] = v[4] = r->dst.x;
v[9] = r->dst.y;
@@ -693,6 +696,7 @@ gen3_emit_composite_primitive_affine_source(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 12;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = dst_x + r->width;
v[5] = v[1] = dst_y + r->height;
@@ -756,6 +760,7 @@ gen3_emit_composite_primitive_constant_identity_mask(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 12;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[8] = v[4] = r->dst.x + op->dst.x;
v[0] = v[4] + w;
@@ -781,6 +786,7 @@ gen3_emit_composite_primitive_constant_identity_mask_no_offset(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 12;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[8] = v[4] = r->dst.x;
v[9] = r->dst.y;
@@ -817,6 +823,7 @@ gen3_emit_composite_primitive_identity_source_mask(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 18;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = dst_x + w;
v[1] = dst_y + h;
@@ -862,6 +869,7 @@ gen3_emit_composite_primitive_affine_source_mask(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 18;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = dst_x + w;
v[1] = dst_y + h;
@@ -978,6 +986,7 @@ gen3_emit_composite_primitive_constant__sse2(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 6;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[4] = v[2] = r->dst.x + op->dst.x;
v[5] = r->dst.y + op->dst.y;
@@ -1013,6 +1022,7 @@ gen3_emit_composite_primitive_identity_gradient__sse2(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 12;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
x = r->dst.x + op->dst.x;
y = r->dst.y + op->dst.y;
@@ -1067,6 +1077,7 @@ gen3_emit_composite_primitive_affine_gradient__sse2(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 12;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = dst_x + r->width;
v[1] = dst_y + r->height;
@@ -1132,6 +1143,7 @@ gen3_emit_composite_primitive_identity_source__sse2(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 12;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[8] = v[4] = r->dst.x + op->dst.x;
v[0] = v[4] + w;
@@ -1179,6 +1191,7 @@ gen3_emit_composite_primitive_identity_source_no_offset__sse2(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 12;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[8] = v[4] = r->dst.x;
v[9] = r->dst.y;
@@ -1229,6 +1242,7 @@ gen3_emit_composite_primitive_affine_source__sse2(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 12;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = dst_x + r->width;
v[5] = v[1] = dst_y + r->height;
@@ -1292,6 +1306,7 @@ gen3_emit_composite_primitive_constant_identity_mask__sse2(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 12;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[8] = v[4] = r->dst.x + op->dst.x;
v[0] = v[4] + w;
@@ -1317,6 +1332,7 @@ gen3_emit_composite_primitive_constant_identity_mask_no_offset__sse2(struct sna
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 12;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[8] = v[4] = r->dst.x;
v[9] = r->dst.y;
@@ -1353,6 +1369,7 @@ gen3_emit_composite_primitive_identity_source_mask__sse2(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 18;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = dst_x + w;
v[1] = dst_y + h;
@@ -1398,6 +1415,7 @@ gen3_emit_composite_primitive_affine_source_mask__sse2(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 18;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = dst_x + w;
v[1] = dst_y + h;
@@ -2233,6 +2251,7 @@ static void gen3_vertex_flush(struct sna *sna)
static int gen3_vertex_finish(struct sna *sna)
{
struct kgem_bo *bo;
+ unsigned hint, size;
DBG(("%s: used=%d/%d, vbo active? %d\n",
__FUNCTION__, sna->render.vertex_used, sna->render.vertex_size,
@@ -2243,6 +2262,7 @@ static int gen3_vertex_finish(struct sna *sna)
sna_vertex_wait__locked(&sna->render);
+ hint = CREATE_GTT_MAP;
bo = sna->render.vbo;
if (bo) {
DBG(("%s: reloc = %d\n", __FUNCTION__,
@@ -2260,17 +2280,29 @@ static int gen3_vertex_finish(struct sna *sna)
sna->render.vbo = NULL;
kgem_bo_destroy(&sna->kgem, bo);
+ hint |= CREATE_CACHED | CREATE_NO_THROTTLE;
}
+ size = 256*1024;
sna->render.vertices = NULL;
- sna->render.vbo = kgem_create_linear(&sna->kgem,
- 256*1024, CREATE_GTT_MAP);
- if (sna->render.vbo)
+ sna->render.vbo = kgem_create_linear(&sna->kgem, size, hint);
+ while (sna->render.vbo == NULL && size > sizeof(sna->render.vertex_data)) {
+ size /= 2;
+ sna->render.vbo = kgem_create_linear(&sna->kgem, size, hint);
+ }
+ if (sna->render.vbo == NULL)
+ sna->render.vbo = kgem_create_linear(&sna->kgem,
+ 256*1024, CREATE_GTT_MAP);
+ if (sna->render.vbo &&
+ kgem_check_bo(&sna->kgem, sna->render.vbo, NULL))
sna->render.vertices = kgem_bo_map(&sna->kgem, sna->render.vbo);
if (sna->render.vertices == NULL) {
- if (sna->render.vbo)
+ if (sna->render.vbo) {
kgem_bo_destroy(&sna->kgem, sna->render.vbo);
- sna->render.vbo = NULL;
+ sna->render.vbo = NULL;
+ }
+ sna->render.vertices = sna->render.vertex_data;
+ sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data);
return 0;
}
assert(sna->render.vbo->snoop == false);
@@ -2280,8 +2312,14 @@ static int gen3_vertex_finish(struct sna *sna)
sna->render.vertex_data,
sizeof(float)*sna->render.vertex_used);
}
- sna->render.vertex_size = 64 * 1024 - 1;
- return sna->render.vertex_size - sna->render.vertex_used;
+
+ size = __kgem_bo_size(sna->render.vbo)/4;
+ if (size >= UINT16_MAX)
+ size = UINT16_MAX - 1;
+ assert(size > sna->render.vertex_used);
+
+ sna->render.vertex_size = size;
+ return size - sna->render.vertex_used;
}
static void gen3_vertex_close(struct sna *sna)
@@ -2580,6 +2618,7 @@ gen3_render_composite_boxes(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += nbox_this_time * op->floats_per_rect;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
op->emit_boxes(op, box, nbox_this_time, v);
box += nbox_this_time;
@@ -2604,6 +2643,7 @@ gen3_render_composite_boxes__thread(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += nbox_this_time * op->floats_per_rect;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
sna_vertex_acquire__locked(&sna->render);
sna_vertex_unlock(&sna->render);
@@ -3862,6 +3902,7 @@ gen3_emit_composite_spans_primitive_zero(struct sna *sna,
{
float *v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 6;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = op->base.dst.x + box->x2;
v[1] = op->base.dst.y + box->y2;
@@ -3901,6 +3942,7 @@ gen3_emit_composite_spans_primitive_zero_no_offset(struct sna *sna,
{
float *v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 6;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = box->x2;
v[3] = v[1] = box->y2;
@@ -3932,6 +3974,7 @@ gen3_emit_composite_spans_primitive_constant(struct sna *sna,
{
float *v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 9;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = op->base.dst.x + box->x2;
v[6] = v[3] = op->base.dst.x + box->x1;
@@ -3966,6 +4009,7 @@ gen3_emit_composite_spans_primitive_constant_no_offset(struct sna *sna,
{
float *v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 9;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = box->x2;
v[6] = v[3] = box->x1;
@@ -3999,6 +4043,7 @@ gen3_emit_composite_spans_primitive_identity_source(struct sna *sna,
{
float *v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 15;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = op->base.dst.x + box->x2;
v[1] = op->base.dst.y + box->y2;
@@ -4060,6 +4105,7 @@ gen3_emit_composite_spans_primitive_affine_source(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 15;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = op->base.dst.x + box->x2;
v[6] = v[1] = op->base.dst.y + box->y2;
@@ -4125,6 +4171,7 @@ gen3_emit_composite_spans_primitive_identity_gradient(struct sna *sna,
{
float *v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 15;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = op->base.dst.x + box->x2;
v[1] = op->base.dst.y + box->y2;
@@ -4184,6 +4231,7 @@ gen3_emit_composite_spans_primitive_constant__sse2(struct sna *sna,
{
float *v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 9;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = op->base.dst.x + box->x2;
v[6] = v[3] = op->base.dst.x + box->x1;
@@ -4229,6 +4277,7 @@ gen3_render_composite_spans_constant_box__sse2(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 9;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = box->x2;
v[6] = v[3] = box->x1;
@@ -4259,6 +4308,7 @@ gen3_render_composite_spans_constant_thread__sse2__boxes(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += nbox_this_time * 9;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
sna_vertex_acquire__locked(&sna->render);
sna_vertex_unlock(&sna->render);
@@ -4287,6 +4337,7 @@ gen3_emit_composite_spans_primitive_constant__sse2__no_offset(struct sna *sna,
{
float *v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 9;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = box->x2;
v[6] = v[3] = box->x1;
@@ -4320,6 +4371,7 @@ gen3_emit_composite_spans_primitive_identity_source__sse2(struct sna *sna,
{
float *v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 15;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = op->base.dst.x + box->x2;
v[1] = op->base.dst.y + box->y2;
@@ -4380,6 +4432,7 @@ gen3_emit_composite_spans_primitive_affine_source__sse2(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 15;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = op->base.dst.x + box->x2;
v[6] = v[1] = op->base.dst.y + box->y2;
@@ -4445,6 +4498,7 @@ gen3_emit_composite_spans_primitive_identity_gradient__sse2(struct sna *sna,
{
float *v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 15;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = op->base.dst.x + box->x2;
v[1] = op->base.dst.y + box->y2;
@@ -4504,6 +4558,7 @@ gen3_emit_composite_spans_primitive_affine_gradient__sse2(struct sna *sna,
PictTransform *transform = op->base.src.transform;
float *v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 15;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = op->base.dst.x + box->x2;
v[1] = op->base.dst.y + box->y2;
@@ -4577,6 +4632,7 @@ gen3_emit_composite_spans_primitive_affine_gradient(struct sna *sna,
PictTransform *transform = op->base.src.transform;
float *v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 15;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = op->base.dst.x + box->x2;
v[1] = op->base.dst.y + box->y2;
@@ -4676,6 +4732,7 @@ gen3_render_composite_spans_constant_box(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += 9;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = box->x2;
v[6] = v[3] = box->x1;
@@ -4706,6 +4763,7 @@ gen3_render_composite_spans_constant_thread_boxes(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += nbox_this_time * 9;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
sna_vertex_acquire__locked(&sna->render);
sna_vertex_unlock(&sna->render);
@@ -4795,6 +4853,7 @@ gen3_render_composite_spans_boxes__thread(struct sna *sna,
v = sna->render.vertices + sna->render.vertex_used;
sna->render.vertex_used += nbox_this_time * op->base.floats_per_rect;
+ assert(sna->render.vertex_used <= sna->render.vertex_size);
sna_vertex_acquire__locked(&sna->render);
sna_vertex_unlock(&sna->render);