| 
									
										
										
										
											2009-07-28 21:32:10 +00:00
										 |  |  | // Copyright (C) 2003 Dolphin Project.
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // This program is free software: you can redistribute it and/or modify
 | 
					
						
							|  |  |  | // it under the terms of the GNU General Public License as published by
 | 
					
						
							|  |  |  | // the Free Software Foundation, version 2.0.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // This program is distributed in the hope that it will be useful,
 | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					
						
							|  |  |  | // GNU General Public License 2.0 for more details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // A copy of the GPL 2.0 should have been included with the program.
 | 
					
						
							|  |  |  | // If not, see http://www.gnu.org/licenses/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Official SVN repository and contact information can be found at
 | 
					
						
							|  |  |  | // http://code.google.com/p/dolphin-emu/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef GCOGL_VERTEXSHADER_H
 | 
					
						
							|  |  |  | #define GCOGL_VERTEXSHADER_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "XFMemory.h"
 | 
					
						
							| 
									
										
										
										
											2010-06-14 14:36:01 +00:00
										 |  |  | #include "VideoCommon.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define SHADER_POSMTX_ATTRIB 1
 | 
					
						
							| 
									
										
										
										
											2009-07-26 09:52:35 +00:00
										 |  |  | #define SHADER_NORM1_ATTRIB  6
 | 
					
						
							|  |  |  | #define SHADER_NORM2_ATTRIB  7
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // shader variables
 | 
					
						
							| 
									
										
										
										
											2009-07-26 09:52:35 +00:00
										 |  |  | #define I_POSNORMALMATRIX       "cpnmtx"
 | 
					
						
							|  |  |  | #define I_PROJECTION            "cproj"
 | 
					
						
							|  |  |  | #define I_MATERIALS             "cmtrl"
 | 
					
						
							|  |  |  | #define I_LIGHTS                "clights"
 | 
					
						
							|  |  |  | #define I_TEXMATRICES           "ctexmtx"
 | 
					
						
							|  |  |  | #define I_TRANSFORMMATRICES     "ctrmtx"
 | 
					
						
							|  |  |  | #define I_NORMALMATRICES        "cnmtx"
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | #define I_POSTTRANSFORMMATRICES "cpostmtx"
 | 
					
						
							| 
									
										
										
										
											2012-03-24 16:30:00 +01:00
										 |  |  | #define I_DEPTHPARAMS           "cDepth" // farZ, zRange, scaled viewport width, scaled viewport height
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-26 09:52:35 +00:00
										 |  |  | #define C_POSNORMALMATRIX        0
 | 
					
						
							|  |  |  | #define C_PROJECTION            (C_POSNORMALMATRIX + 6)
 | 
					
						
							|  |  |  | #define C_MATERIALS             (C_PROJECTION + 4)
 | 
					
						
							|  |  |  | #define C_LIGHTS                (C_MATERIALS + 4)
 | 
					
						
							|  |  |  | #define C_TEXMATRICES           (C_LIGHTS + 40)
 | 
					
						
							|  |  |  | #define C_TRANSFORMMATRICES     (C_TEXMATRICES + 24)
 | 
					
						
							|  |  |  | #define C_NORMALMATRICES        (C_TRANSFORMMATRICES + 64)
 | 
					
						
							|  |  |  | #define C_POSTTRANSFORMMATRICES (C_NORMALMATRICES + 32)
 | 
					
						
							| 
									
										
										
										
											2010-07-18 00:18:31 +00:00
										 |  |  | #define C_DEPTHPARAMS           (C_POSTTRANSFORMMATRICES + 64)
 | 
					
						
							|  |  |  | #define C_VENVCONST_END			(C_DEPTHPARAMS + 4)
 | 
					
						
							| 
									
										
										
										
											2008-12-26 10:43:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-04 00:47:45 +02:00
										 |  |  | template<bool safe> | 
					
						
							|  |  |  | class _VERTEXSHADERUID | 
					
						
							| 
									
										
										
										
											2008-12-26 10:43:18 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-09-04 00:47:45 +02:00
										 |  |  | #define NUM_VSUID_VALUES_SAFE 25
 | 
					
						
							| 
									
										
										
										
											2008-12-26 10:43:18 +00:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2011-09-04 00:47:45 +02:00
										 |  |  | 	u32 values[safe ? NUM_VSUID_VALUES_SAFE : 9]; | 
					
						
							| 
									
										
										
										
											2008-12-26 10:43:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-04 00:47:45 +02:00
										 |  |  | 	_VERTEXSHADERUID() | 
					
						
							| 
									
										
										
										
											2009-07-26 09:52:35 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2008-12-26 10:43:18 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-04 00:47:45 +02:00
										 |  |  | 	_VERTEXSHADERUID(const _VERTEXSHADERUID& r) | 
					
						
							| 
									
										
										
										
											2009-07-26 09:52:35 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2008-12-26 10:43:18 +00:00
										 |  |  | 		for (size_t i = 0; i < sizeof(values) / sizeof(u32); ++i)  | 
					
						
							|  |  |  | 			values[i] = r.values[i];  | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-26 09:52:35 +00:00
										 |  |  | 	int GetNumValues() const  | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2011-09-04 00:47:45 +02:00
										 |  |  | 		if (safe) return NUM_VSUID_VALUES_SAFE; | 
					
						
							|  |  |  | 		else return (((values[0] >> 23) & 0xf) * 3 + 3) / 4 + 3; // numTexGens*3/4+1
 | 
					
						
							| 
									
										
										
										
											2008-12-26 10:43:18 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-04 00:47:45 +02:00
										 |  |  | 	bool operator <(const _VERTEXSHADERUID& _Right) const | 
					
						
							| 
									
										
										
										
											2008-12-26 10:43:18 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		if (values[0] < _Right.values[0]) | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		else if (values[0] > _Right.values[0]) | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 		int N = GetNumValues(); | 
					
						
							| 
									
										
										
										
											2009-07-26 09:52:35 +00:00
										 |  |  | 		for (int i = 1; i < N; ++i)  | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2008-12-26 10:43:18 +00:00
										 |  |  | 			if (values[i] < _Right.values[i]) | 
					
						
							|  |  |  | 				return true; | 
					
						
							|  |  |  | 			else if (values[i] > _Right.values[i]) | 
					
						
							|  |  |  | 				return false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-04 00:47:45 +02:00
										 |  |  | 	bool operator ==(const _VERTEXSHADERUID& _Right) const | 
					
						
							| 
									
										
										
										
											2008-12-26 10:43:18 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		if (values[0] != _Right.values[0]) | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 		int N = GetNumValues(); | 
					
						
							| 
									
										
										
										
											2009-07-26 09:52:35 +00:00
										 |  |  | 		for (int i = 1; i < N; ++i) | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2008-12-26 10:43:18 +00:00
										 |  |  | 			if (values[i] != _Right.values[i]) | 
					
						
							|  |  |  | 				return false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2011-09-04 00:47:45 +02:00
										 |  |  | typedef _VERTEXSHADERUID<false> VERTEXSHADERUID; | 
					
						
							|  |  |  | typedef _VERTEXSHADERUID<true> VERTEXSHADERUIDSAFE; | 
					
						
							| 
									
										
										
										
											2010-06-14 03:09:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-12 15:49:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-17 17:44:09 +00:00
										 |  |  | // components is included in the uid.
 | 
					
						
							| 
									
										
										
										
											2011-03-14 09:38:29 +00:00
										 |  |  | char* GenerateVSOutputStruct(char* p, u32 components, API_TYPE api_type); | 
					
						
							| 
									
										
										
										
											2010-06-12 15:49:21 +00:00
										 |  |  | const char *GenerateVertexShaderCode(u32 components, API_TYPE api_type); | 
					
						
							| 
									
										
										
										
											2011-09-09 00:32:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-17 17:44:09 +00:00
										 |  |  | void GetVertexShaderId(VERTEXSHADERUID *uid, u32 components); | 
					
						
							| 
									
										
										
										
											2011-09-04 00:47:45 +02:00
										 |  |  | void GetSafeVertexShaderId(VERTEXSHADERUIDSAFE *uid, u32 components); | 
					
						
							| 
									
										
										
										
											2010-01-17 17:44:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-09 00:32:04 +02:00
										 |  |  | // Used to make sure that our optimized vertex shader IDs don't lose any possible shader code changes
 | 
					
						
							|  |  |  | void ValidateVertexShaderIDs(API_TYPE api, VERTEXSHADERUIDSAFE old_id, const std::string& old_code, u32 components); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-26 09:52:35 +00:00
										 |  |  | #endif // GCOGL_VERTEXSHADER_H
 |