//----------------------------------------------------------------------------- void ProgramManager::releasePrograms(Pass* pass, TargetRenderState* renderState) { ProgramSet* programSet = renderState->getProgramSet(); pass->setVertexProgram(StringUtil::BLANK); pass->setFragmentProgram(StringUtil::BLANK); GpuProgramsMapIterator itVsGpuProgram = mVertexShaderMap.find(programSet->getGpuVertexProgram()->getName()); GpuProgramsMapIterator itFsGpuProgram = mFragmentShaderMap.find(programSet->getGpuFragmentProgram()->getName()); renderState->destroyProgramSet(); if (itVsGpuProgram != mVertexShaderMap.end()) { if (itVsGpuProgram->second.useCount() == ResourceGroupManager::RESOURCE_SYSTEM_NUM_REFERENCE_COUNTS + 1) { destroyGpuProgram(itVsGpuProgram->second); mVertexShaderMap.erase(itVsGpuProgram); } } if (itFsGpuProgram != mFragmentShaderMap.end()) { if (itFsGpuProgram->second.useCount() == ResourceGroupManager::RESOURCE_SYSTEM_NUM_REFERENCE_COUNTS + 1) { destroyGpuProgram(itFsGpuProgram->second); mFragmentShaderMap.erase(itFsGpuProgram); } } }
//----------------------------------------------------------------------------- void ProgramManager::flushGpuProgramsCache(GpuProgramsMap& gpuProgramsMap) { while (gpuProgramsMap.size() > 0) { GpuProgramsMapIterator it = gpuProgramsMap.begin(); destroyGpuProgram(it->second); gpuProgramsMap.erase(it); } }
//----------------------------------------------------------------------------- void ProgramManager::releasePrograms(Pass* pass, TargetRenderState* renderState) { ProgramSet* programSet = renderState->getProgramSet(); if (programSet != NULL) { pass->setVertexProgram(BLANKSTRING); pass->setFragmentProgram(BLANKSTRING); GpuProgramPtr vsProgram(programSet->getGpuProgram(GPT_VERTEX_PROGRAM)); GpuProgramPtr psProgram(programSet->getGpuProgram(GPT_FRAGMENT_PROGRAM)); GpuProgramsMapIterator itVsGpuProgram = !vsProgram ? mVertexShaderMap.end() : mVertexShaderMap.find(vsProgram->getName()); GpuProgramsMapIterator itFsGpuProgram = !psProgram ? mFragmentShaderMap.end() : mFragmentShaderMap.find(psProgram->getName()); renderState->destroyProgramSet(); if (itVsGpuProgram != mVertexShaderMap.end()) { if (itVsGpuProgram->second.use_count() == ResourceGroupManager::RESOURCE_SYSTEM_NUM_REFERENCE_COUNTS + 1) { destroyGpuProgram(itVsGpuProgram->second); mVertexShaderMap.erase(itVsGpuProgram); } } if (itFsGpuProgram != mFragmentShaderMap.end()) { if (itFsGpuProgram->second.use_count() == ResourceGroupManager::RESOURCE_SYSTEM_NUM_REFERENCE_COUNTS + 1) { destroyGpuProgram(itFsGpuProgram->second); mFragmentShaderMap.erase(itFsGpuProgram); } } } }