2009-07-28 21:32:10 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Copyright (C) 2003 Dolphin Project.
 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +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/
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <math.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "Globals.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-13 09:23:30 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "VideoConfig.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "Statistics.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "GLUtil.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "Render.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "VertexShaderGen.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "VertexShaderManager.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "VertexShaderCache.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "VertexManager.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "VertexLoader.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "XFMemory.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "ImageWrite.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-02 21:56:29 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "FileUtil.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-05 14:15:36 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "Debugger.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 20:16:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								namespace  OGL 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								VertexShaderCache : : VSCache  VertexShaderCache : : vshaders ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								GLuint  VertexShaderCache : : CurrentShader ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								bool  VertexShaderCache : : ShaderEnabled ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								static  VERTEXSHADER  * pShaderLast  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								static  int  s_nMaxVertexInstructions ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-09-19 10:46:25 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  VertexShaderCache : : Init ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-06 14:44:35 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									glEnable ( GL_VERTEX_PROGRAM_ARB ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									ShaderEnabled  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									CurrentShader  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-17 17:44:09 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									memset ( & last_vertex_shader_uid ,  0xFF ,  sizeof ( last_vertex_shader_uid ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-10 05:02:31 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-03 19:10:23 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									glGetProgramivARB ( GL_VERTEX_PROGRAM_ARB ,  GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB ,  ( GLint  * ) & s_nMaxVertexInstructions ) ; 		
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 18:03:31 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( strstr ( ( const  char * ) glGetString ( GL_VENDOR ) ,  " Humper " )  ! =  NULL )  s_nMaxVertexInstructions  =  4096 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-03 21:21:28 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# if CG_VERSION_NUM == 2100 
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-03 19:10:23 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( strstr ( ( const  char * ) glGetString ( GL_VENDOR ) ,  " ATI " )  ! =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										s_nMaxVertexInstructions  =  4096 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# endif 
 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  VertexShaderCache : : Shutdown ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-28 02:15:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  ( VSCache : : iterator  iter  =  vshaders . begin ( ) ;  iter  ! =  vshaders . end ( ) ;  + + iter ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										iter - > second . Destroy ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									vshaders . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-09-28 02:15:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								VERTEXSHADER *  VertexShaderCache : : SetShader ( u32  components ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									VERTEXSHADERUID  uid ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-17 17:44:09 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									GetVertexShaderId ( & uid ,  components ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-16 05:31:19 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( uid  = =  last_vertex_shader_uid  & &  vshaders [ uid ] . frameCount  = =  frameCount ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-05 14:15:36 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										GFX_DEBUGGER_PAUSE_AT ( NEXT_VERTEX_SHADER_CHANGE ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-10 05:02:31 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  pShaderLast ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-05 14:15:36 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-10 05:02:31 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									memcpy ( & last_vertex_shader_uid ,  & uid ,  sizeof ( VERTEXSHADERUID ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									VSCache : : iterator  iter  =  vshaders . find ( uid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-28 02:15:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( iter  ! =  vshaders . end ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										iter - > second . frameCount  =  frameCount ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										VSCacheEntry  & entry  =  iter - > second ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( & entry . shader  ! =  pShaderLast )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											pShaderLast  =  & entry . shader ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-10 05:02:31 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-05 14:15:36 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										GFX_DEBUGGER_PAUSE_AT ( NEXT_VERTEX_SHADER_CHANGE ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  pShaderLast ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-05 14:15:36 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Make an entry in the table
 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									VSCacheEntry &  entry  =  vshaders [ uid ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-10 05:02:31 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									entry . frameCount  =  frameCount ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									pShaderLast  =  & entry . shader ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-12 15:49:21 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									const  char  * code  =  GenerateVertexShaderCode ( components ,  API_OPENGL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# if defined(_DEBUG) || defined(DEBUGFAST) 
 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-13 08:21:35 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( g_ActiveConfig . iLog  &  CONF_SAVESHADERS  & &  code )  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										static  int  counter  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										char  szTemp [ MAX_PATH ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-28 20:40:15 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										sprintf ( szTemp ,  " %svs_%04i.txt " ,  File : : GetUserPath ( D_DUMP_IDX ) . c_str ( ) ,  counter + + ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										SaveData ( szTemp ,  code ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# endif 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( ! code  | |  ! VertexShaderCache : : CompileVertexShader ( entry . shader ,  code ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-05 14:15:36 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										GFX_DEBUGGER_PAUSE_AT ( NEXT_ERROR ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									INCSTAT ( stats . numVertexShadersCreated ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									SETSTAT ( stats . numVertexShadersAlive ,  vshaders . size ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-05 14:15:36 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									GFX_DEBUGGER_PAUSE_AT ( NEXT_VERTEX_SHADER_CHANGE ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  pShaderLast ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								bool  VertexShaderCache : : CompileVertexShader ( VERTEXSHADER &  vs ,  const  char *  pstrprogram ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2009-03-22 11:21:44 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Reset GL error before compiling shaders. Yeah, we need to investigate the causes of these.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									GLenum  err  =  GL_REPORT_ERROR ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( err  ! =  GL_NO_ERROR ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ERROR_LOG ( VIDEO ,  " glError %08x before VS! " ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-24 10:24:16 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# if defined HAVE_CG && HAVE_CG 
 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									char  stropt [ 64 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									sprintf ( stropt ,  " MaxLocalParams=256,MaxInstructions=%d " ,  s_nMaxVertexInstructions ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									const  char  * opts [ ]  =  { " -profileopts " ,  stropt ,  " -O2 " ,  " -q " ,  NULL } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									CGprogram  tempprog  =  cgCreateProgram ( g_cgcontext ,  CG_SOURCE ,  pstrprogram ,  g_cgvProf ,  " main " ,  opts ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-14 06:25:00 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! cgIsProgram ( tempprog ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 22:18:11 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										static  int  num_failures  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										char  szTemp [ MAX_PATH ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										sprintf ( szTemp ,  " %sbad_vs_%04i.txt " ,  File : : GetUserPath ( D_DUMP_IDX ) . c_str ( ) ,  num_failures + + ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										std : : ofstream  file ( szTemp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										file  < <  pstrprogram ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										file . close ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										PanicAlert ( " Failed to compile vertex shader! \n This usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series. \n \n If you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums. \n \n Debug info (%d): \n %s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														szTemp , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														g_cgfProf , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														cgGetLastListing ( g_cgcontext ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-03-01 00:57:39 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        cgDestroyProgram ( tempprog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-03-21 20:07:56 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										ERROR_LOG ( VIDEO ,  " Failed to load vs %s: " ,  cgGetLastListing ( g_cgcontext ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-05 09:04:34 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										ERROR_LOG ( VIDEO ,  " %s " ,  pstrprogram ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-01-17 17:44:09 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( cgGetError ( )  ! =  CG_NO_ERROR ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-14 06:25:00 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										WARN_LOG ( VIDEO ,  " Failed to load vs %s: " ,  cgGetLastListing ( g_cgcontext ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-05 09:04:34 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										WARN_LOG ( VIDEO ,  " %s " ,  pstrprogram ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-14 06:25:00 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-02-28 16:33:59 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// This looks evil - we modify the program through the const char * we got from cgGetProgramString!
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// It SHOULD not have any nasty side effects though - but you never know...
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									char  * pcompiledprog  =  ( char * ) cgGetProgramString ( tempprog ,  CG_COMPILED_PROGRAM ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									char  * plocal  =  strstr ( pcompiledprog ,  " program.local " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									while  ( plocal  ! =  NULL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										const  char *  penv  =  "   program.env " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										memcpy ( plocal ,  penv ,  13 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-28 16:33:59 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										plocal  =  strstr ( plocal  +  13 ,  " program.local " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									glGenProgramsARB ( 1 ,  & vs . glprogid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-05 00:01:18 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									SetCurrentShader ( vs . glprogid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-17 17:44:09 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									glProgramStringARB ( GL_VERTEX_PROGRAM_ARB ,  GL_PROGRAM_FORMAT_ASCII_ARB ,  ( GLsizei ) strlen ( pcompiledprog ) ,  pcompiledprog ) ; 	
							 
						 
					
						
							
								
									
										
										
										
											2009-03-22 11:21:44 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									err  =  GL_REPORT_ERROR ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( err  ! =  GL_NO_ERROR )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-05 09:04:34 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										ERROR_LOG ( VIDEO ,  " %s " ,  pstrprogram ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ERROR_LOG ( VIDEO ,  " %s " ,  pcompiledprog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									cgDestroyProgram ( tempprog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-24 10:24:16 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# endif 
 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# if defined(_DEBUG) || defined(DEBUGFAST)  
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									vs . strprog  =  pstrprogram ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# endif 
 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-17 17:44:09 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  VertexShaderCache : : DisableShader ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-06 16:05:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ShaderEnabled ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glDisable ( GL_VERTEX_PROGRAM_ARB ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ShaderEnabled  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-01-17 17:44:09 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  VertexShaderCache : : SetCurrentShader ( GLuint  Shader ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-06 16:05:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! ShaderEnabled ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glEnable ( GL_VERTEX_PROGRAM_ARB ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-28 02:15:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										ShaderEnabled =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-06 16:05:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( CurrentShader  ! =  Shader ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-05 19:27:08 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if ( Shader  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											CurrentShader  =  Shader ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glBindProgramARB ( GL_VERTEX_PROGRAM_ARB ,  CurrentShader ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-22 07:55:35 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 20:16:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-31 01:28:32 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Renderer : : SetVSConstant4f ( unsigned  int  const_number ,  float  f1 ,  float  f2 ,  float  f3 ,  float  f4 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 20:16:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									glProgramEnvParameter4fARB ( GL_VERTEX_PROGRAM_ARB ,  const_number ,  f1 ,  f2 ,  f3 ,  f4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-31 01:28:32 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Renderer : : SetVSConstant4fv ( unsigned  int  const_number ,  const  float  * f ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 20:16:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									glProgramEnvParameter4fvARB ( GL_VERTEX_PROGRAM_ARB ,  const_number ,  f ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-31 01:28:32 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Renderer : : SetMultiVSConstant4fv ( unsigned  int  const_number ,  unsigned  int  count ,  const  float  * f ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 20:16:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if ( GLEW_EXT_gpu_program_parameters ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								       glProgramEnvParameters4fvEXT ( GL_VERTEX_PROGRAM_ARB ,  const_number ,  count ,  f ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        for  ( unsigned  int  i  =  0 ;  i  <  count ;  i + + , f + = 4 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            glProgramEnvParameter4fvARB ( GL_VERTEX_PROGRAM_ARB ,  const_number  +  i ,  f ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-31 01:28:32 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Renderer : : SetMultiVSConstant3fv ( unsigned  int  const_number ,  unsigned  int  count ,  const  float  * f ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 20:16:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								   if ( GLEW_EXT_gpu_program_parameters ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        float  buf [ 4  *  C_VENVCONST_END ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        for  ( unsigned  int  i  =  0 ;  i  <  count ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										    buf [ 4 * i   ]  =  * f + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    		buf [ 4 * i + 1 ]  =  * f + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									    	buf [ 4 * i + 2 ]  =  * f + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									    	buf [ 4 * i + 3 ]  =  0.f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        glProgramEnvParameters4fvEXT ( GL_VERTEX_PROGRAM_ARB ,  const_number ,  count ,  buf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        for  ( unsigned  int  i  =  0 ;  i  <  count ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										    float  buf [ 4 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										    buf [ 0 ]  =  * f + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										    buf [ 1 ]  =  * f + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										    buf [ 2 ]  =  * f + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										    buf [ 3 ]  =  0.f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										    glProgramEnvParameter4fvARB ( GL_VERTEX_PROGRAM_ARB ,  const_number  +  i ,  buf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-31 01:28:32 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}   // namespace OGL