int main(int argc, char **argv) { unsigned verbose = 0; FILE *fp = NULL; unsigned long n = 1000; unsigned i; boolean success; boolean single = FALSE; unsigned fpstate; util_cpu_detect(); fpstate = util_fpstate_get(); util_fpstate_set_denorms_to_zero(fpstate); if (!lp_build_init()) return 1; for(i = 1; i < argc; ++i) { if(strcmp(argv[i], "-v") == 0) ++verbose; else if(strcmp(argv[i], "-s") == 0) single = TRUE; else if(strcmp(argv[i], "-o") == 0) fp = fopen(argv[++i], "wt"); else n = atoi(argv[i]); } #ifdef DEBUG if (verbose >= 2) { gallivm_debug |= GALLIVM_DEBUG_IR; gallivm_debug |= GALLIVM_DEBUG_ASM; } #endif if (fp) { /* Warm up the caches */ test_some(0, NULL, 100); write_tsv_header(fp); } if (single) success = test_single(verbose, fp); else if (n) success = test_some(verbose, fp, n); else success = test_all(verbose, fp); if (fp) fclose(fp); return success ? 0 : 1; }
int main(int argc, char **argv) { unsigned verbose = 0; FILE *fp = NULL; unsigned long n = 1000; unsigned i; boolean success; boolean single = FALSE; struct gallivm_state *gallivm; for(i = 1; i < argc; ++i) { if(strcmp(argv[i], "-v") == 0) ++verbose; else if(strcmp(argv[i], "-s") == 0) single = TRUE; else if(strcmp(argv[i], "-o") == 0) fp = fopen(argv[++i], "wt"); else n = atoi(argv[i]); } lp_build_init(); gallivm = gallivm_create(); util_cpu_detect(); if(fp) { /* Warm up the caches */ test_some(gallivm, 0, NULL, 100); write_tsv_header(fp); } if (single) success = test_single(gallivm, verbose, fp); else if (n) success = test_some(gallivm, verbose, fp, n); else success = test_all(gallivm, verbose, fp); if(fp) fclose(fp); return success ? 0 : 1; }
PUBLIC struct pipe_screen * swr_create_screen_internal(struct sw_winsys *winsys) { struct swr_screen *screen = CALLOC_STRUCT(swr_screen); if (!screen) return NULL; if (!getenv("KNOB_MAX_PRIMS_PER_DRAW")) { g_GlobalKnobs.MAX_PRIMS_PER_DRAW.Value(49152); } if (!lp_build_init()) { FREE(screen); return NULL; } screen->winsys = winsys; screen->base.get_name = swr_get_name; screen->base.get_vendor = swr_get_vendor; screen->base.is_format_supported = swr_is_format_supported; screen->base.context_create = swr_create_context; screen->base.can_create_resource = swr_can_create_resource; screen->base.destroy = swr_destroy_screen; screen->base.get_param = swr_get_param; screen->base.get_shader_param = swr_get_shader_param; screen->base.get_paramf = swr_get_paramf; screen->base.resource_create = swr_resource_create; screen->base.resource_destroy = swr_resource_destroy; screen->base.flush_frontbuffer = swr_flush_frontbuffer; screen->hJitMgr = JitCreateContext(KNOB_SIMD_WIDTH, KNOB_ARCH_STR, "swr"); swr_fence_init(&screen->base); util_format_s3tc_init(); return &screen->base; }
/** * Allocate gallivm LLVM objects. * \return TRUE for success, FALSE for failure */ static boolean init_gallivm_state(struct gallivm_state *gallivm) { assert(!gallivm->context); assert(!gallivm->module); assert(!gallivm->provider); lp_build_init(); gallivm->context = LLVMContextCreate(); if (!gallivm->context) goto fail; gallivm->module = LLVMModuleCreateWithNameInContext("gallivm", gallivm->context); if (!gallivm->module) goto fail; gallivm->provider = LLVMCreateModuleProviderForExistingModule(gallivm->module); if (!gallivm->provider) goto fail; if (!GlobalEngine) { /* We can only create one LLVMExecutionEngine (w/ LLVM 2.6 anyway) */ enum LLVM_CodeGenOpt_Level optlevel; char *error = NULL; if (gallivm_debug & GALLIVM_DEBUG_NO_OPT) { optlevel = None; } else { optlevel = Default; } if (LLVMCreateJITCompiler(&GlobalEngine, gallivm->provider, (unsigned) optlevel, &error)) { _debug_printf("%s\n", error); LLVMDisposeMessage(error); goto fail; } #if defined(DEBUG) || defined(PROFILE) lp_register_oprofile_jit_event_listener(GlobalEngine); #endif } gallivm->engine = GlobalEngine; LLVMAddModuleProvider(gallivm->engine, gallivm->provider);//new gallivm->target = LLVMGetExecutionEngineTargetData(gallivm->engine); if (!gallivm->target) goto fail; if (!create_pass_manager(gallivm)) goto fail; gallivm->builder = LLVMCreateBuilderInContext(gallivm->context); if (!gallivm->builder) goto fail; return TRUE; fail: free_gallivm_state(gallivm); return FALSE; }
boolean lp_jit_screen_init(struct llvmpipe_screen *screen) { return lp_build_init(); }
/** * Allocate gallivm LLVM objects. * \return TRUE for success, FALSE for failure */ static boolean init_gallivm_state(struct gallivm_state *gallivm) { assert(!gallivm->context); assert(!gallivm->module); assert(!gallivm->provider); lp_build_init(); if (!gallivm_context) { gallivm_context = LLVMContextCreate(); } gallivm->context = gallivm_context; if (!gallivm->context) goto fail; gallivm->module = LLVMModuleCreateWithNameInContext("gallivm", gallivm->context); if (!gallivm->module) goto fail; gallivm->provider = LLVMCreateModuleProviderForExistingModule(gallivm->module); if (!gallivm->provider) goto fail; gallivm->builder = LLVMCreateBuilderInContext(gallivm->context); if (!gallivm->builder) goto fail; /* FIXME: MC-JIT only allows compiling one module at a time, and it must be * complete when MC-JIT is created. So defer the MC-JIT engine creation for * now. */ #if !USE_MCJIT if (!init_gallivm_engine(gallivm)) { goto fail; } #else /* * MC-JIT engine compiles the module immediately on creation, so we can't * obtain the target data from it. Instead we create a target data layout * from a string. * * The produced layout strings are not precisely the same, but should make * no difference for the kind of optimization passes we run. * * For reference this is the layout string on x64: * * e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-f128:128:128-n8:16:32:64 * * See also: * - http://llvm.org/docs/LangRef.html#datalayout */ { const unsigned pointer_size = 8 * sizeof(void *); char layout[512]; util_snprintf(layout, sizeof layout, "%c-p:%u:%u:%u-i64:64:64-a0:0:%u-s0:%u:%u", #ifdef PIPE_ARCH_LITTLE_ENDIAN 'e', // little endian #else 'E', // big endian #endif pointer_size, pointer_size, pointer_size, // pointer size, abi alignment, preferred alignment pointer_size, // aggregate preferred alignment pointer_size, pointer_size); // stack objects abi alignment, preferred alignment gallivm->target = LLVMCreateTargetData(layout); if (!gallivm->target) { return FALSE; } } #endif if (!create_pass_manager(gallivm)) goto fail; return TRUE; fail: free_gallivm_state(gallivm); return FALSE; }