[Mesa-dev] [PATCH 2/2] radeonsi: stop command submission with PIPE_CONTEXT_LOSE_CONTEXT_ON_RESET only

Marek Olšák maraeo at gmail.com
Fri Nov 2 20:10:19 UTC 2018


From: Marek Olšák <marek.olsak at amd.com>

---
 src/gallium/drivers/r300/r300_context.c       | 2 +-
 src/gallium/drivers/r600/r600_pipe.c          | 2 +-
 src/gallium/drivers/r600/r600_pipe_common.c   | 2 +-
 src/gallium/drivers/r600/radeon_uvd.c         | 2 +-
 src/gallium/drivers/r600/radeon_vce.c         | 2 +-
 src/gallium/drivers/radeon/radeon_uvd.c       | 2 +-
 src/gallium/drivers/radeon/radeon_uvd_enc.c   | 2 +-
 src/gallium/drivers/radeon/radeon_vce.c       | 2 +-
 src/gallium/drivers/radeon/radeon_vcn_dec.c   | 2 +-
 src/gallium/drivers/radeon/radeon_vcn_enc.c   | 3 ++-
 src/gallium/drivers/radeon/radeon_winsys.h    | 9 +++++----
 src/gallium/drivers/radeonsi/si_pipe.c        | 7 ++++---
 src/gallium/winsys/amdgpu/drm/amdgpu_cs.c     | 6 ++++--
 src/gallium/winsys/amdgpu/drm/amdgpu_cs.h     | 1 +
 src/gallium/winsys/radeon/drm/radeon_drm_cs.c | 3 ++-
 15 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_context.c b/src/gallium/drivers/r300/r300_context.c
index 79bfdc53d25..0a68d37b806 100644
--- a/src/gallium/drivers/r300/r300_context.c
+++ b/src/gallium/drivers/r300/r300_context.c
@@ -386,21 +386,21 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
     r300->context.priv = priv;
 
     r300->context.destroy = r300_destroy_context;
 
     slab_create_child(&r300->pool_transfers, &r300screen->pool_transfers);
 
     r300->ctx = rws->ctx_create(rws);
     if (!r300->ctx)
         goto fail;
 
-    r300->cs = rws->cs_create(r300->ctx, RING_GFX, r300_flush_callback, r300);
+    r300->cs = rws->cs_create(r300->ctx, RING_GFX, r300_flush_callback, r300, false);
     if (r300->cs == NULL)
         goto fail;
 
     if (!r300screen->caps.has_tcl) {
         /* Create a Draw. This is used for SW TCL. */
         r300->draw = draw_create(&r300->context);
         if (r300->draw == NULL)
             goto fail;
         /* Enable our renderer. */
         draw_set_rasterize_stage(r300->draw, r300_draw_stage(r300));
diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
index 2680396c3d6..9e8501ff333 100644
--- a/src/gallium/drivers/r600/r600_pipe.c
+++ b/src/gallium/drivers/r600/r600_pipe.c
@@ -199,21 +199,21 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen,
 
 		rctx->append_fence = pipe_buffer_create(rctx->b.b.screen, PIPE_BIND_CUSTOM,
 							 PIPE_USAGE_DEFAULT, 32);
 		break;
 	default:
 		R600_ERR("Unsupported chip class %d.\n", rctx->b.chip_class);
 		goto fail;
 	}
 
 	rctx->b.gfx.cs = ws->cs_create(rctx->b.ctx, RING_GFX,
-				       r600_context_gfx_flush, rctx);
+				       r600_context_gfx_flush, rctx, false);
 	rctx->b.gfx.flush = r600_context_gfx_flush;
 
 	rctx->allocator_fetch_shader =
 		u_suballocator_create(&rctx->b.b, 64 * 1024,
 				      0, PIPE_USAGE_DEFAULT, 0, FALSE);
 	if (!rctx->allocator_fetch_shader)
 		goto fail;
 
 	rctx->isa = calloc(1, sizeof(struct r600_isa));
 	if (!rctx->isa || r600_isa_init(rctx, rctx->isa))
diff --git a/src/gallium/drivers/r600/r600_pipe_common.c b/src/gallium/drivers/r600/r600_pipe_common.c
index e7c645611d7..19ba09ae82a 100644
--- a/src/gallium/drivers/r600/r600_pipe_common.c
+++ b/src/gallium/drivers/r600/r600_pipe_common.c
@@ -708,21 +708,21 @@ bool r600_common_context_init(struct r600_common_context *rctx,
 	if (!rctx->b.const_uploader)
 		return false;
 
 	rctx->ctx = rctx->ws->ctx_create(rctx->ws);
 	if (!rctx->ctx)
 		return false;
 
 	if (rscreen->info.num_sdma_rings && !(rscreen->debug_flags & DBG_NO_ASYNC_DMA)) {
 		rctx->dma.cs = rctx->ws->cs_create(rctx->ctx, RING_DMA,
 						   r600_flush_dma_ring,
-						   rctx);
+						   rctx, false);
 		rctx->dma.flush = r600_flush_dma_ring;
 	}
 
 	return true;
 }
 
 void r600_common_context_cleanup(struct r600_common_context *rctx)
 {
 	if (rctx->query_result_shader)
 		rctx->b.delete_compute_state(&rctx->b, rctx->query_result_shader);
diff --git a/src/gallium/drivers/r600/radeon_uvd.c b/src/gallium/drivers/r600/radeon_uvd.c
index ac4f40e66c0..495a93dc55a 100644
--- a/src/gallium/drivers/r600/radeon_uvd.c
+++ b/src/gallium/drivers/r600/radeon_uvd.c
@@ -1325,21 +1325,21 @@ struct pipe_video_codec *ruvd_create_decoder(struct pipe_context *context,
 	dec->base.decode_macroblock = ruvd_decode_macroblock;
 	dec->base.decode_bitstream = ruvd_decode_bitstream;
 	dec->base.end_frame = ruvd_end_frame;
 	dec->base.flush = ruvd_flush;
 
 	dec->stream_type = profile2stream_type(dec, info.family);
 	dec->set_dtb = set_dtb;
 	dec->stream_handle = rvid_alloc_stream_handle();
 	dec->screen = context->screen;
 	dec->ws = ws;
-	dec->cs = ws->cs_create(rctx->ctx, RING_UVD, NULL, NULL);
+	dec->cs = ws->cs_create(rctx->ctx, RING_UVD, NULL, NULL, false);
 	if (!dec->cs) {
 		RVID_ERR("Can't get command submission context.\n");
 		goto error;
 	}
 
 	dec->fb_size = FB_BUFFER_SIZE;
 	bs_buf_size = width * height * (512 / (16 * 16));
 	for (i = 0; i < NUM_BUFFERS; ++i) {
 		unsigned msg_fb_it_size = FB_BUFFER_OFFSET + dec->fb_size;
 		STATIC_ASSERT(sizeof(struct ruvd_msg) <= FB_BUFFER_OFFSET);
diff --git a/src/gallium/drivers/r600/radeon_vce.c b/src/gallium/drivers/r600/radeon_vce.c
index e49e5aa8bde..60ba12a593a 100644
--- a/src/gallium/drivers/r600/radeon_vce.c
+++ b/src/gallium/drivers/r600/radeon_vce.c
@@ -421,21 +421,21 @@ struct pipe_video_codec *rvce_create_encoder(struct pipe_context *context,
 	enc->base.destroy = rvce_destroy;
 	enc->base.begin_frame = rvce_begin_frame;
 	enc->base.encode_bitstream = rvce_encode_bitstream;
 	enc->base.end_frame = rvce_end_frame;
 	enc->base.flush = rvce_flush;
 	enc->base.get_feedback = rvce_get_feedback;
 	enc->get_buffer = get_buffer;
 
 	enc->screen = context->screen;
 	enc->ws = ws;
-	enc->cs = ws->cs_create(rctx->ctx, RING_VCE, rvce_cs_flush, enc);
+	enc->cs = ws->cs_create(rctx->ctx, RING_VCE, rvce_cs_flush, enc, false);
 	if (!enc->cs) {
 		RVID_ERR("Can't get command submission context.\n");
 		goto error;
 	}
 
 	templat.buffer_format = PIPE_FORMAT_NV12;
 	templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420;
 	templat.width = enc->base.width;
 	templat.height = enc->base.height;
 	templat.interlaced = false;
diff --git a/src/gallium/drivers/radeon/radeon_uvd.c b/src/gallium/drivers/radeon/radeon_uvd.c
index 0f3b43de81a..62af1a311c2 100644
--- a/src/gallium/drivers/radeon/radeon_uvd.c
+++ b/src/gallium/drivers/radeon/radeon_uvd.c
@@ -1261,21 +1261,21 @@ struct pipe_video_codec *si_common_uvd_create_decoder(struct pipe_context *conte
 	dec->base.decode_macroblock = ruvd_decode_macroblock;
 	dec->base.decode_bitstream = ruvd_decode_bitstream;
 	dec->base.end_frame = ruvd_end_frame;
 	dec->base.flush = ruvd_flush;
 
 	dec->stream_type = profile2stream_type(dec, sctx->family);
 	dec->set_dtb = set_dtb;
 	dec->stream_handle = si_vid_alloc_stream_handle();
 	dec->screen = context->screen;
 	dec->ws = ws;
-	dec->cs = ws->cs_create(sctx->ctx, RING_UVD, NULL, NULL);
+	dec->cs = ws->cs_create(sctx->ctx, RING_UVD, NULL, NULL, false);
 	if (!dec->cs) {
 		RVID_ERR("Can't get command submission context.\n");
 		goto error;
 	}
 
 	for (i = 0; i < 16; i++)
 		 dec->render_pic_list[i] = NULL;
 	dec->fb_size = (sctx->family == CHIP_TONGA) ? FB_BUFFER_SIZE_TONGA :
 			FB_BUFFER_SIZE;
 	bs_buf_size = width * height * (512 / (16 * 16));
diff --git a/src/gallium/drivers/radeon/radeon_uvd_enc.c b/src/gallium/drivers/radeon/radeon_uvd_enc.c
index 521d08f304c..4384e5e1646 100644
--- a/src/gallium/drivers/radeon/radeon_uvd_enc.c
+++ b/src/gallium/drivers/radeon/radeon_uvd_enc.c
@@ -307,21 +307,21 @@ radeon_uvd_create_encoder(struct pipe_context *context,
    enc->base.begin_frame = radeon_uvd_enc_begin_frame;
    enc->base.encode_bitstream = radeon_uvd_enc_encode_bitstream;
    enc->base.end_frame = radeon_uvd_enc_end_frame;
    enc->base.flush = radeon_uvd_enc_flush;
    enc->base.get_feedback = radeon_uvd_enc_get_feedback;
    enc->get_buffer = get_buffer;
    enc->bits_in_shifter = 0;
    enc->screen = context->screen;
    enc->ws = ws;
    enc->cs =
-      ws->cs_create(sctx->ctx, RING_UVD_ENC, radeon_uvd_enc_cs_flush, enc);
+      ws->cs_create(sctx->ctx, RING_UVD_ENC, radeon_uvd_enc_cs_flush, enc, false);
 
    if (!enc->cs) {
       RVID_ERR("Can't get command submission context.\n");
       goto error;
    }
 
    struct rvid_buffer si;
    si_vid_create_buffer(enc->screen, &si, 128 * 1024, PIPE_USAGE_STAGING);
    enc->si = &si;
 
diff --git a/src/gallium/drivers/radeon/radeon_vce.c b/src/gallium/drivers/radeon/radeon_vce.c
index 8972253c7c5..310d1654b05 100644
--- a/src/gallium/drivers/radeon/radeon_vce.c
+++ b/src/gallium/drivers/radeon/radeon_vce.c
@@ -431,21 +431,21 @@ struct pipe_video_codec *si_vce_create_encoder(struct pipe_context *context,
 	enc->base.destroy = rvce_destroy;
 	enc->base.begin_frame = rvce_begin_frame;
 	enc->base.encode_bitstream = rvce_encode_bitstream;
 	enc->base.end_frame = rvce_end_frame;
 	enc->base.flush = rvce_flush;
 	enc->base.get_feedback = rvce_get_feedback;
 	enc->get_buffer = get_buffer;
 
 	enc->screen = context->screen;
 	enc->ws = ws;
-	enc->cs = ws->cs_create(sctx->ctx, RING_VCE, rvce_cs_flush, enc);
+	enc->cs = ws->cs_create(sctx->ctx, RING_VCE, rvce_cs_flush, enc, false);
 	if (!enc->cs) {
 		RVID_ERR("Can't get command submission context.\n");
 		goto error;
 	}
 
 	templat.buffer_format = PIPE_FORMAT_NV12;
 	templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420;
 	templat.width = enc->base.width;
 	templat.height = enc->base.height;
 	templat.interlaced = false;
diff --git a/src/gallium/drivers/radeon/radeon_vcn_dec.c b/src/gallium/drivers/radeon/radeon_vcn_dec.c
index 75ef4a5d401..1ee85ae3d3f 100644
--- a/src/gallium/drivers/radeon/radeon_vcn_dec.c
+++ b/src/gallium/drivers/radeon/radeon_vcn_dec.c
@@ -1500,21 +1500,21 @@ struct pipe_video_codec *radeon_create_decoder(struct pipe_context *context,
 	dec->base.begin_frame = radeon_dec_begin_frame;
 	dec->base.decode_macroblock = radeon_dec_decode_macroblock;
 	dec->base.decode_bitstream = radeon_dec_decode_bitstream;
 	dec->base.end_frame = radeon_dec_end_frame;
 	dec->base.flush = radeon_dec_flush;
 
 	dec->stream_type = stream_type;
 	dec->stream_handle = si_vid_alloc_stream_handle();
 	dec->screen = context->screen;
 	dec->ws = ws;
-	dec->cs = ws->cs_create(sctx->ctx, ring, NULL, NULL);
+	dec->cs = ws->cs_create(sctx->ctx, ring, NULL, NULL, false);
 	if (!dec->cs) {
 		RVID_ERR("Can't get command submission context.\n");
 		goto error;
 	}
 
 	for (i = 0; i < 16; i++)
 		dec->render_pic_list[i] = NULL;
 	bs_buf_size = width * height * (512 / (16 * 16));
 	for (i = 0; i < NUM_BUFFERS; ++i) {
 		unsigned msg_fb_it_probs_size = FB_BUFFER_OFFSET + FB_BUFFER_SIZE;
diff --git a/src/gallium/drivers/radeon/radeon_vcn_enc.c b/src/gallium/drivers/radeon/radeon_vcn_enc.c
index 8f9af73c664..e8676f6c721 100644
--- a/src/gallium/drivers/radeon/radeon_vcn_enc.c
+++ b/src/gallium/drivers/radeon/radeon_vcn_enc.c
@@ -279,21 +279,22 @@ struct pipe_video_codec *radeon_create_encoder(struct pipe_context *context,
 	enc->base.destroy = radeon_enc_destroy;
 	enc->base.begin_frame = radeon_enc_begin_frame;
 	enc->base.encode_bitstream = radeon_enc_encode_bitstream;
 	enc->base.end_frame = radeon_enc_end_frame;
 	enc->base.flush = radeon_enc_flush;
 	enc->base.get_feedback = radeon_enc_get_feedback;
 	enc->get_buffer = get_buffer;
 	enc->bits_in_shifter = 0;
 	enc->screen = context->screen;
 	enc->ws = ws;
-	enc->cs = ws->cs_create(sctx->ctx, RING_VCN_ENC, radeon_enc_cs_flush, enc);
+	enc->cs = ws->cs_create(sctx->ctx, RING_VCN_ENC, radeon_enc_cs_flush,
+				enc, false);
 
 	if (!enc->cs) {
 		RVID_ERR("Can't get command submission context.\n");
 		goto error;
 	}
 
 	struct rvid_buffer si;
 	si_vid_create_buffer(enc->screen, &si, 128 * 1024, PIPE_USAGE_STAGING);
 	enc->si = &si;
 
diff --git a/src/gallium/drivers/radeon/radeon_winsys.h b/src/gallium/drivers/radeon/radeon_winsys.h
index c6800808cbd..49f8bb279e5 100644
--- a/src/gallium/drivers/radeon/radeon_winsys.h
+++ b/src/gallium/drivers/radeon/radeon_winsys.h
@@ -457,24 +457,25 @@ struct radeon_winsys {
 
     /**
      * Create a command stream.
      *
      * \param ctx       The submission context
      * \param ring_type The ring type (GFX, DMA, UVD)
      * \param flush     Flush callback function associated with the command stream.
      * \param user      User pointer that will be passed to the flush callback.
      */
     struct radeon_cmdbuf *(*cs_create)(struct radeon_winsys_ctx *ctx,
-                                          enum ring_type ring_type,
-                                          void (*flush)(void *ctx, unsigned flags,
-							struct pipe_fence_handle **fence),
-                                          void *flush_ctx);
+                                       enum ring_type ring_type,
+                                       void (*flush)(void *ctx, unsigned flags,
+                                                     struct pipe_fence_handle **fence),
+                                       void *flush_ctx,
+                                       bool stop_exec_on_failure);
 
     /**
      * Destroy a command stream.
      *
      * \param cs        A command stream to destroy.
      */
     void (*cs_destroy)(struct radeon_cmdbuf *cs);
 
     /**
      * Add a buffer. Each buffer used by a CS must be added using this function.
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
index ba406bee922..c487ef43b52 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -366,20 +366,21 @@ static void si_set_context_param(struct pipe_context *ctx,
 	}
 }
 
 static struct pipe_context *si_create_context(struct pipe_screen *screen,
                                               unsigned flags)
 {
 	struct si_context *sctx = CALLOC_STRUCT(si_context);
 	struct si_screen* sscreen = (struct si_screen *)screen;
 	struct radeon_winsys *ws = sscreen->ws;
 	int shader, i;
+	bool stop_exec_on_failure = (flags & PIPE_CONTEXT_LOSE_CONTEXT_ON_RESET) != 0;
 
 	if (!sctx)
 		return NULL;
 
 	if (flags & PIPE_CONTEXT_DEBUG)
 		sscreen->record_llvm_ir = true; /* racy but not critical */
 
 	sctx->b.screen = screen; /* this must be set first */
 	sctx->b.priv = NULL;
 	sctx->b.destroy = si_destroy_context;
@@ -443,43 +444,43 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen,
 						       0, PIPE_USAGE_STAGING, 0);
 	if (!sctx->cached_gtt_allocator)
 		goto fail;
 
 	sctx->ctx = sctx->ws->ctx_create(sctx->ws);
 	if (!sctx->ctx)
 		goto fail;
 
 	if (sscreen->info.num_sdma_rings && !(sscreen->debug_flags & DBG(NO_ASYNC_DMA))) {
 		sctx->dma_cs = sctx->ws->cs_create(sctx->ctx, RING_DMA,
-						       (void*)si_flush_dma_cs,
-						       sctx);
+						   (void*)si_flush_dma_cs,
+						   sctx, stop_exec_on_failure);
 	}
 
 	si_init_buffer_functions(sctx);
 	si_init_clear_functions(sctx);
 	si_init_blit_functions(sctx);
 	si_init_compute_functions(sctx);
 	si_init_compute_blit_functions(sctx);
 	si_init_debug_functions(sctx);
 	si_init_msaa_functions(sctx);
 	si_init_streamout_functions(sctx);
 
 	if (sscreen->info.has_hw_decode) {
 		sctx->b.create_video_codec = si_uvd_create_decoder;
 		sctx->b.create_video_buffer = si_video_buffer_create;
 	} else {
 		sctx->b.create_video_codec = vl_create_decoder;
 		sctx->b.create_video_buffer = vl_video_buffer_create;
 	}
 
 	sctx->gfx_cs = ws->cs_create(sctx->ctx, RING_GFX,
-				       (void*)si_flush_gfx_cs, sctx);
+				     (void*)si_flush_gfx_cs, sctx, stop_exec_on_failure);
 
 	/* Border colors. */
 	sctx->border_color_table = malloc(SI_MAX_BORDER_COLORS *
 					  sizeof(*sctx->border_color_table));
 	if (!sctx->border_color_table)
 		goto fail;
 
 	sctx->border_color_buffer = r600_resource(
 		pipe_buffer_create(screen, 0, PIPE_USAGE_DEFAULT,
 				   SI_MAX_BORDER_COLORS *
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
index 5986810d4e9..5ec3b470a15 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
@@ -916,36 +916,38 @@ static void amdgpu_destroy_cs_context(struct amdgpu_cs_context *cs)
    FREE(cs->fence_dependencies);
    FREE(cs->syncobj_to_signal);
 }
 
 
 static struct radeon_cmdbuf *
 amdgpu_cs_create(struct radeon_winsys_ctx *rwctx,
                  enum ring_type ring_type,
                  void (*flush)(void *ctx, unsigned flags,
                                struct pipe_fence_handle **fence),
-                 void *flush_ctx)
+                 void *flush_ctx,
+                 bool stop_exec_on_failure)
 {
    struct amdgpu_ctx *ctx = (struct amdgpu_ctx*)rwctx;
    struct amdgpu_cs *cs;
 
    cs = CALLOC_STRUCT(amdgpu_cs);
    if (!cs) {
       return NULL;
    }
 
    util_queue_fence_init(&cs->flush_completed);
 
    cs->ctx = ctx;
    cs->flush_cs = flush;
    cs->flush_data = flush_ctx;
    cs->ring_type = ring_type;
+   cs->stop_exec_on_failure = stop_exec_on_failure;
 
    struct amdgpu_cs_fence_info fence_info;
    fence_info.handle = cs->ctx->user_fence_bo;
    fence_info.offset = cs->ring_type;
    amdgpu_cs_chunk_fence_info_to_data(&fence_info, (void*)&cs->fence_chunk);
 
    cs->main.ib_type = IB_MAIN;
 
    if (!amdgpu_init_cs_context(ctx->ws, &cs->csc1, ring_type)) {
       FREE(cs);
@@ -1388,21 +1390,21 @@ void amdgpu_cs_submit_ib(void *job, int thread_index)
          if (r) {
             fprintf(stderr, "amdgpu: buffer list creation failed (%d)\n", r);
             goto cleanup;
          }
       }
    }
 
    if (acs->ring_type == RING_GFX)
       ws->gfx_bo_list_counter += cs->num_real_buffers;
 
-   if (acs->ctx->num_rejected_cs) {
+   if (acs->stop_exec_on_failure && acs->ctx->num_rejected_cs) {
       r = -ECANCELED;
    } else {
       struct drm_amdgpu_cs_chunk chunks[6];
       unsigned num_chunks = 0;
 
       /* Convert from dwords to bytes. */
       cs->ib[IB_MAIN].ib_bytes *= 4;
 
       /* IB */
       chunks[num_chunks].chunk_id = AMDGPU_CHUNK_ID_IB;
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h
index 9f5a4fd991a..5de770c89e7 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h
@@ -122,20 +122,21 @@ struct amdgpu_cs {
    struct amdgpu_cs_context csc1;
    struct amdgpu_cs_context csc2;
    /* The currently-used CS. */
    struct amdgpu_cs_context *csc;
    /* The CS being currently-owned by the other thread. */
    struct amdgpu_cs_context *cst;
 
    /* Flush CS. */
    void (*flush_cs)(void *ctx, unsigned flags, struct pipe_fence_handle **fence);
    void *flush_data;
+   bool stop_exec_on_failure;
 
    struct util_queue_fence flush_completed;
    struct pipe_fence_handle *next_fence;
 };
 
 struct amdgpu_fence {
    struct pipe_reference reference;
    /* If ctx == NULL, this fence is syncobj-based. */
    uint32_t syncobj;
 
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
index 798be78504c..490c246d6e0 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
@@ -143,21 +143,22 @@ static void radeon_destroy_cs_context(struct radeon_cs_context *csc)
     FREE(csc->relocs_bo);
     FREE(csc->relocs);
 }
 
 
 static struct radeon_cmdbuf *
 radeon_drm_cs_create(struct radeon_winsys_ctx *ctx,
                      enum ring_type ring_type,
                      void (*flush)(void *ctx, unsigned flags,
                                    struct pipe_fence_handle **fence),
-                     void *flush_ctx)
+                     void *flush_ctx,
+                     bool stop_exec_on_failure)
 {
     struct radeon_drm_winsys *ws = (struct radeon_drm_winsys*)ctx;
     struct radeon_drm_cs *cs;
 
     cs = CALLOC_STRUCT(radeon_drm_cs);
     if (!cs) {
         return NULL;
     }
     util_queue_fence_init(&cs->flush_completed);
 
-- 
2.17.1



More information about the mesa-dev mailing list