void InitializeGlobalPools() { TThreadGlobalPools* globalPools= static_cast<TThreadGlobalPools*>(OS_GetTLSValue(PoolIndex)); if (globalPools) return; void* poolMem, *threadPoolMem; TPoolAllocator *globalPoolAllocator; TThreadGlobalPools* threadData; if (_allocate) { poolMem = _allocate(sizeof(TPoolAllocator), _user_data); threadPoolMem = _allocate(sizeof(TThreadGlobalPools), _user_data); globalPoolAllocator = new (poolMem) TPoolAllocator(true); threadData = new (threadPoolMem) TThreadGlobalPools(); } else { globalPoolAllocator = new TPoolAllocator(true); threadData = new TThreadGlobalPools(); } threadData->globalPoolAllocator = globalPoolAllocator; OS_SetTLSValue(PoolIndex, threadData); globalPoolAllocator->push(); }
void InitializeGlobalPools() { TThreadGlobalPools* globalPools= static_cast<TThreadGlobalPools*>(OS_GetTLSValue(PoolIndex)); if (globalPools) return; TPoolAllocator *globalPoolAllocator = new TPoolAllocator(true); TThreadGlobalPools* threadData = new TThreadGlobalPools(); threadData->globalPoolAllocator = globalPoolAllocator; OS_SetTLSValue(PoolIndex, threadData); globalPoolAllocator->push(); }
int C_DECL Hlsl2Glsl_Initialize(GlobalAllocateFunction alloc, GlobalFreeFunction free, void* user) { TInfoSink infoSink; bool ret = true; SetGlobalAllocationAllocator(alloc, free, user); if (!InitProcess()) return 0; // This method should be called once per process. If its called by multiple threads, then // we need to have thread synchronization code around the initialization of per process // global pool allocator if (!PerProcessGPA) { TPoolAllocator *builtInPoolAllocator = new TPoolAllocator(true); builtInPoolAllocator->push(); TPoolAllocator* gPoolAllocator = &GlobalPoolAllocator; SetGlobalPoolAllocatorPtr(builtInPoolAllocator); TSymbolTable symTables[EShLangCount]; GenerateBuiltInSymbolTable(infoSink, symTables, EShLangCount); PerProcessGPA = new TPoolAllocator(true); PerProcessGPA->push(); SetGlobalPoolAllocatorPtr(PerProcessGPA); SymbolTables[EShLangVertex].copyTable(symTables[EShLangVertex]); SymbolTables[EShLangFragment].copyTable(symTables[EShLangFragment]); SetGlobalPoolAllocatorPtr(gPoolAllocator); symTables[EShLangVertex].pop(); symTables[EShLangFragment].pop(); initializeHLSLSupportLibrary(); builtInPoolAllocator->popAll(); delete builtInPoolAllocator; } return ret ? 1 : 0; }
// // Driver must call this first, once, before doing any other // compiler/linker operations. // int ShInitialize() { TInfoSink infoSink; bool ret = true; if (!InitProcess()) return 0; // This method should be called once per process. If its called by multiple threads, then // we need to have thread synchronization code around the initialization of per process // global pool allocator if (!PerProcessGPA) { TPoolAllocator *builtInPoolAllocator = new TPoolAllocator(true); builtInPoolAllocator->push(); TPoolAllocator* gPoolAllocator = &GlobalPoolAllocator; SetGlobalPoolAllocatorPtr(builtInPoolAllocator); TSymbolTable symTables[EShLangCount]; GenerateBuiltInSymbolTable(0, infoSink, symTables); PerProcessGPA = new TPoolAllocator(true); PerProcessGPA->push(); SetGlobalPoolAllocatorPtr(PerProcessGPA); SymbolTables[EShLangVertex].copyTable(symTables[EShLangVertex]); SymbolTables[EShLangFragment].copyTable(symTables[EShLangFragment]); SetGlobalPoolAllocatorPtr(gPoolAllocator); symTables[EShLangVertex].pop(); symTables[EShLangFragment].pop(); builtInPoolAllocator->popAll(); delete builtInPoolAllocator; } return ret ? 1 : 0; }
int C_DECL Hlsl2Glsl_Initialize() { TInfoSink infoSink; if (!InitProcess()) return 0; if (!PerProcessGPA) { TPoolAllocator *builtInPoolAllocator = new TPoolAllocator(); builtInPoolAllocator->push(); TPoolAllocator* gPoolAllocator = &GlobalPoolAllocator; SetGlobalPoolAllocatorPtr(builtInPoolAllocator); TSymbolTable symTables[EShLangCount]; GenerateBuiltInSymbolTable(infoSink, symTables, EShLangCount); PerProcessGPA = new TPoolAllocator(); PerProcessGPA->push(); SetGlobalPoolAllocatorPtr(PerProcessGPA); SymbolTables[EShLangVertex].copyTable(symTables[EShLangVertex]); SymbolTables[EShLangFragment].copyTable(symTables[EShLangFragment]); SetGlobalPoolAllocatorPtr(gPoolAllocator); symTables[EShLangVertex].pop(); symTables[EShLangFragment].pop(); builtInPoolAllocator->popAll(); delete builtInPoolAllocator; } return 1; }