//----------------------------------------------------------------------- void CgProgram::createLowLevelImpl(void) { if (mDelegate) return; // ignore any previous error if (mSelectedCgProfile != CG_PROFILE_UNKNOWN && !mCompileError) { if ( false // the hlsl 4 profiles are only supported in OGRE from CG 2.2 #if(CG_VERSION_NUM >= 2200) || mSelectedCgProfile == CG_PROFILE_VS_4_0 || mSelectedCgProfile == CG_PROFILE_PS_4_0 #endif #if(CG_VERSION_NUM >= 3000) || mSelectedCgProfile == CG_PROFILE_VS_5_0 || mSelectedCgProfile == CG_PROFILE_PS_5_0 || mSelectedCgProfile == CG_PROFILE_DS_5_0 || mSelectedCgProfile == CG_PROFILE_HS_5_0 #endif ) { // Create a high-level program, give it the same name as us HighLevelGpuProgramManager::getSingleton().remove(mName, mGroup); HighLevelGpuProgramPtr vp = HighLevelGpuProgramManager::getSingleton().createProgram( mName, mGroup, "hlsl", mType); vp->setSource(mProgramString); vp->setParameter("target", mSelectedProfile); vp->setParameter("entry_point", "main"); vp->load(); mAssemblerProgram = vp; } else { // Create a low-level program, give it the same name as us mAssemblerProgram = GpuProgramManager::getSingleton().createProgramFromString( mName, mGroup, mProgramString, mType, mSelectedProfile); } // Shader params need to be forwarded to low level implementation mAssemblerProgram->setAdjacencyInfoRequired(isAdjacencyInfoRequired()); } }
//----------------------------------------------------------------------- void CgProgram::createLowLevelImpl(void) { // ignore any previous error if (mSelectedCgProfile != CG_PROFILE_UNKNOWN && !mCompileError) { if ( false // the hlsl 4 profiles are only supported in OGRE from CG 2.2 #if(CG_VERSION_NUM >= 2200) || mSelectedCgProfile == CG_PROFILE_VS_4_0 || mSelectedCgProfile == CG_PROFILE_PS_4_0 #endif ) { // Create a high-level program, give it the same name as us HighLevelGpuProgramPtr vp = HighLevelGpuProgramManager::getSingleton().createProgram( mName, mGroup, "hlsl", mType); String hlslSourceFromCg = cgGetProgramString(mCgProgram, CG_COMPILED_PROGRAM); vp->setSource(hlslSourceFromCg); vp->setParameter("target", mSelectedProfile); vp->setParameter("entry_point", "main"); vp->load(); mAssemblerProgram = vp; } else { String shaderAssemblerCode = cgGetProgramString(mCgProgram, CG_COMPILED_PROGRAM); if (mType == GPT_FRAGMENT_PROGRAM) { //HACK : http://developer.nvidia.com/forums/index.php?showtopic=1063&pid=2378&mode=threaded&start=#entry2378 //Still happens in CG 2.2. Remove hack when fixed. shaderAssemblerCode = StringUtil::replaceAll(shaderAssemblerCode, "oDepth.z", "oDepth"); } // Create a low-level program, give it the same name as us mAssemblerProgram = GpuProgramManager::getSingleton().createProgramFromString( mName, mGroup, shaderAssemblerCode, mType, mSelectedProfile); } // Shader params need to be forwarded to low level implementation mAssemblerProgram->setAdjacencyInfoRequired(isAdjacencyInfoRequired()); } }
//----------------------------------------------------------------------- void CgProgram::loadFromSource(void) { selectProfile(); if ( GpuProgramManager::getSingleton().isMicrocodeAvailableInCache(String("CG_") + mName) ) { getMicrocodeFromCache(); } else { compileMicrocode(); } if (mDelegate) { mDelegate->setSource(mProgramString); mDelegate->setAdjacencyInfoRequired(isAdjacencyInfoRequired()); if (mSelectedCgProfile == CG_PROFILE_GLSLG) { // need to set input and output operations if (mInputOp == CG_POINT) { mDelegate->setParameter("input_operation_type", "point_list"); } else if (mInputOp == CG_LINE) { mDelegate->setParameter("input_operation_type", "line_strip"); } else if (mInputOp == CG_LINE_ADJ) { mDelegate->setParameter("input_operation_type", "line_strip"); mDelegate->setAdjacencyInfoRequired(true); } else if (mInputOp == CG_TRIANGLE) { mDelegate->setParameter("input_operation_type", "triangle_strip"); } else if (mInputOp == CG_TRIANGLE_ADJ) { mDelegate->setParameter("input_operation_type", "triangle_strip"); mDelegate->setAdjacencyInfoRequired(true); } if (mOutputOp == CG_POINT_OUT) mDelegate->setParameter("output_operation_type", "point_list"); else if (mOutputOp == CG_LINE_OUT) mDelegate->setParameter("output_operation_type", "line_strip"); else if (mOutputOp == CG_TRIANGLE_OUT) mDelegate->setParameter("output_operation_type", "triangle_strip"); } if (getHighLevelLanguage() == "glsl") { // for GLSL, also ensure we explicitly bind samplers to their register // otherwise, GLSL will assign them in the order first used, which is // not what we want. GpuProgramParametersSharedPtr params = mDelegate->getDefaultParameters(); for (map<String,int>::type::iterator i = mSamplerRegisterMap.begin(); i != mSamplerRegisterMap.end(); ++i) params->setNamedConstant(i->first, i->second); } mDelegate->load(); } }
//----------------------------------------------------------------------- void GLSLProgram::createLowLevelImpl(void) { mAssemblerProgram = GpuProgramPtr(OGRE_NEW GLSLGpuProgram( this )); // Shader params need to be forwarded to low level implementation mAssemblerProgram->setAdjacencyInfoRequired(isAdjacencyInfoRequired()); }