[Mesa-dev] [PATCH 19/23] radeonsi: move shader debug helpers out of r600_pipe_common.c

Marek Olšák maraeo at gmail.com
Tue Nov 28 21:38:47 UTC 2017


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

---
 src/gallium/drivers/radeon/r600_pipe_common.c       | 11 -----------
 src/gallium/drivers/radeon/r600_pipe_common.h       |  4 ----
 src/gallium/drivers/radeonsi/si_compute.c           |  2 +-
 src/gallium/drivers/radeonsi/si_pipe.h              | 13 +++++++++++++
 src/gallium/drivers/radeonsi/si_shader.c            | 14 +++++++-------
 src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c |  4 ++--
 src/gallium/drivers/radeonsi/si_state_shaders.c     |  2 +-
 7 files changed, 24 insertions(+), 26 deletions(-)

diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c
index 069594f..e8ee792 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.c
+++ b/src/gallium/drivers/radeon/r600_pipe_common.c
@@ -503,31 +503,20 @@ void si_common_context_cleanup(struct r600_common_context *rctx)
 	slab_destroy_child(&rctx->pool_transfers_unsync);
 
 	if (rctx->allocator_zeroed_memory) {
 		u_suballocator_destroy(rctx->allocator_zeroed_memory);
 	}
 	rctx->ws->fence_reference(&rctx->last_gfx_fence, NULL);
 	rctx->ws->fence_reference(&rctx->last_sdma_fence, NULL);
 	r600_resource_reference(&rctx->eop_bug_scratch, NULL);
 }
 
-bool si_can_dump_shader(struct r600_common_screen *rscreen,
-			unsigned processor)
-{
-	return rscreen->debug_flags & (1 << processor);
-}
-
-bool si_extra_shader_checks(struct r600_common_screen *rscreen, unsigned processor)
-{
-	return (rscreen->debug_flags & DBG(CHECK_IR)) ||
-	       si_can_dump_shader(rscreen, processor);
-}
 
 void si_screen_clear_buffer(struct r600_common_screen *rscreen, struct pipe_resource *dst,
 			    uint64_t offset, uint64_t size, unsigned value)
 {
 	struct r600_common_context *rctx = (struct r600_common_context*)rscreen->aux_context;
 
 	mtx_lock(&rscreen->aux_context_lock);
 	rctx->dma_clear_buffer(&rctx->b, dst, offset, size, value);
 	rscreen->aux_context->flush(rscreen->aux_context, NULL, 0);
 	mtx_unlock(&rscreen->aux_context_lock);
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h
index 2f8dc90..dea1d6f 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.h
+++ b/src/gallium/drivers/radeon/r600_pipe_common.h
@@ -636,24 +636,20 @@ void si_gfx_write_event_eop(struct r600_common_context *ctx,
 			    unsigned data_sel,
 			    struct r600_resource *buf, uint64_t va,
 			    uint32_t new_fence, unsigned query_type);
 unsigned si_gfx_write_fence_dwords(struct r600_common_screen *screen);
 void si_gfx_wait_fence(struct r600_common_context *ctx,
 		       uint64_t va, uint32_t ref, uint32_t mask);
 bool si_common_context_init(struct r600_common_context *rctx,
 			    struct r600_common_screen *rscreen,
 			    unsigned context_flags);
 void si_common_context_cleanup(struct r600_common_context *rctx);
-bool si_can_dump_shader(struct r600_common_screen *rscreen,
-			unsigned processor);
-bool si_extra_shader_checks(struct r600_common_screen *rscreen,
-			    unsigned processor);
 void si_screen_clear_buffer(struct r600_common_screen *rscreen, struct pipe_resource *dst,
 			    uint64_t offset, uint64_t size, unsigned value);
 void si_need_dma_space(struct r600_common_context *ctx, unsigned num_dw,
 		       struct r600_resource *dst, struct r600_resource *src);
 void si_save_cs(struct radeon_winsys *ws, struct radeon_winsys_cs *cs,
 		struct radeon_saved_cs *saved, bool get_buffer_list);
 void si_clear_saved_cs(struct radeon_saved_cs *saved);
 bool si_check_device_reset(struct r600_common_context *rctx);
 
 /* r600_gpu_load.c */
diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c
index dc40989..f3dce65 100644
--- a/src/gallium/drivers/radeonsi/si_compute.c
+++ b/src/gallium/drivers/radeonsi/si_compute.c
@@ -171,21 +171,21 @@ static void *si_create_compute_state(
 
 		program->compiler_ctx_state.debug = sctx->debug;
 		program->compiler_ctx_state.is_debug_context = sctx->is_debug;
 		p_atomic_inc(&sscreen->b.num_shaders_created);
 		util_queue_fence_init(&program->ready);
 
 		struct util_async_debug_callback async_debug;
 		bool wait =
 			(sctx->debug.debug_message && !sctx->debug.async) ||
 			sctx->is_debug ||
-			si_can_dump_shader(&sscreen->b, PIPE_SHADER_COMPUTE);
+			si_can_dump_shader(sscreen, PIPE_SHADER_COMPUTE);
 
 		if (wait) {
 			u_async_debug_init(&async_debug);
 			program->compiler_ctx_state.debug = async_debug.base;
 		}
 
 		util_queue_add_job(&sscreen->shader_compiler_queue,
 				   program, &program->ready,
 				   si_create_compute_state_async, NULL);
 
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
index 3131a8b..0c16cfb 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -743,20 +743,33 @@ static inline struct tgsi_shader_info *si_get_vs_info(struct si_context *sctx)
 
 static inline struct si_shader* si_get_vs_state(struct si_context *sctx)
 {
 	if (sctx->gs_shader.cso)
 		return sctx->gs_shader.cso->gs_copy_shader;
 
 	struct si_shader_ctx_state *vs = si_get_vs(sctx);
 	return vs->current ? vs->current : NULL;
 }
 
+static inline bool si_can_dump_shader(struct si_screen *sscreen,
+				      unsigned processor)
+{
+	return sscreen->b.debug_flags & (1 << processor);
+}
+
+static inline bool si_extra_shader_checks(struct si_screen *sscreen,
+					  unsigned processor)
+{
+	return (sscreen->b.debug_flags & DBG(CHECK_IR)) ||
+	       si_can_dump_shader(sscreen, processor);
+}
+
 static inline bool si_get_strmout_en(struct si_context *sctx)
 {
 	return sctx->streamout.streamout_enabled ||
 	       sctx->streamout.prims_gen_query_enabled;
 }
 
 static inline unsigned
 si_optimal_tcc_alignment(struct si_context *sctx, unsigned upload_size)
 {
 	unsigned alignment, tcc_cache_line_size;
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index 0340133..e942d34 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -5164,21 +5164,21 @@ static void si_shader_dump_stats(struct si_screen *sscreen,
 
 	if (conf->num_vgprs)
 		max_simd_waves = MIN2(max_simd_waves, 256 / conf->num_vgprs);
 
 	/* LDS is 64KB per CU (4 SIMDs), which is 16KB per SIMD (usage above
 	 * 16KB makes some SIMDs unoccupied). */
 	if (lds_per_wave)
 		max_simd_waves = MIN2(max_simd_waves, 16384 / lds_per_wave);
 
 	if (!check_debug_option ||
-	    si_can_dump_shader(&sscreen->b, processor)) {
+	    si_can_dump_shader(sscreen, processor)) {
 		if (processor == PIPE_SHADER_FRAGMENT) {
 			fprintf(file, "*** SHADER CONFIG ***\n"
 				"SPI_PS_INPUT_ADDR = 0x%04x\n"
 				"SPI_PS_INPUT_ENA  = 0x%04x\n",
 				conf->spi_ps_input_addr, conf->spi_ps_input_ena);
 		}
 
 		fprintf(file, "*** SHADER STATS ***\n"
 			"SGPRS: %d\n"
 			"VGPRS: %d\n"
@@ -5236,38 +5236,38 @@ const char *si_get_shader_name(const struct si_shader *shader, unsigned processo
 	default:
 		return "Unknown Shader";
 	}
 }
 
 void si_shader_dump(struct si_screen *sscreen, const struct si_shader *shader,
 		    struct pipe_debug_callback *debug, unsigned processor,
 		    FILE *file, bool check_debug_option)
 {
 	if (!check_debug_option ||
-	    si_can_dump_shader(&sscreen->b, processor))
+	    si_can_dump_shader(sscreen, processor))
 		si_dump_shader_key(processor, shader, file);
 
 	if (!check_debug_option && shader->binary.llvm_ir_string) {
 		if (shader->previous_stage &&
 		    shader->previous_stage->binary.llvm_ir_string) {
 			fprintf(file, "\n%s - previous stage - LLVM IR:\n\n",
 				si_get_shader_name(shader, processor));
 			fprintf(file, "%s\n", shader->previous_stage->binary.llvm_ir_string);
 		}
 
 		fprintf(file, "\n%s - main shader part - LLVM IR:\n\n",
 			si_get_shader_name(shader, processor));
 		fprintf(file, "%s\n", shader->binary.llvm_ir_string);
 	}
 
 	if (!check_debug_option ||
-	    (si_can_dump_shader(&sscreen->b, processor) &&
+	    (si_can_dump_shader(sscreen, processor) &&
 	     !(sscreen->b.debug_flags & DBG(NO_ASM)))) {
 		fprintf(file, "\n%s:\n", si_get_shader_name(shader, processor));
 
 		if (shader->prolog)
 			si_shader_dump_disassembly(&shader->prolog->binary,
 						   debug, "prolog", file);
 		if (shader->previous_stage)
 			si_shader_dump_disassembly(&shader->previous_stage->binary,
 						   debug, "previous stage", file);
 		if (shader->prolog2)
@@ -5291,21 +5291,21 @@ static int si_compile_llvm(struct si_screen *sscreen,
 			   struct si_shader_config *conf,
 			   LLVMTargetMachineRef tm,
 			   LLVMModuleRef mod,
 			   struct pipe_debug_callback *debug,
 			   unsigned processor,
 			   const char *name)
 {
 	int r = 0;
 	unsigned count = p_atomic_inc_return(&sscreen->b.num_compilations);
 
-	if (si_can_dump_shader(&sscreen->b, processor)) {
+	if (si_can_dump_shader(sscreen, processor)) {
 		fprintf(stderr, "radeonsi: Compiling shader %d\n", count);
 
 		if (!(sscreen->b.debug_flags & (DBG(NO_IR) | DBG(PREOPT_IR)))) {
 			fprintf(stderr, "%s LLVM IR:\n\n", name);
 			ac_dump_module(mod);
 			fprintf(stderr, "\n");
 		}
 	}
 
 	if (sscreen->record_llvm_ir) {
@@ -5491,21 +5491,21 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
 
 	ctx.type = PIPE_SHADER_GEOMETRY; /* override for shader dumping */
 	si_llvm_optimize_module(&ctx);
 
 	r = si_compile_llvm(sscreen, &ctx.shader->binary,
 			    &ctx.shader->config, ctx.tm,
 			    ctx.gallivm.module,
 			    debug, PIPE_SHADER_GEOMETRY,
 			    "GS Copy Shader");
 	if (!r) {
-		if (si_can_dump_shader(&sscreen->b, PIPE_SHADER_GEOMETRY))
+		if (si_can_dump_shader(sscreen, PIPE_SHADER_GEOMETRY))
 			fprintf(stderr, "GS Copy Shader:\n");
 		si_shader_dump(sscreen, ctx.shader, debug,
 			       PIPE_SHADER_GEOMETRY, stderr, true);
 		r = si_shader_binary_upload(sscreen, ctx.shader);
 	}
 
 	si_llvm_dispose(&ctx);
 
 	FREE(outputs);
 
@@ -6409,21 +6409,21 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
 			   struct si_shader *shader,
 			   bool is_monolithic,
 			   struct pipe_debug_callback *debug)
 {
 	struct si_shader_selector *sel = shader->selector;
 	struct si_shader_context ctx;
 	int r = -1;
 
 	/* Dump TGSI code before doing TGSI->LLVM conversion in case the
 	 * conversion fails. */
-	if (si_can_dump_shader(&sscreen->b, sel->info.processor) &&
+	if (si_can_dump_shader(sscreen, sel->info.processor) &&
 	    !(sscreen->b.debug_flags & DBG(NO_TGSI))) {
 		if (sel->tokens)
 			tgsi_dump(sel->tokens, 0);
 		else
 			nir_print_shader(sel->nir, stderr);
 		si_dump_streamout(&sel->so);
 	}
 
 	si_init_shader_ctx(&ctx, sscreen, tm);
 	si_llvm_context_set_tgsi(&ctx, shader);
@@ -6618,21 +6618,21 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
 		si_build_wrapper_function(&ctx, parts, need_prolog ? 3 : 2,
 					  need_prolog ? 1 : 0, 0);
 	}
 
 	si_llvm_optimize_module(&ctx);
 
 	/* Post-optimization transformations and analysis. */
 	si_optimize_vs_outputs(&ctx);
 
 	if ((debug && debug->debug_message) ||
-	    si_can_dump_shader(&sscreen->b, ctx.type))
+	    si_can_dump_shader(sscreen, ctx.type))
 		si_count_scratch_private_memory(&ctx);
 
 	/* Compile to bytecode. */
 	r = si_compile_llvm(sscreen, &shader->binary, &shader->config, tm,
 			    ctx.gallivm.module, debug, ctx.type, "TGSI shader");
 	si_llvm_dispose(&ctx);
 	if (r) {
 		fprintf(stderr, "LLVM failed to compile shader\n");
 		return r;
 	}
diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
index 59d0260..9c1ea91 100644
--- a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
+++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
@@ -1352,30 +1352,30 @@ void si_llvm_create_func(struct si_shader_context *ctx,
 }
 
 void si_llvm_optimize_module(struct si_shader_context *ctx)
 {
 	struct gallivm_state *gallivm = &ctx->gallivm;
 	const char *triple = LLVMGetTarget(gallivm->module);
 	LLVMTargetLibraryInfoRef target_library_info;
 
 	/* Dump LLVM IR before any optimization passes */
 	if (ctx->screen->b.debug_flags & DBG(PREOPT_IR) &&
-	    si_can_dump_shader(&ctx->screen->b, ctx->type))
+	    si_can_dump_shader(ctx->screen, ctx->type))
 		LLVMDumpModule(ctx->gallivm.module);
 
 	/* Create the pass manager */
 	gallivm->passmgr = LLVMCreatePassManager();
 
 	target_library_info = gallivm_create_target_library_info(triple);
 	LLVMAddTargetLibraryInfo(target_library_info, gallivm->passmgr);
 
-	if (si_extra_shader_checks(&ctx->screen->b, ctx->type))
+	if (si_extra_shader_checks(ctx->screen, ctx->type))
 		LLVMAddVerifierPass(gallivm->passmgr);
 
 	LLVMAddAlwaysInlinerPass(gallivm->passmgr);
 
 	/* This pass should eliminate all the load and store instructions */
 	LLVMAddPromoteMemoryToRegisterPass(gallivm->passmgr);
 
 	/* Add some optimization passes */
 	LLVMAddScalarReplAggregatesPass(gallivm->passmgr);
 	LLVMAddLICMPass(gallivm->passmgr);
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
index 513e30b..5395530 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -2265,21 +2265,21 @@ static void *si_create_shader_selector(struct pipe_context *ctx,
 		sel->db_shader_control |= S_02880C_Z_ORDER(V_02880C_EARLY_Z_THEN_LATE_Z);
 	}
 
 	(void) mtx_init(&sel->mutex, mtx_plain);
 	util_queue_fence_init(&sel->ready);
 
 	struct util_async_debug_callback async_debug;
 	bool wait =
 		(sctx->debug.debug_message && !sctx->debug.async) ||
 		sctx->is_debug ||
-		si_can_dump_shader(&sscreen->b, sel->info.processor);
+		si_can_dump_shader(sscreen, sel->info.processor);
 
 	if (wait) {
 		u_async_debug_init(&async_debug);
 		sel->compiler_ctx_state.debug = async_debug.base;
 	}
 
 	util_queue_add_job(&sscreen->shader_compiler_queue, sel,
 			   &sel->ready, si_init_shader_selector_async,
 			   NULL);
 
-- 
2.7.4



More information about the mesa-dev mailing list