Module: Mesa Branch: gallivm-call Commit: dffb2be7a2fbe799919a18e9133a4c8106e631ba URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=dffb2be7a2fbe799919a18e9133a4c8106e631ba
Author: José Fonseca <[email protected]> Date: Sat May 15 17:38:04 2010 +0100 gallivm: Tweak main function end detection. Mesa state tracker emits RET/END opcodes that don't follow the neither NV_gpu_program4 nor D3D semantics. For now just try to accommodate both Mesa's and standard usages here. --- src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c | 37 +++++++++++++++++----- 1 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c index 06d1fd1..c32617f 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c @@ -613,8 +613,6 @@ emit_end(struct lp_build_tgsi_soa_context *bld) { int i, j; - bld->main_block = LLVMGetInsertBlock(bld->base.builder); - /* if we had function calls we want to propagate the * outputs from the array to the values */ if (bld->has_function_calls) { @@ -658,6 +656,8 @@ emit_bgnsub(struct lp_build_tgsi_soa_context *bld) bld->addrs_array = addrs_ptr; bld->preds_array = preds_ptr; + bld->main_block = LLVMGetInsertBlock(bld->base.builder); + block = LLVMAppendBasicBlock(func, "entry"); LLVMPositionBuilderAtEnd(bld->base.builder, block); @@ -668,6 +668,12 @@ static void emit_endsub(struct lp_build_tgsi_soa_context *bld) { LLVMBuildRetVoid(bld->base.builder); + + /* we have to make sure we're at the end of the main block + * (which won't be the case if we had more than one TGSI function + * in the given shader) to let the calling function append + * whatever it needs at the end of the main function */ + LLVMPositionBuilderAtEnd(bld->base.builder, bld->main_block); } static LLVMValueRef @@ -1888,12 +1894,30 @@ emit_instruction( } break; + /* + * XXX: Mesa state tracker emits RET/END opcodes that don't follow the + * neither NV_gpu_program4 nor D3D semantics, so we try to accommodate both + * usages here. + */ + case TGSI_OPCODE_RET: - lp_exec_ret(&bld->exec_mask); + if (bld->main_block) { + /* Inside a sub-routine */ + lp_exec_ret(&bld->exec_mask); + } else { + /* Main function */ + emit_end(bld); + } + break; case TGSI_OPCODE_END: - emit_end(bld); + if (bld->main_block) { + /* After sub-routines */ + } else { + /* Main function */ + emit_end(bld); + } break; case TGSI_OPCODE_SSG: @@ -2288,11 +2312,6 @@ lp_build_tgsi_soa(LLVMBuilderRef builder, assert( 0 ); } } - /* we have to make sure we're at the end of the main block - * (which won't be the case if we had more than one TGSI function - * in the given shader) to let the calling function append - * whatever it needs at the end of the main function */ - LLVMPositionBuilderAtEnd(bld.base.builder, bld.main_block); if (0) { LLVMBasicBlockRef block = LLVMGetInsertBlock(builder); _______________________________________________ mesa-commit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-commit
