//----------------------------------------------------------------------- void CgProgram::addMicrocodeToCache() { String name = String("CG_") + mName; size_t programStringSize = mProgramString.size(); uint32 sizeOfMicrocode = static_cast<uint32>( sizeof(size_t) + // size of mProgramString programStringSize + // microcode - mProgramString sizeof(size_t) + // size of param map mParametersMapSizeAsBuffer); // create microcode GpuProgramManager::Microcode newMicrocode = GpuProgramManager::getSingleton().createMicrocode(sizeOfMicrocode); newMicrocode->seek(0); // save size of string newMicrocode->write(&programStringSize, sizeof(size_t)); // save microcode newMicrocode->write(&mProgramString[0], programStringSize); // save size of param map size_t parametersMapSize = mParametersMap.size(); newMicrocode->write(¶metersMapSize, sizeof(size_t)); // save params GpuConstantDefinitionMap::const_iterator iter = mParametersMap.begin(); GpuConstantDefinitionMap::const_iterator iterE = mParametersMap.end(); for (; iter != iterE ; iter++) { const String & paramName = iter->first; const GpuConstantDefinition & def = iter->second; // save string size size_t stringSize = paramName.size(); newMicrocode->write(&stringSize, sizeof(size_t)); // save string newMicrocode->write(¶mName[0], stringSize); // save def newMicrocode->write(&def, sizeof(GpuConstantDefinition)); } if (mDelegate) { // save additional info required for delegating size_t samplerMapSize = mSamplerRegisterMap.size(); newMicrocode->write(&samplerMapSize, sizeof(size_t)); // save sampler register mapping map<String,int>::type::const_iterator sampRegister = mSamplerRegisterMap.begin(); map<String,int>::type::const_iterator sampRegisterE = mSamplerRegisterMap.end(); for (; sampRegister != sampRegisterE; ++sampRegister) { const String& paramName = sampRegister->first; int reg = sampRegister->second; size_t stringSize = paramName.size(); newMicrocode->write(&stringSize, sizeof(size_t)); newMicrocode->write(paramName.data(), stringSize); newMicrocode->write(®, sizeof(int)); } // save input/output operations type newMicrocode->write(&mInputOp, sizeof(CGenum)); newMicrocode->write(&mOutputOp, sizeof(CGenum)); } // add to the microcode to the cache GpuProgramManager::getSingleton().addMicrocodeToCache(name, newMicrocode); }