Przeglądaj źródła

Cg works on DX but not on GL

Marko Pintera 13 lat temu
rodzic
commit
629eb64471

+ 2 - 2
CamelotClient/CamelotClient.cpp

@@ -13,8 +13,8 @@ using namespace CamelotEngine;
 
 
 int _tmain(int argc, _TCHAR* argv[])
 int _tmain(int argc, _TCHAR* argv[])
 {
 {
-	gApplication().startUp("CamelotGLRenderer.dll");
-	//gApplication().startUp("CamelotD3D9Renderer.dll");
+	//gApplication().startUp("CamelotGLRenderer.dll");
+	gApplication().startUp("CamelotD3D9Renderer.dll");
 
 
 	//RTTITypeBase* st = DbgSrlzTest::getRTTIStatic();
 	//RTTITypeBase* st = DbgSrlzTest::getRTTIStatic();
 
 

+ 2 - 0
CamelotD3D9Renderer/Include/CmD3D9RenderSystem.h

@@ -34,6 +34,7 @@ THE SOFTWARE.
 #include "CmRenderSystem.h"
 #include "CmRenderSystem.h"
 #include "CmRenderSystemCapabilities.h"
 #include "CmRenderSystemCapabilities.h"
 #include "CmD3D9Mappings.h"
 #include "CmD3D9Mappings.h"
+#include "CmCgProgramFactory.h"
 
 
 namespace CamelotEngine 
 namespace CamelotEngine 
 {
 {
@@ -112,6 +113,7 @@ namespace CamelotEngine
 		bool _checkMultiSampleQuality(D3DMULTISAMPLE_TYPE type, DWORD *outQuality, D3DFORMAT format, UINT adapterNum, D3DDEVTYPE deviceType, BOOL fullScreen);
 		bool _checkMultiSampleQuality(D3DMULTISAMPLE_TYPE type, DWORD *outQuality, D3DFORMAT format, UINT adapterNum, D3DDEVTYPE deviceType, BOOL fullScreen);
 		
 		
         D3D9HLSLProgramFactory* mHLSLProgramFactory;
         D3D9HLSLProgramFactory* mHLSLProgramFactory;
+		CgProgramFactory* mCgProgramFactory;
 		D3D9ResourceManager* mResourceManager;
 		D3D9ResourceManager* mResourceManager;
 		D3D9DeviceManager* mDeviceManager;
 		D3D9DeviceManager* mDeviceManager;
 
 

+ 1 - 1
CamelotD3D9Renderer/Source/CmD3D9HLSLProgram.cpp

@@ -109,7 +109,7 @@ namespace CamelotEngine {
 		case GPP_VS_2_a:
 		case GPP_VS_2_a:
 			return "vs_2_a";
 			return "vs_2_a";
 		case GPP_VS_3_0:
 		case GPP_VS_3_0:
-			return "vs_3_1";
+			return "vs_3_0";
 		case GPP_VS_4_0:
 		case GPP_VS_4_0:
 			return "vs_4_0";
 			return "vs_4_0";
 		default:
 		default:

+ 15 - 0
CamelotD3D9Renderer/Source/CmD3D9RenderSystem.cpp

@@ -70,6 +70,7 @@ namespace CamelotEngine
 		mActiveD3DDriver = NULL;	
 		mActiveD3DDriver = NULL;	
 		mUseNVPerfHUD = false;
 		mUseNVPerfHUD = false;
 		mHLSLProgramFactory = NULL;		
 		mHLSLProgramFactory = NULL;		
+		mCgProgramFactory = NULL;
 		mDeviceManager = NULL;	
 		mDeviceManager = NULL;	
 
 
 		// Create the resource manager.
 		// Create the resource manager.
@@ -116,6 +117,13 @@ namespace CamelotEngine
 			delete mHLSLProgramFactory;
 			delete mHLSLProgramFactory;
 			mHLSLProgramFactory = 0;
 			mHLSLProgramFactory = 0;
 		}
 		}
+
+		if(mCgProgramFactory)
+		{
+			HighLevelGpuProgramManager::instance().removeFactory(mCgProgramFactory);
+			delete mCgProgramFactory;
+			mCgProgramFactory = 0;
+		}
 		
 		
 		SAFE_RELEASE( mpD3D );
 		SAFE_RELEASE( mpD3D );
 		SAFE_DELETE ( mResourceManager );
 		SAFE_DELETE ( mResourceManager );
@@ -519,6 +527,9 @@ namespace CamelotEngine
 		// Create & register HLSL factory		
 		// Create & register HLSL factory		
 		mHLSLProgramFactory = new D3D9HLSLProgramFactory();
 		mHLSLProgramFactory = new D3D9HLSLProgramFactory();
 		
 		
+		// Create & register Cg factory		
+		mCgProgramFactory = new CgProgramFactory();
+
 		if( autoCreateWindow )
 		if( autoCreateWindow )
 		{
 		{
 			bool fullScreen;
 			bool fullScreen;
@@ -1032,6 +1043,7 @@ namespace CamelotEngine
 		{		
 		{		
 			mRealCapabilities = rsc;
 			mRealCapabilities = rsc;
 			mRealCapabilities->addShaderProfile("hlsl");
 			mRealCapabilities->addShaderProfile("hlsl");
+			mRealCapabilities->addShaderProfile("cg");
 
 
 			// if we are using custom capabilities, then 
 			// if we are using custom capabilities, then 
 			// mCurrentCapabilities has already been loaded
 			// mCurrentCapabilities has already been loaded
@@ -1308,6 +1320,9 @@ namespace CamelotEngine
 
 
 		if (caps->isShaderProfileSupported("hlsl"))
 		if (caps->isShaderProfileSupported("hlsl"))
 			HighLevelGpuProgramManager::instance().addFactory(mHLSLProgramFactory);
 			HighLevelGpuProgramManager::instance().addFactory(mHLSLProgramFactory);
+
+		if (caps->isShaderProfileSupported("cg"))
+			HighLevelGpuProgramManager::instance().addFactory(mCgProgramFactory);
 	}
 	}
 
 
 	//-----------------------------------------------------------------------
 	//-----------------------------------------------------------------------

+ 2 - 0
CamelotGLRenderer/Include/CmGLRenderSystem.h

@@ -34,6 +34,7 @@ THE SOFTWARE.
 #include "CmGLGpuProgramManager.h"
 #include "CmGLGpuProgramManager.h"
 #include "CmGLSLProgramFactory.h"
 #include "CmGLSLProgramFactory.h"
 #include "CmConfigOptionMap.h"
 #include "CmConfigOptionMap.h"
+#include "CmCgProgramFactory.h"
 #include "CmVector4.h"
 #include "CmVector4.h"
 
 
 namespace CamelotEngine {
 namespace CamelotEngine {
@@ -99,6 +100,7 @@ namespace CamelotEngine {
         bool mGLInitialised;
         bool mGLInitialised;
 
 
 		GLSLProgramFactory* mGLSLProgramFactory;
 		GLSLProgramFactory* mGLSLProgramFactory;
+		CgProgramFactory* mCgProgramFactory;
 
 
         unsigned short mCurrentLights;
         unsigned short mCurrentLights;
 
 

+ 19 - 0
CamelotGLRenderer/Source/CmGLRenderSystem.cpp

@@ -75,6 +75,7 @@ namespace CamelotEngine {
 	GLRenderSystem::GLRenderSystem()
 	GLRenderSystem::GLRenderSystem()
 		: mDepthWrite(true), mStencilMask(0xFFFFFFFF),
 		: mDepthWrite(true), mStencilMask(0xFFFFFFFF),
 		mGLSLProgramFactory(0),
 		mGLSLProgramFactory(0),
+		mCgProgramFactory(0),
 		mActiveTextureUnit(0)
 		mActiveTextureUnit(0)
 	{
 	{
 		size_t i;
 		size_t i;
@@ -392,6 +393,8 @@ namespace CamelotEngine {
 			}        
 			}        
 		}
 		}
 
 
+		rsc->addShaderProfile("cg");
+
 		// NFZ - Check if GLSL is supported
 		// NFZ - Check if GLSL is supported
 		if ( GLEW_VERSION_2_0 || 
 		if ( GLEW_VERSION_2_0 || 
 			(GLEW_ARB_shading_language_100 &&
 			(GLEW_ARB_shading_language_100 &&
@@ -739,6 +742,13 @@ namespace CamelotEngine {
 			HighLevelGpuProgramManager::instance().addFactory(mGLSLProgramFactory);
 			HighLevelGpuProgramManager::instance().addFactory(mGLSLProgramFactory);
 		}
 		}
 
 
+		if(caps->isShaderProfileSupported("cg"))
+		{
+			// NFZ - check for GLSL vertex and fragment shader support successful
+			mCgProgramFactory = new CgProgramFactory();
+			HighLevelGpuProgramManager::instance().addFactory(mCgProgramFactory);
+		}
+
 		if(caps->hasCapability(RSC_HWOCCLUSION))
 		if(caps->hasCapability(RSC_HWOCCLUSION))
 		{
 		{
 			if(caps->hasCapability(RSC_GL1_5_NOHWOCCLUSION))
 			if(caps->hasCapability(RSC_GL1_5_NOHWOCCLUSION))
@@ -847,6 +857,15 @@ namespace CamelotEngine {
 			mGLSLProgramFactory = 0;
 			mGLSLProgramFactory = 0;
 		}
 		}
 
 
+		// Deleting Cg GLSL program factory
+		if (mCgProgramFactory)
+		{
+			// Remove from manager safely
+			HighLevelGpuProgramManager::instance().removeFactory(mCgProgramFactory);
+			delete mCgProgramFactory;
+			mCgProgramFactory = 0;
+		}
+
 		// Deleting the GPU program manager and hardware buffer manager.  Has to be done before the mGLSupport->stop().
 		// Deleting the GPU program manager and hardware buffer manager.  Has to be done before the mGLSupport->stop().
 		GpuProgramManager::shutDown();
 		GpuProgramManager::shutDown();
 		HardwareBufferManager::shutDown();
 		HardwareBufferManager::shutDown();

+ 1 - 1
CamelotRenderer/Include/CmCgProgramFactory.h

@@ -35,7 +35,7 @@ THE SOFTWARE.
 namespace CamelotEngine
 namespace CamelotEngine
 {
 {
     /** Factory class for Cg programs. */
     /** Factory class for Cg programs. */
-    class CgProgramFactory : public HighLevelGpuProgramFactory
+    class CM_EXPORT CgProgramFactory : public HighLevelGpuProgramFactory
     {
     {
     protected:
     protected:
         CGcontext mCgContext;
         CGcontext mCgContext;

+ 48 - 20
CamelotRenderer/Source/CmApplication.cpp

@@ -45,7 +45,6 @@ namespace CamelotEngine
 		mViewport = mRenderWindow->addViewport();
 		mViewport = mRenderWindow->addViewport();
 
 
 		/////////////////// HLSL SHADERS //////////////////////////
 		/////////////////// HLSL SHADERS //////////////////////////
-
 		//String fragShaderCode = "sampler2D diffuseMap;			\
 		//String fragShaderCode = "sampler2D diffuseMap;			\
 		//	float4 ps_main(float2 uv : TEXCOORD0) : COLOR0		\
 		//	float4 ps_main(float2 uv : TEXCOORD0) : COLOR0		\
 		//{														\
 		//{														\
@@ -69,29 +68,58 @@ namespace CamelotEngine
 
 
 		//mVertProg =  HighLevelGpuProgramManager::instance().createProgram(vertShaderCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
 		//mVertProg =  HighLevelGpuProgramManager::instance().createProgram(vertShaderCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
 		//mVertProg->load();
 		//mVertProg->load();
+		
 
 
-		///////////////// GLSL SHADERS ////////////////////////////
-		String fragShaderCode = "uniform sampler2D tex; \
-									void main() \
-									  {\
-									  vec4 texColor = texture2D(tex,gl_TexCoord[0].st);\
-									  gl_FragColor = texColor; \
-									  }";
-
-		mFragProg = HighLevelGpuProgramManager::instance().createProgram(fragShaderCode, "main", "glsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
-		mFragProg->load();
 
 
-		// TODO - Ogres GLSL parsing requires some strict parameter naming, can that be avoided?
-		String vertShaderCode = "uniform mat4 matViewProjection; \
-									  attribute vec4 vertex; \
-								void main() \
-									  { \
-									  gl_TexCoord[0] = gl_MultiTexCoord0; \
-									  gl_Position = matViewProjection * vertex; \
-									  }";
+		/////////////////// CG SHADERS //////////////////////////
+		String fragShaderCode = "sampler2D diffuseMap;			\
+			float4 ps_main(float2 uv : TEXCOORD0) : COLOR0		\
+		{														\
+			float4 color = tex2D(diffuseMap, uv);				\
+			return color;										\
+		}";
 
 
-		mVertProg = HighLevelGpuProgramManager::instance().createProgram(vertShaderCode, "main", "glsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
+		mFragProg =  HighLevelGpuProgramManager::instance().createProgram(fragShaderCode, "ps_main", "cg", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
+		mFragProg->load();
+
+		String vertShaderCode = "float4x4 matViewProjection;	\
+			void vs_main(										\
+			float4 inPos : POSITION,							\
+			float2 uv : TEXCOORD0,								\
+			out float4 oPosition : POSITION,					\
+			out float2 oUv : TEXCOORD0)							\
+		{														\
+			oPosition = mul(matViewProjection, inPos);			\
+			oUv = uv;											\
+		}";
+
+		mVertProg =  HighLevelGpuProgramManager::instance().createProgram(vertShaderCode, "vs_main", "cg", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
 		mVertProg->load();
 		mVertProg->load();
+		
+
+
+		///////////////// GLSL SHADERS ////////////////////////////
+		//String fragShaderCode = "uniform sampler2D tex; \
+		//							void main() \
+		//							  {\
+		//							  vec4 texColor = texture2D(tex,gl_TexCoord[0].st);\
+		//							  gl_FragColor = texColor; \
+		//							  }";
+
+		//mFragProg = HighLevelGpuProgramManager::instance().createProgram(fragShaderCode, "main", "glsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
+		//mFragProg->load();
+
+		//// TODO - Ogres GLSL parsing requires some strict parameter naming, can that be avoided?
+		//String vertShaderCode = "uniform mat4 matViewProjection; \
+		//							  attribute vec4 vertex; \
+		//						void main() \
+		//							  { \
+		//							  gl_TexCoord[0] = gl_MultiTexCoord0; \
+		//							  gl_Position = matViewProjection * vertex; \
+		//							  }";
+
+		//mVertProg = HighLevelGpuProgramManager::instance().createProgram(vertShaderCode, "main", "glsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
+		//mVertProg->load();
 
 
 
 
 		// IMPORTER TEST
 		// IMPORTER TEST

+ 55 - 27
CamelotRenderer/Source/CmCgProgram.cpp

@@ -76,7 +76,7 @@ namespace CamelotEngine {
 			return GPP_VS_2_0;
 			return GPP_VS_2_0;
 		else if(profile == "vs_2_a")
 		else if(profile == "vs_2_a")
 			return GPP_VS_2_a;
 			return GPP_VS_2_a;
-		else if(profile == "vs_3_1")
+		else if(profile == "vs_3_0")
 			return GPP_VS_3_0;
 			return GPP_VS_3_0;
 		else if(profile == "vs_4_0")
 		else if(profile == "vs_4_0")
 			return GPP_VS_4_0;
 			return GPP_VS_4_0;
@@ -86,27 +86,62 @@ namespace CamelotEngine {
 		return GPP_NONE;
 		return GPP_NONE;
 	}
 	}
 
 
+	String gpuProgramProfileToCgProfile(GpuProgramProfile profile)
+	{
+		switch(profile)
+		{
+		case GPP_PS_1_1:
+			return "ps_1_1";
+		case GPP_PS_1_2:
+			return "ps_1_2";
+		case GPP_PS_1_3:
+			return "ps_1_3";
+		case GPP_PS_1_4:
+			return "ps_1_4";
+		case GPP_PS_2_0:
+			return "ps_2_0";
+		case GPP_PS_2_a:
+			return "ps_2_a";
+		case GPP_PS_2_b:
+			return "ps_2_b";
+		case GPP_PS_3_0:
+			return "ps_3_0";
+		case GPP_PS_4_0:
+			return "ps_4_0";
+		case GPP_VS_1_1:
+			return "vs_1_1";
+		case GPP_VS_2_0:
+			return "vs_2_0";
+		case GPP_VS_2_a:
+			return "vs_2_a";
+		case GPP_VS_3_0:
+			return "vs_3_0";
+		case GPP_VS_4_0:
+			return "vs_4_0";
+		default:
+			assert(false); // Unsupported profile
+		}
+
+		return "";
+	}
+
     //-----------------------------------------------------------------------
     //-----------------------------------------------------------------------
     void CgProgram::selectProfile(void)
     void CgProgram::selectProfile(void)
     {
     {
         mSelectedProfile.clear();
         mSelectedProfile.clear();
         mSelectedCgProfile = CG_PROFILE_UNKNOWN;
         mSelectedCgProfile = CG_PROFILE_UNKNOWN;
 
 
-        vector<String>::type::iterator i, iend;
-        iend = mProfiles.end();
-        GpuProgramManager& gpuMgr = GpuProgramManager::instance();
-        for (i = mProfiles.begin(); i != iend; ++i)
-        {
-            if (gpuMgr.isSyntaxSupported(*i))
-            {
-                mSelectedProfile = *i;
-                mSelectedCgProfile = cgGetProfile(mSelectedProfile.c_str());
-                // Check for errors
-                checkForCgError("CgProgram::selectProfile", 
-                    "Unable to find CG profile enum for program.", mCgContext);
-                break;
-            }
-        }
+		mSelectedProfile = gpuProgramProfileToCgProfile(mProfile);
+		GpuProgramManager& gpuMgr = GpuProgramManager::instance();
+		//if (gpuMgr.isSyntaxSupported(mSelectedProfile))
+		{
+			mSelectedCgProfile = cgGetProfile(mSelectedProfile.c_str());
+			// Check for errors
+			checkForCgError("CgProgram::selectProfile", 
+				"Unable to find CG profile enum for program.", mCgContext);
+		}
+		//else
+		//	mSelectedProfile.clear();
     }
     }
     //-----------------------------------------------------------------------
     //-----------------------------------------------------------------------
     void CgProgram::buildArgs(void)
     void CgProgram::buildArgs(void)
@@ -497,18 +532,11 @@ namespace CamelotEngine {
         if (mCompileError || !isRequiredCapabilitiesSupported())
         if (mCompileError || !isRequiredCapabilitiesSupported())
             return false;
             return false;
 
 
-		vector<String>::type::const_iterator i, iend;
-        iend = mProfiles.end();
-        // Check to see if any of the profiles are supported
-        for (i = mProfiles.begin(); i != iend; ++i)
-        {
-            if (GpuProgramManager::instance().isSyntaxSupported(*i))
-            {
-                return true;
-            }
-        }
-        return false;
+		//String selectedProfile = gpuProgramProfileToCgProfile(mProfile);
+		//if (GpuProgramManager::instance().isSyntaxSupported(selectedProfile))
+			return true;
 
 
+        return false;
     }
     }
     //-----------------------------------------------------------------------
     //-----------------------------------------------------------------------
     void CgProgram::setProfiles(const vector<String>::type& profiles)
     void CgProgram::setProfiles(const vector<String>::type& profiles)

+ 1 - 0
CamelotRenderer/TODO.txt

@@ -61,6 +61,7 @@ TOMORROW:
  - Add precompiled headers to all projects
  - Add precompiled headers to all projects
  - Make sure they include Exception & Log classes
  - Make sure they include Exception & Log classes
  - HLSL & Cg don't handle include files yet
  - HLSL & Cg don't handle include files yet
+ - Shader profiles need to be manually added. Check GpuProgramProfiler, and conversions from/to that type in HLSL/Cg files. Cg also needs some special profile setup.
 
 
 Other notes:
 Other notes:
  - Search for all remaining "TODO PORT" comments and fix them
  - Search for all remaining "TODO PORT" comments and fix them