diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2013-10-10 12:42:12 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2013-10-10 13:24:46 +0100 |
commit | 79f8ff4bbb2f723ec21c150c0775e706bc00a834 (patch) | |
tree | 434644c84ee85bdb71396b17e02e3ae503ab9300 | |
parent | 8bd9d63a863b88ecd6f72c11468e0940f3bcd9fc (diff) |
sna/gen4+: Share a few common routines
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/sna/Makefile.am | 2 | ||||
-rw-r--r-- | src/sna/gen4_common.c | 64 | ||||
-rw-r--r-- | src/sna/gen4_common.h | 49 | ||||
-rw-r--r-- | src/sna/gen4_render.c | 46 | ||||
-rw-r--r-- | src/sna/gen5_render.c | 53 | ||||
-rw-r--r-- | src/sna/gen6_common.c | 31 | ||||
-rw-r--r-- | src/sna/gen6_common.h | 4 | ||||
-rw-r--r-- | src/sna/gen6_render.c | 8 | ||||
-rw-r--r-- | src/sna/gen7_render.c | 11 |
9 files changed, 140 insertions, 128 deletions
diff --git a/src/sna/Makefile.am b/src/sna/Makefile.am index b0d24197..cdcd9205 100644 --- a/src/sna/Makefile.am +++ b/src/sna/Makefile.am @@ -85,6 +85,8 @@ libsna_la_SOURCES = \ gen2_render.h \ gen3_render.c \ gen3_render.h \ + gen4_common.c \ + gen4_common.h \ gen4_render.c \ gen4_render.h \ gen4_source.c \ diff --git a/src/sna/gen4_common.c b/src/sna/gen4_common.c new file mode 100644 index 00000000..f3d36c3b --- /dev/null +++ b/src/sna/gen4_common.c @@ -0,0 +1,64 @@ +/* + * Copyright © 2011-2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Chris Wilson <chris@chris-wilson.co.uk> + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gen4_common.h" +#include "gen4_vertex.h" + +void gen4_render_flush(struct sna *sna) +{ + gen4_vertex_close(sna); + + assert(sna->render.vb_id == 0); + assert(sna->render.vertex_offset == 0); +} + +void gen4_render_retire(struct kgem *kgem) +{ + struct sna *sna; + + sna = container_of(kgem, struct sna, kgem); + if (sna->render.nvertex_reloc == 0 && sna->render.vbo && !kgem_bo_is_busy(sna->render.vbo)) { + DBG(("%s: resetting idle vbo\n", __FUNCTION__)); + sna->render.vertex_used = 0; + sna->render.vertex_index = 0; + } +} + +void gen4_render_expire(struct kgem *kgem) +{ + struct sna *sna; + + sna = container_of(kgem, struct sna, kgem); + if (sna->render.vbo && !sna->render.vertex_used) { + DBG(("%s: discarding vbo\n", __FUNCTION__)); + discard_vbo(sna); + } +} diff --git a/src/sna/gen4_common.h b/src/sna/gen4_common.h new file mode 100644 index 00000000..de860bb0 --- /dev/null +++ b/src/sna/gen4_common.h @@ -0,0 +1,49 @@ +/* + * Copyright © 2011-2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Chris Wilson <chris@chris-wilson.co.uk> + * + */ + +#ifndef GEN4_COMMON_H +#define GEN4_COMMON_H + +#include "sna.h" + +inline static void +discard_vbo(struct sna *sna) +{ + kgem_bo_destroy(&sna->kgem, sna->render.vbo); + sna->render.vbo = NULL; + sna->render.vertices = sna->render.vertex_data; + sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data); + sna->render.vertex_used = 0; + sna->render.vertex_index = 0; +} + +void gen4_render_flush(struct sna *sna); +void gen4_render_retire(struct kgem *kgem); +void gen4_render_expire(struct kgem *kgem); + +#endif /* GEN4_COMMON_H */ + diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c index fe138737..f737c339 100644 --- a/src/sna/gen4_render.c +++ b/src/sna/gen4_render.c @@ -41,6 +41,7 @@ #include "sna_video.h" #include "brw/brw.h" +#include "gen4_common.h" #include "gen4_render.h" #include "gen4_source.h" #include "gen4_vertex.h" @@ -2858,51 +2859,6 @@ gen4_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo, return true; } -static void -gen4_render_flush(struct sna *sna) -{ - gen4_vertex_close(sna); - - assert(sna->render.vb_id == 0); - assert(sna->render.vertex_offset == 0); -} - -static void -discard_vbo(struct sna *sna) -{ - kgem_bo_destroy(&sna->kgem, sna->render.vbo); - sna->render.vbo = NULL; - sna->render.vertices = sna->render.vertex_data; - sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data); - sna->render.vertex_used = 0; - sna->render.vertex_index = 0; -} - -static void -gen4_render_retire(struct kgem *kgem) -{ - struct sna *sna; - - sna = container_of(kgem, struct sna, kgem); - if (kgem->nbatch == 0 && sna->render.vbo && !kgem_bo_is_busy(sna->render.vbo)) { - DBG(("%s: resetting idle vbo\n", __FUNCTION__)); - sna->render.vertex_used = 0; - sna->render.vertex_index = 0; - } -} - -static void -gen4_render_expire(struct kgem *kgem) -{ - struct sna *sna; - - sna = container_of(kgem, struct sna, kgem); - if (sna->render.vbo && !sna->render.vertex_used) { - DBG(("%s: discarding vbo\n", __FUNCTION__)); - discard_vbo(sna); - } -} - static void gen4_render_reset(struct sna *sna) { sna->render_state.gen4.needs_invariant = true; diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c index a0ef9b6e..f9dd6aed 100644 --- a/src/sna/gen5_render.c +++ b/src/sna/gen5_render.c @@ -42,6 +42,7 @@ #include "brw/brw.h" #include "gen5_render.h" +#include "gen4_common.h" #include "gen4_source.h" #include "gen4_vertex.h" @@ -2973,16 +2974,6 @@ gen5_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo, return true; } - -static void -gen5_render_flush(struct sna *sna) -{ - gen4_vertex_close(sna); - - assert(sna->render.vb_id == 0); - assert(sna->render.vertex_offset == 0); -} - static void gen5_render_context_switch(struct kgem *kgem, int new_mode) @@ -3012,42 +3003,6 @@ gen5_render_context_switch(struct kgem *kgem, } } -static void -discard_vbo(struct sna *sna) -{ - kgem_bo_destroy(&sna->kgem, sna->render.vbo); - sna->render.vbo = NULL; - sna->render.vertices = sna->render.vertex_data; - sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data); - sna->render.vertex_used = 0; - sna->render.vertex_index = 0; -} - -static void -gen5_render_retire(struct kgem *kgem) -{ - struct sna *sna; - - sna = container_of(kgem, struct sna, kgem); - if (kgem->nbatch == 0 && sna->render.vbo && !kgem_bo_is_busy(sna->render.vbo)) { - DBG(("%s: resetting idle vbo\n", __FUNCTION__)); - sna->render.vertex_used = 0; - sna->render.vertex_index = 0; - } -} - -static void -gen5_render_expire(struct kgem *kgem) -{ - struct sna *sna; - - sna = container_of(kgem, struct sna, kgem); - if (sna->render.vbo && !sna->render.vertex_used) { - DBG(("%s: discarding vbo\n", __FUNCTION__)); - discard_vbo(sna); - } -} - static void gen5_render_reset(struct sna *sna) { sna->render_state.gen5.needs_invariant = true; @@ -3303,8 +3258,8 @@ const char *gen5_render_init(struct sna *sna, const char *backend) return backend; sna->kgem.context_switch = gen5_render_context_switch; - sna->kgem.retire = gen5_render_retire; - sna->kgem.expire = gen5_render_expire; + sna->kgem.retire = gen4_render_retire; + sna->kgem.expire = gen4_render_expire; #if !NO_COMPOSITE sna->render.composite = gen5_render_composite; @@ -3325,7 +3280,7 @@ const char *gen5_render_init(struct sna *sna, const char *backend) sna->render.fill = gen5_render_fill; sna->render.fill_one = gen5_render_fill_one; - sna->render.flush = gen5_render_flush; + sna->render.flush = gen4_render_flush; sna->render.reset = gen5_render_reset; sna->render.fini = gen5_render_fini; diff --git a/src/sna/gen6_common.c b/src/sna/gen6_common.c index f4f02645..38af859a 100644 --- a/src/sna/gen6_common.c +++ b/src/sna/gen6_common.c @@ -32,14 +32,6 @@ #include "gen6_common.h" #include "gen4_vertex.h" -void gen6_render_flush(struct sna *sna) -{ - gen4_vertex_close(sna); - - assert(sna->render.vb_id == 0); - assert(sna->render.vertex_offset == 0); -} - void gen6_render_context_switch(struct kgem *kgem, int new_mode) @@ -61,8 +53,7 @@ gen6_render_context_switch(struct kgem *kgem, kgem->ring = new_mode; } -void -gen6_render_retire(struct kgem *kgem) +void gen6_render_retire(struct kgem *kgem) { struct sna *sna; @@ -70,26 +61,12 @@ gen6_render_retire(struct kgem *kgem) kgem->ring = kgem->mode; sna = container_of(kgem, struct sna, kgem); - if (kgem->nbatch == 0 && sna->render.vbo && !kgem_bo_is_busy(sna->render.vbo)) { + if (sna->render.nvertex_reloc == 0 && + sna->render.vbo && + !kgem_bo_is_busy(sna->render.vbo)) { DBG(("%s: resetting idle vbo\n", __FUNCTION__)); sna->render.vertex_used = 0; sna->render.vertex_index = 0; } } -void -gen6_render_expire(struct kgem *kgem) -{ - struct sna *sna; - - sna = container_of(kgem, struct sna, kgem); - if (sna->render.vbo && !sna->render.vertex_used) { - DBG(("%s: discarding vbo\n", __FUNCTION__)); - kgem_bo_destroy(kgem, sna->render.vbo); - sna->render.vbo = NULL; - sna->render.vertices = sna->render.vertex_data; - sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data); - sna->render.vertex_used = 0; - sna->render.vertex_index = 0; - } -} diff --git a/src/sna/gen6_common.h b/src/sna/gen6_common.h index e5d78c07..4957a33e 100644 --- a/src/sna/gen6_common.h +++ b/src/sna/gen6_common.h @@ -186,9 +186,7 @@ static inline bool prefer_blt_fill(struct sna *sna, return prefer_blt_bo(sna, bo); } -void gen6_render_flush(struct sna *sna); -void gen6_render_retire(struct kgem *kgem); -void gen6_render_expire(struct kgem *kgem); void gen6_render_context_switch(struct kgem *kgem, int new_mode); +void gen6_render_retire(struct kgem *kgem); #endif /* GEN6_COMMON_H */ diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c index e456e6b7..f271cf81 100644 --- a/src/sna/gen6_render.c +++ b/src/sna/gen6_render.c @@ -43,6 +43,7 @@ #include "brw/brw.h" #include "gen6_render.h" #include "gen6_common.h" +#include "gen4_common.h" #include "gen4_source.h" #include "gen4_vertex.h" @@ -3481,6 +3482,9 @@ static void gen6_render_reset(struct sna *sna) sna->render_state.gen6.drawrect_limit = -1; sna->render_state.gen6.surface_table = -1; + assert(sna->render.vbo == NULL || + kgem_bo_is_mappable(&sna->kgem, sna->render.vbo)); + sna->render.vertex_offset = 0; sna->render.nvertex_reloc = 0; sna->render.vb_id = 0; @@ -3589,7 +3593,7 @@ const char *gen6_render_init(struct sna *sna, const char *backend) sna->kgem.context_switch = gen6_render_context_switch; sna->kgem.retire = gen6_render_retire; - sna->kgem.expire = gen6_render_expire; + sna->kgem.expire = gen4_render_expire; #if !NO_COMPOSITE sna->render.composite = gen6_render_composite; @@ -3624,7 +3628,7 @@ const char *gen6_render_init(struct sna *sna, const char *backend) sna->render.clear = gen6_render_clear; #endif - sna->render.flush = gen6_render_flush; + sna->render.flush = gen4_render_flush; sna->render.reset = gen6_render_reset; sna->render.fini = gen6_render_fini; diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c index f6eef4aa..d597e17c 100644 --- a/src/sna/gen7_render.c +++ b/src/sna/gen7_render.c @@ -42,6 +42,7 @@ #include "brw/brw.h" #include "gen7_render.h" +#include "gen4_common.h" #include "gen4_source.h" #include "gen4_vertex.h" #include "gen6_common.h" @@ -3709,6 +3710,12 @@ static void gen7_render_reset(struct sna *sna) sna->render_state.gen7.drawrect_limit = -1; sna->render_state.gen7.surface_table = -1; + if (sna->render.vbo && + !kgem_bo_is_mappable(&sna->kgem, sna->render.vbo)) { + DBG(("%s: discarding unmappable vbo\n", __FUNCTION__)); + discard_vbo(sna); + } + sna->render.vertex_offset = 0; sna->render.nvertex_reloc = 0; sna->render.vb_id = 0; @@ -3837,7 +3844,7 @@ const char *gen7_render_init(struct sna *sna, const char *backend) sna->kgem.context_switch = gen6_render_context_switch; sna->kgem.retire = gen6_render_retire; - sna->kgem.expire = gen6_render_expire; + sna->kgem.expire = gen4_render_expire; #if !NO_COMPOSITE sna->render.composite = gen7_render_composite; @@ -3871,7 +3878,7 @@ const char *gen7_render_init(struct sna *sna, const char *backend) sna->render.clear = gen7_render_clear; #endif - sna->render.flush = gen6_render_flush; + sna->render.flush = gen4_render_flush; sna->render.reset = gen7_render_reset; sna->render.fini = gen7_render_fini; |