summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/sna/gen3_render.c5
-rw-r--r--src/sna/gen4_render.c6
-rw-r--r--src/sna/gen5_render.c6
-rw-r--r--src/sna/gen6_render.c8
-rw-r--r--src/sna/gen7_render.c8
-rw-r--r--src/sna/kgem.c11
-rw-r--r--src/sna/kgem.h2
-rw-r--r--src/sna/sna_gradient.c8
-rw-r--r--src/sna/sna_stream.c2
-rw-r--r--src/sna/sna_video.c3
-rw-r--r--src/sna/sna_video_textured.c3
11 files changed, 39 insertions, 23 deletions
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index bd1eddd2..78c7ea0a 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -1642,7 +1642,8 @@ static int gen3_vertex_finish(struct sna *sna)
}
sna->render.vertices = NULL;
- sna->render.vbo = kgem_create_linear(&sna->kgem, 256*1024);
+ sna->render.vbo = kgem_create_linear(&sna->kgem,
+ 256*1024, CREATE_GTT_MAP);
if (sna->render.vbo)
sna->render.vertices = kgem_bo_map(&sna->kgem, sna->render.vbo);
if (sna->render.vertices == NULL) {
@@ -1702,7 +1703,7 @@ static void gen3_vertex_close(struct sna *sna)
DBG(("%s: new vbo: %d\n", __FUNCTION__,
sna->render.vertex_used));
bo = kgem_create_linear(&sna->kgem,
- 4*sna->render.vertex_used);
+ 4*sna->render.vertex_used, 0);
if (bo)
kgem_bo_write(&sna->kgem, bo,
sna->render.vertex_data,
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 6ba59ee6..97af7fc9 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -398,7 +398,8 @@ static int gen4_vertex_finish(struct sna *sna)
}
sna->render.vertices = NULL;
- sna->render.vbo = kgem_create_linear(&sna->kgem, 256*1024);
+ sna->render.vbo = kgem_create_linear(&sna->kgem,
+ 256*1024, CREATE_GTT_MAP);
if (sna->render.vbo)
sna->render.vertices = kgem_bo_map(&sna->kgem, sna->render.vbo);
if (sna->render.vertices == NULL) {
@@ -442,7 +443,8 @@ static void gen4_vertex_close(struct sna *sna)
bo = NULL;
sna->kgem.nbatch += sna->render.vertex_used;
} else {
- bo = kgem_create_linear(&sna->kgem, 4*sna->render.vertex_used);
+ bo = kgem_create_linear(&sna->kgem,
+ 4*sna->render.vertex_used, 0);
if (bo && !kgem_bo_write(&sna->kgem, bo,
sna->render.vertex_data,
4*sna->render.vertex_used)) {
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index bccd3437..18325b51 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -390,7 +390,8 @@ static int gen5_vertex_finish(struct sna *sna)
}
sna->render.vertices = NULL;
- sna->render.vbo = kgem_create_linear(&sna->kgem, 256*1024);
+ sna->render.vbo = kgem_create_linear(&sna->kgem,
+ 256*1024, CREATE_GTT_MAP);
if (sna->render.vbo)
sna->render.vertices = kgem_bo_map(&sna->kgem, sna->render.vbo);
if (sna->render.vertices == NULL) {
@@ -447,7 +448,8 @@ static void gen5_vertex_close(struct sna *sna)
bo = NULL;
sna->kgem.nbatch += sna->render.vertex_used;
} else {
- bo = kgem_create_linear(&sna->kgem, 4*sna->render.vertex_used);
+ bo = kgem_create_linear(&sna->kgem,
+ 4*sna->render.vertex_used, 0);
if (bo && !kgem_bo_write(&sna->kgem, bo,
sna->render.vertex_data,
4*sna->render.vertex_used)) {
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 439fb521..71c0046e 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -964,9 +964,10 @@ static int gen6_vertex_finish(struct sna *sna)
}
sna->render.vertices = NULL;
- sna->render.vbo = kgem_create_linear(&sna->kgem, 256*1024);
+ sna->render.vbo = kgem_create_linear(&sna->kgem,
+ 256*1024, CREATE_GTT_MAP);
if (sna->render.vbo)
- sna->render.vertices = kgem_bo_map__cpu(&sna->kgem, sna->render.vbo);
+ sna->render.vertices = kgem_bo_map(&sna->kgem, sna->render.vbo);
if (sna->render.vertices == NULL) {
kgem_bo_destroy(&sna->kgem, sna->render.vbo);
sna->render.vbo = NULL;
@@ -1024,7 +1025,8 @@ static void gen6_vertex_close(struct sna *sna)
bo = NULL;
sna->kgem.nbatch += sna->render.vertex_used;
} else {
- bo = kgem_create_linear(&sna->kgem, 4*sna->render.vertex_used);
+ bo = kgem_create_linear(&sna->kgem,
+ 4*sna->render.vertex_used, 0);
if (bo && !kgem_bo_write(&sna->kgem, bo,
sna->render.vertex_data,
4*sna->render.vertex_used)) {
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index e3d9757d..a401d94b 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -1065,9 +1065,10 @@ static int gen7_vertex_finish(struct sna *sna)
}
sna->render.vertices = NULL;
- sna->render.vbo = kgem_create_linear(&sna->kgem, 256*1024);
+ sna->render.vbo = kgem_create_linear(&sna->kgem,
+ 256*1024, CREATE_GTT_MAP);
if (sna->render.vbo)
- sna->render.vertices = kgem_bo_map__cpu(&sna->kgem, sna->render.vbo);
+ sna->render.vertices = kgem_bo_map(&sna->kgem, sna->render.vbo);
if (sna->render.vertices == NULL) {
kgem_bo_destroy(&sna->kgem, sna->render.vbo);
sna->render.vbo = NULL;
@@ -1121,7 +1122,8 @@ static void gen7_vertex_close(struct sna *sna)
bo = NULL;
sna->kgem.nbatch += sna->render.vertex_used;
} else {
- bo = kgem_create_linear(&sna->kgem, 4*sna->render.vertex_used);
+ bo = kgem_create_linear(&sna->kgem,
+ 4*sna->render.vertex_used, 0);
if (bo && !kgem_bo_write(&sna->kgem, bo,
sna->render.vertex_data,
4*sna->render.vertex_used)) {
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 5776a4fe..1ec9fb4c 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1687,7 +1687,7 @@ void _kgem_submit(struct kgem *kgem)
size = compact_batch_surface(kgem);
else
size = kgem->nbatch * sizeof(kgem->batch[0]);
- rq->bo = kgem_create_linear(kgem, size);
+ rq->bo = kgem_create_linear(kgem, size, 0);
if (rq->bo) {
uint32_t handle = rq->bo->handle;
int i;
@@ -2188,15 +2188,20 @@ struct kgem_bo *kgem_create_for_name(struct kgem *kgem, uint32_t name)
return bo;
}
-struct kgem_bo *kgem_create_linear(struct kgem *kgem, int size)
+struct kgem_bo *kgem_create_linear(struct kgem *kgem, int size, unsigned flags)
{
struct kgem_bo *bo;
uint32_t handle;
DBG(("%s(%d)\n", __FUNCTION__, size));
+ if (flags & CREATE_GTT_MAP && kgem->has_llc) {
+ flags &= ~CREATE_GTT_MAP;
+ flags |= CREATE_CPU_MAP;
+ }
+
size = (size + PAGE_SIZE - 1) / PAGE_SIZE;
- bo = search_linear_cache(kgem, size, CREATE_INACTIVE);
+ bo = search_linear_cache(kgem, size, CREATE_INACTIVE | flags);
if (bo)
return kgem_bo_reference(bo);
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 446ac681..9abb72af 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -192,7 +192,7 @@ struct kgem_bo *kgem_create_map(struct kgem *kgem,
struct kgem_bo *kgem_create_for_name(struct kgem *kgem, uint32_t name);
-struct kgem_bo *kgem_create_linear(struct kgem *kgem, int size);
+struct kgem_bo *kgem_create_linear(struct kgem *kgem, int size, unsigned flags);
struct kgem_bo *kgem_create_proxy(struct kgem_bo *target,
int offset, int length);
diff --git a/src/sna/sna_gradient.c b/src/sna/sna_gradient.c
index 96841dd4..943cbf96 100644
--- a/src/sna/sna_gradient.c
+++ b/src/sna/sna_gradient.c
@@ -168,7 +168,7 @@ sna_render_get_gradient(struct sna *sna,
width/2, pixman_image_get_data(image)[width/2],
width-1, pixman_image_get_data(image)[width-1]));
- bo = kgem_create_linear(&sna->kgem, width*4);
+ bo = kgem_create_linear(&sna->kgem, width*4, 0);
if (!bo) {
pixman_image_unref(image);
return NULL;
@@ -248,7 +248,7 @@ sna_render_finish_solid(struct sna *sna, bool force)
DBG(("sna_render_finish_solid reset\n"));
- cache->cache_bo = kgem_create_linear(&sna->kgem, sizeof(cache->color));
+ cache->cache_bo = kgem_create_linear(&sna->kgem, sizeof(cache->color), 0);
cache->bo[0] = kgem_create_proxy(cache->cache_bo, 0, sizeof(uint32_t));
cache->bo[0]->pitch = 4;
if (force)
@@ -316,7 +316,7 @@ static Bool sna_alpha_cache_init(struct sna *sna)
DBG(("%s\n", __FUNCTION__));
- cache->cache_bo = kgem_create_linear(&sna->kgem, sizeof(color));
+ cache->cache_bo = kgem_create_linear(&sna->kgem, sizeof(color), 0);
if (!cache->cache_bo)
return FALSE;
@@ -338,7 +338,7 @@ static Bool sna_solid_cache_init(struct sna *sna)
DBG(("%s\n", __FUNCTION__));
cache->cache_bo =
- kgem_create_linear(&sna->kgem, sizeof(cache->color));
+ kgem_create_linear(&sna->kgem, sizeof(cache->color), 0);
if (!cache->cache_bo)
return FALSE;
diff --git a/src/sna/sna_stream.c b/src/sna/sna_stream.c
index d6d817d3..7f05d210 100644
--- a/src/sna/sna_stream.c
+++ b/src/sna/sna_stream.c
@@ -87,7 +87,7 @@ struct kgem_bo *sna_static_stream_fini(struct sna *sna,
DBG(("uploaded %d bytes of static state\n", stream->used));
- bo = kgem_create_linear(&sna->kgem, stream->used);
+ bo = kgem_create_linear(&sna->kgem, stream->used, 0);
if (bo && !kgem_bo_write(&sna->kgem, bo, stream->data, stream->used)) {
kgem_bo_destroy(&sna->kgem, bo);
return NULL;
diff --git a/src/sna/sna_video.c b/src/sna/sna_video.c
index ebc3860f..56cf260f 100644
--- a/src/sna/sna_video.c
+++ b/src/sna/sna_video.c
@@ -104,7 +104,8 @@ sna_video_buffer(struct sna *sna,
sna_video_free_buffers(sna, video);
if (video->buf == NULL)
- video->buf = kgem_create_linear(&sna->kgem, frame->size);
+ video->buf = kgem_create_linear(&sna->kgem, frame->size,
+ CREATE_GTT_MAP);
return video->buf;
}
diff --git a/src/sna/sna_video_textured.c b/src/sna/sna_video_textured.c
index 1aaf9723..a71751c6 100644
--- a/src/sna/sna_video_textured.c
+++ b/src/sna/sna_video_textured.c
@@ -273,7 +273,8 @@ sna_video_textured_put_image(ScrnInfoPtr scrn,
assert(kgem_bo_size(frame.bo) >= frame.size);
} else {
- frame.bo = kgem_create_linear(&sna->kgem, frame.size);
+ frame.bo = kgem_create_linear(&sna->kgem, frame.size,
+ CREATE_GTT_MAP);
if (frame.bo == NULL) {
DBG(("%s: failed to allocate bo\n", __FUNCTION__));
return BadAlloc;