OSDN Git Service

radeonsi: skip drawing if the tess factor ring allocation fails
authorMarek Olšák <marek.olsak@amd.com>
Thu, 10 Sep 2015 16:27:53 +0000 (18:27 +0200)
committerEmil Velikov <emil.l.velikov@gmail.com>
Wed, 7 Oct 2015 13:36:30 +0000 (14:36 +0100)
Cc: 11.0 <mesa-stable@lists.freedesktop.org>
Acked-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
(cherry picked from commit 22d3ccf5a814bfc768e373d0c983a356f4e4efe3)
[Emil Velikov: Track tf_state over tf_ring. NULL check/FREE tf_state.]
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Conflicts:
src/gallium/drivers/radeonsi/si_state_shaders.c

src/gallium/drivers/radeonsi/si_state.h
src/gallium/drivers/radeonsi/si_state_draw.c
src/gallium/drivers/radeonsi/si_state_shaders.c

index 8fa65dc..6d9ac5f 100644 (file)
@@ -274,7 +274,7 @@ si_create_sampler_view_custom(struct pipe_context *ctx,
                              unsigned force_level);
 
 /* si_state_shader.c */
-void si_update_shaders(struct si_context *sctx);
+bool si_update_shaders(struct si_context *sctx);
 void si_init_shader_functions(struct si_context *sctx);
 
 /* si_state_draw.c */
index d54ed68..e0394cf 100644 (file)
@@ -760,8 +760,8 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
        else
                sctx->current_rast_prim = info->mode;
 
-       si_update_shaders(sctx);
-       if (!si_upload_shader_descriptors(sctx))
+       if (!si_update_shaders(sctx) ||
+           !si_upload_shader_descriptors(sctx))
                return;
 
        if (info->indexed) {
index ae8df5d..f21d1ef 100644 (file)
@@ -1238,11 +1238,20 @@ static void si_init_tess_factor_ring(struct si_context *sctx)
        assert(!sctx->tf_state);
        sctx->tf_state = CALLOC_STRUCT(si_pm4_state);
 
+       if (!sctx->tf_state)
+               return;
+
        sctx->tf_ring = pipe_buffer_create(sctx->b.b.screen, PIPE_BIND_CUSTOM,
                                           PIPE_USAGE_DEFAULT,
                                           32768 * sctx->screen->b.info.max_se);
+       if (!sctx->tf_ring) {
+               FREE(sctx->tf_state);
+               return;
+       }
+
        sctx->b.clear_buffer(&sctx->b.b, sctx->tf_ring, 0,
                             sctx->tf_ring->width0, fui(0), false);
+
        assert(((sctx->tf_ring->width0 / 4) & C_030938_SIZE) == 0);
 
        if (sctx->b.chip_class >= CIK) {
@@ -1346,15 +1355,18 @@ static void si_update_so(struct si_context *sctx, struct si_shader_selector *sha
        sctx->b.streamout.stride_in_dw = shader->so.stride;
 }
 
-void si_update_shaders(struct si_context *sctx)
+bool si_update_shaders(struct si_context *sctx)
 {
        struct pipe_context *ctx = (struct pipe_context*)sctx;
        struct si_state_rasterizer *rs = sctx->queued.named.rasterizer;
 
        /* Update stages before GS. */
        if (sctx->tes_shader) {
-               if (!sctx->tf_state)
+               if (!sctx->tf_state) {
                        si_init_tess_factor_ring(sctx);
+                       if (!sctx->tf_state)
+                               return false;
+               }
 
                /* VS as LS */
                si_shader_select(ctx, sctx->vs_shader);
@@ -1453,6 +1465,7 @@ void si_update_shaders(struct si_context *sctx)
                if (sctx->b.chip_class == SI)
                        si_mark_atom_dirty(sctx, &sctx->db_render_state);
        }
+       return true;
 }
 
 void si_init_shader_functions(struct si_context *sctx)