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  "Globals.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "GLUtil.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  <cmath> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "Statistics.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-13 09:23:30 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "VideoConfig.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "ImageWrite.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "Common.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "Render.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "VertexShaderGen.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "ProgramShaderCache.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "PixelShaderCache.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "PixelShaderManager.h" 
 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 05:15:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# include  "OnScreenDisplay.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "StringUtil.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 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  int  s_nMaxPixelInstructions ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-07 22:04:34 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  FRAGMENTSHADER  s_ColorMatrixProgram ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								static  FRAGMENTSHADER  s_DepthMatrixProgram ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-30 15:24:34 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								PixelShaderCache : : PSCache  PixelShaderCache : : PixelShaders ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								PIXELSHADERUID  PixelShaderCache : : s_curuid ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-03-01 00:57:39 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								bool  PixelShaderCache : : s_displayCompileAlert ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								GLuint  PixelShaderCache : : CurrentShader ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								bool  PixelShaderCache : : ShaderEnabled ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 23:32:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								PixelShaderCache : : PSCacheEntry *  PixelShaderCache : : last_entry  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								PIXELSHADERUID  PixelShaderCache : : last_uid ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-10 05:02:31 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  ( * pSetPSConstant4f ) ( unsigned  int ,  float ,  float ,  float ,  float ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  ( * pSetPSConstant4fv ) ( unsigned  int ,  const  float * ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  ( * pSetMultiPSConstant4fv ) ( unsigned  int ,  unsigned  int ,  const  float * ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-02 18:26:15 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								bool  ( * pCompilePixelShader ) ( FRAGMENTSHADER & ,  const  char * ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-09-28 02:15:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								GLuint  PixelShaderCache : : GetDepthMatrixProgram ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  s_DepthMatrixProgram . glprogid ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-28 02:15:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								GLuint  PixelShaderCache : : GetColorMatrixProgram ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  s_ColorMatrixProgram . glprogid ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-28 02:15:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  PixelShaderCache : : Init ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									ShaderEnabled  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									CurrentShader  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									last_entry  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									GL_REPORT_ERRORD ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									s_displayCompileAlert  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( g_ActiveConfig . bUseGLSL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 05:15:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										pSetPSConstant4f  =  SetGLSLPSConstant4f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										pSetPSConstant4fv  =  SetGLSLPSConstant4fv ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										pSetMultiPSConstant4fv  =  SetMultiGLSLPSConstant4fv ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										pCompilePixelShader  =  CompileGLSLPixelShader ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 05:15:08 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										pSetPSConstant4f  =  SetCGPSConstant4f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										pSetPSConstant4fv  =  SetCGPSConstant4fv ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										pSetMultiPSConstant4fv  =  SetMultiCGPSConstant4fv ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										pCompilePixelShader  =  CompileCGPixelShader ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glEnable ( GL_FRAGMENT_PROGRAM_ARB ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									glGetProgramivARB ( GL_FRAGMENT_PROGRAM_ARB ,  GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB ,  ( GLint  * ) & s_nMaxPixelInstructions ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( s_nMaxPixelInstructions  = =  0 )  // Some combination of drivers and hardware returns zero for some reason.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										s_nMaxPixelInstructions  =  4096 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( strstr ( ( const  char * ) glGetString ( GL_VENDOR ) ,  " Humper " )  ! =  NULL )  s_nMaxPixelInstructions  =  4096 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-03 21:21:28 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# if CG_VERSION_NUM == 2100 
 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( strstr ( ( const  char * ) glGetString ( GL_VENDOR ) ,  " ATI " )  ! =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										s_nMaxPixelInstructions  =  4096 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-03 19:10:23 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# endif 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									int  maxinst ,  maxattribs ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									glGetProgramivARB ( GL_FRAGMENT_PROGRAM_ARB ,  GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB ,  ( GLint  * ) & maxinst ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									glGetProgramivARB ( GL_FRAGMENT_PROGRAM_ARB ,  GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB ,  ( GLint  * ) & maxattribs ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									INFO_LOG ( VIDEO ,  " pixel max_alu=%d, max_inst=%d, max_attrib=%d " ,  s_nMaxPixelInstructions ,  maxinst ,  maxattribs ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( g_ActiveConfig . bUseGLSL ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-07 22:04:34 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										char  pmatrixprog [ 2048 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-17 01:06:55 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										sprintf ( pmatrixprog ,  " #version %s \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" #extension GL_ARB_texture_rectangle : enable \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" %s \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" %suniform sampler2DRect samp0; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" %s \n " 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-19 23:42:22 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											" %svec4  "  I_COLORS " [7]; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-17 01:06:55 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											" %s \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" void main(){ \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" vec4 Temp0, Temp1; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" vec4 K0 = vec4(0.5, 0.5, 0.5, 0.5); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" Temp0 = texture2DRect(samp0, gl_TexCoord[0].xy); \n " 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-19 23:42:22 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											" Temp0 = Temp0 *  "  I_COLORS " [%d]; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-17 01:06:55 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											" Temp0 = Temp0 + K0; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" Temp0 = floor(Temp0); \n " 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-19 23:42:22 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											" Temp0 = Temp0 *  "  I_COLORS " [%d]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" Temp1.x = dot(Temp0,  "  I_COLORS " [%d]); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" Temp1.y = dot(Temp0,  "  I_COLORS " [%d]); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" Temp1.z = dot(Temp0,  "  I_COLORS " [%d]); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" Temp1.w = dot(Temp0,  "  I_COLORS " [%d]); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" gl_FragData[0] = Temp1 +  "  I_COLORS " [%d]; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-17 01:06:55 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											" } \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											( g_ActiveConfig . backend_info . bSupportsGLSLUBO  | |  g_ActiveConfig . backend_info . bSupportsGLSLBinding )  ?  " 330 compatibility "  :  " 120 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											g_ActiveConfig . backend_info . bSupportsGLSLBinding  ?  " #extension GL_ARB_shading_language_420pack : enable "  :  " " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											g_ActiveConfig . backend_info . bSupportsGLSLBinding  ?  " layout(binding = 0)  "  :  " " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											g_ActiveConfig . backend_info . bSupportsGLSLUBO  ?  " layout(std140) uniform PSBlock { "  :  " " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											g_ActiveConfig . backend_info . bSupportsGLSLUBO  ?  " "  :  " uniform  " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											g_ActiveConfig . backend_info . bSupportsGLSLUBO  ?  " }; "  :  " " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											C_COLORS + 5 ,  C_COLORS + 6 ,  C_COLORS ,  C_COLORS + 1 ,  C_COLORS + 2 ,  C_COLORS + 3 ,  C_COLORS + 4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-10 15:40:10 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( ! PixelShaderCache : : CompilePixelShader ( s_ColorMatrixProgram ,  pmatrixprog ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-07 22:04:34 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ERROR_LOG ( VIDEO ,  " Failed to create color matrix fragment program " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											s_ColorMatrixProgram . Destroy ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-17 01:06:55 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										sprintf ( pmatrixprog ,  " #version %s \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" #extension GL_ARB_texture_rectangle : enable \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" %s \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" %suniform sampler2DRect samp0; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" %s \n " 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-19 23:42:22 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											" %svec4  "  I_COLORS " [5]; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-17 01:06:55 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											" %s \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" void main(){ \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" vec4 R0, R1, R2; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" vec4 K0 = vec4(255.99998474121, 0.003921568627451, 256.0, 0.0); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" vec4 K1 = vec4(15.0, 0.066666666666, 0.0, 0.0); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R2 = texture2DRect(samp0, gl_TexCoord[0].xy); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R0.x = R2.x * K0.x; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R0.x = floor(R0).x; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R0.yzw = (R0 - R0.x).yzw; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R0.yzw = (R0 * K0.z).yzw; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R0.y = floor(R0).y; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R0.zw = (R0 - R0.y).zw; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R0.zw = (R0 * K0.z).zw; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R0.z = floor(R0).z; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R0.w = R0.x; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R0 = R0 * K0.y; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R0.w = (R0 * K1.x).w; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R0.w = floor(R0).w; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R0.w = (R0 * K1.y).w; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-19 23:42:22 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											" R1.x = dot(R0,  "  I_COLORS " [%d]); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R1.y = dot(R0,  "  I_COLORS " [%d]); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R1.z = dot(R0,  "  I_COLORS " [%d]); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" R1.w = dot(R0,  "  I_COLORS " [%d]); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" gl_FragData[0] = R1 *  "  I_COLORS " [%d]; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-17 01:06:55 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											" } \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											( g_ActiveConfig . backend_info . bSupportsGLSLUBO  | |  g_ActiveConfig . backend_info . bSupportsGLSLBinding )  ?  " 330 compatibility "  :  " 120 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											g_ActiveConfig . backend_info . bSupportsGLSLBinding  ?  " #extension GL_ARB_shading_language_420pack : enable "  :  " " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											g_ActiveConfig . backend_info . bSupportsGLSLBinding  ?  " layout(binding = 0)  "  :  " " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											g_ActiveConfig . backend_info . bSupportsGLSLUBO  ?  " layout(std140) uniform PSBlock { "  :  " " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											g_ActiveConfig . backend_info . bSupportsGLSLUBO  ?  " "  :  " uniform  " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											g_ActiveConfig . backend_info . bSupportsGLSLUBO  ?  " }; "  :  " " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											C_COLORS ,  C_COLORS + 1 ,  C_COLORS + 2 ,  C_COLORS + 3 ,  C_COLORS + 4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-10 15:40:10 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( ! PixelShaderCache : : CompilePixelShader ( s_DepthMatrixProgram ,  pmatrixprog ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-07 22:04:34 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ERROR_LOG ( VIDEO ,  " Failed to create depth matrix fragment program " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											s_DepthMatrixProgram . Destroy ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										char  pmatrixprog [ 2048 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										sprintf ( pmatrixprog ,  " !!ARBfp1.0 " 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											" TEMP R0; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" TEMP R1; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" PARAM K0 = { 0.5, 0.5, 0.5, 0.5}; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" TEX R0, fragment.texcoord[0], texture[0], RECT; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" MUL R0, R0, program.env[%d]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" ADD R0, R0, K0; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" FLR R0, R0; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" MUL R0, R0, program.env[%d]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" DP4 R1.x, R0, program.env[%d]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" DP4 R1.y, R0, program.env[%d]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" DP4 R1.z, R0, program.env[%d]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" DP4 R1.w, R0, program.env[%d]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" ADD result.color, R1, program.env[%d]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" END \n " , C_COLORS + 5 , C_COLORS + 6 ,  C_COLORS ,  C_COLORS + 1 ,  C_COLORS + 2 ,  C_COLORS + 3 ,  C_COLORS + 4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-07 22:04:34 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glGenProgramsARB ( 1 ,  & s_ColorMatrixProgram . glprogid ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										SetCurrentShader ( s_ColorMatrixProgram . glprogid ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glProgramStringARB ( GL_FRAGMENT_PROGRAM_ARB ,  GL_PROGRAM_FORMAT_ASCII_ARB ,  ( GLsizei ) strlen ( pmatrixprog ) ,  pmatrixprog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										GLenum  err  =  GL_REPORT_ERROR ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( err  ! =  GL_NO_ERROR )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ERROR_LOG ( VIDEO ,  " Failed to create color matrix fragment program " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											s_ColorMatrixProgram . Destroy ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										sprintf ( pmatrixprog ,  " !!ARBfp1.0 \n " 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											" TEMP R0; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" TEMP R1; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" TEMP R2; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											//16777215/16777216*256, 1/255, 256, 0
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" PARAM K0 = { 255.99998474121, 0.003921568627451, 256.0, 0.0}; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" PARAM K1 = { 15.0, 0.066666666666, 0.0, 0.0}; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											//sample the depth value
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" TEX R2, fragment.texcoord[0], texture[0], RECT; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											//scale from [0*16777216..1*16777216] to
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											//[0*16777215..1*16777215], multiply by 256
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" MUL R0, R2.x, K0.x; \n "  // *16777215/16777216*256
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											//It is easy to get bad results due to low precision
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											//here, for example converting like this:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											//MUL R0,R0,{ 65536, 256, 1, 16777216 }
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											//FRC R0,R0
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											//gives {?, 128/255, 254/255, ?} for depth value 254/255
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											//on some gpus
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" FLR R0.x,R0; \n "         //bits 31..24
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" SUB R0.yzw,R0,R0.x; \n "  //subtract bits 31..24 from rest
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" MUL R0.yzw,R0,K0.z; \n "  // *256
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" FLR R0.y,R0; \n "         //bits 23..16
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" SUB R0.zw,R0,R0.y; \n "   //subtract bits 23..16 from rest
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" MUL R0.zw,R0,K0.z; \n "   // *256
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" FLR R0.z,R0; \n "         //bits 15..8
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" MOV R0.w,R0.x; \n "    //duplicate bit 31..24
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" MUL R0,R0,K0.y; \n "      // /255
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" MUL R0.w,R0,K1.x; \n "    // *15
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" FLR R0.w,R0; \n "         //bits 31..28
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" MUL R0.w,R0,K1.y; \n "    // /15
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" DP4 R1.x, R0, program.env[%d]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" DP4 R1.y, R0, program.env[%d]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" DP4 R1.z, R0, program.env[%d]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" DP4 R1.w, R0, program.env[%d]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" ADD result.color, R1, program.env[%d]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											" END \n " ,  C_COLORS ,  C_COLORS + 1 ,  C_COLORS + 2 ,  C_COLORS + 3 ,  C_COLORS + 4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-07 22:04:34 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glGenProgramsARB ( 1 ,  & s_DepthMatrixProgram . glprogid ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										SetCurrentShader ( s_DepthMatrixProgram . glprogid ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glProgramStringARB ( GL_FRAGMENT_PROGRAM_ARB ,  GL_PROGRAM_FORMAT_ASCII_ARB ,  ( GLsizei ) strlen ( pmatrixprog ) ,  pmatrixprog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										err  =  GL_REPORT_ERROR ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( err  ! =  GL_NO_ERROR )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ERROR_LOG ( VIDEO ,  " Failed to create depth matrix fragment program " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											s_DepthMatrixProgram . Destroy ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  PixelShaderCache : : Shutdown ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-07 22:04:34 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									s_ColorMatrixProgram . Destroy ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									s_DepthMatrixProgram . Destroy ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									PSCache : : iterator  iter  =  PixelShaders . begin ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  ( ;  iter  ! =  PixelShaders . end ( ) ;  iter + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										iter - > second . Destroy ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									PixelShaders . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-10-21 05:22:18 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								FRAGMENTSHADER *  PixelShaderCache : : SetShader ( DSTALPHA_MODE  dstAlphaMode ,  u32  components ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									PIXELSHADERUID  uid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									GetPixelShaderId ( & uid ,  dstAlphaMode ,  components ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Check if the shader is already set
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( last_entry ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 11:08:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( uid  = =  last_uid ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											GFX_DEBUGGER_PAUSE_AT ( NEXT_PIXEL_SHADER_CHANGE ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ValidatePixelShaderIDs ( API_OPENGL ,  last_entry - > safe_uid ,  last_entry - > shader . strprog ,  dstAlphaMode ,  components ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return  & last_entry - > shader ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 11:08:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									last_uid  =  uid ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									PSCache : : iterator  iter  =  PixelShaders . find ( uid ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( iter  ! =  PixelShaders . end ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										PSCacheEntry  & entry  =  iter - > second ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										last_entry  =  & entry ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										GFX_DEBUGGER_PAUSE_AT ( NEXT_PIXEL_SHADER_CHANGE ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ValidatePixelShaderIDs ( API_OPENGL ,  entry . safe_uid ,  entry . shader . strprog ,  dstAlphaMode ,  components ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  & last_entry - > shader ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Make an entry in the table
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									PSCacheEntry &  newentry  =  PixelShaders [ uid ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									last_entry  =  & newentry ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									const  char  * code  =  GeneratePixelShaderCode ( dstAlphaMode ,  g_ActiveConfig . bUseGLSL  ?  API_GLSL  :  API_OPENGL ,  components ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( g_ActiveConfig . bEnableShaderDebugging  & &  code ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										GetSafePixelShaderId ( & newentry . safe_uid ,  dstAlphaMode ,  components ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										newentry . shader . strprog  =  code ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# if defined(_DEBUG) || defined(DEBUGFAST) 
 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( g_ActiveConfig . iLog  &  CONF_SAVESHADERS  & &  code )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										static  int  counter  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										char  szTemp [ MAX_PATH ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										sprintf ( szTemp ,  " %sps_%04i.txt " ,  File : : GetUserPath ( D_DUMP_IDX ) . c_str ( ) ,  counter + + ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										SaveData ( szTemp ,  code ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# endif 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! code  | |  ! CompilePixelShader ( newentry . shader ,  code ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										GFX_DEBUGGER_PAUSE_AT ( NEXT_ERROR ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									INCSTAT ( stats . numPixelShadersCreated ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									SETSTAT ( stats . numPixelShadersAlive ,  PixelShaders . size ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									GFX_DEBUGGER_PAUSE_AT ( NEXT_PIXEL_SHADER_CHANGE ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  & last_entry - > shader ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								bool  PixelShaderCache : : CompilePixelShader ( FRAGMENTSHADER &  ps ,  const  char *  pstrprogram ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-02 18:26:15 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  pCompilePixelShader ( ps ,  pstrprogram ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Disable Fragment programs and reset the selected Program
 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  PixelShaderCache : : DisableShader ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ShaderEnabled ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glDisable ( GL_FRAGMENT_PROGRAM_ARB ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ShaderEnabled  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// bind a program if is different from the binded oone
 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  PixelShaderCache : : SetCurrentShader ( GLuint  Shader ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! ShaderEnabled ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glEnable ( GL_FRAGMENT_PROGRAM_ARB ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ShaderEnabled  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( CurrentShader  ! =  Shader ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( Shader  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											CurrentShader  =  Shader ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glBindProgramARB ( GL_FRAGMENT_PROGRAM_ARB ,  CurrentShader ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// GLSL Specific
 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-02 18:26:15 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								bool  CompileGLSLPixelShader ( FRAGMENTSHADER &  ps ,  const  char *  pstrprogram ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-02 18:31:06 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									GLuint  result  =  glCreateShader ( GL_FRAGMENT_SHADER ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									glShaderSource ( result ,  1 ,  & pstrprogram ,  NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									glCompileShader ( result ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									GLint  compileStatus ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									glGetShaderiv ( result ,  GL_COMPILE_STATUS ,  & compileStatus ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( compileStatus  ! =  GL_TRUE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// Compile failed
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ERROR_LOG ( VIDEO ,  " Shader compilation failed; see info log " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-10 08:07:13 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										GLsizei  length  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glGetShaderiv ( result ,  GL_INFO_LOG_LENGTH ,  & length ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( length  >  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											GLsizei  charsWritten ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											GLchar *  infoLog  =  new  GLchar [ length ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											glGetShaderInfoLog ( result ,  length ,  & charsWritten ,  infoLog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-10 15:40:10 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											WARN_LOG ( VIDEO ,  " PS Shader info log: \n %s " ,  infoLog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											char  szTemp [ MAX_PATH ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											sprintf ( szTemp ,  " ps_%d.txt " ,  result ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											FILE  * fp  =  fopen ( szTemp ,  " wb " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											fwrite ( pstrprogram ,  strlen ( pstrprogram ) ,  1 ,  fp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											fclose ( fp ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-10 08:07:13 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											delete [ ]  infoLog ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-02 18:31:06 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										// Don't try to use this shader
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glDeleteShader ( result ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									( void ) GL_REPORT_ERROR ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									ps . glprogid  =  result ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-07 22:04:34 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									ps . bGLSL  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-02 18:31:06 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-02 18:26:15 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  SetPSConstant4fvByName ( const  char  *  name ,  unsigned  int  offset ,  const  float  * f ,  const  unsigned  int  count  =  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 02:58:52 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									ProgramShaderCache : : PCacheEntry  tmp  =  ProgramShaderCache : : GetShaderProgram ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  ( int  a  =  0 ;  a  <  NUM_UNIFORMS ;  + + a ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 11:08:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( ! strcmp ( name ,  UniformNames [ a ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											if  ( tmp . UniformLocations [ a ]  = =  - 1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												glUniform4fv ( tmp . UniformLocations [ a ]  +  offset ,  count ,  f ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 11:08:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-10 07:38:30 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  SetGLSLPSConstant4f ( unsigned  int  const_number ,  float  f1 ,  float  f2 ,  float  f3 ,  float  f4 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									float  const  f [ 4 ]  =  { f1 ,  f2 ,  f3 ,  f4 } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-09 17:30:05 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( g_ActiveConfig . backend_info . bSupportsGLSLUBO ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 04:11:57 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										ProgramShaderCache : : SetMultiPSConstant4fv ( const_number ,  f ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-09 17:30:05 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  ( unsigned  int  a  =  0 ;  a  <  10 ;  + + a ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 11:08:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( const_number  > =  PSVar_Loc [ a ] . reg  & &  const_number  <  ( PSVar_Loc [ a ] . reg  +  PSVar_Loc [ a ] . size ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											unsigned  int  offset  =  const_number  -  PSVar_Loc [ a ] . reg ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											SetPSConstant4fvByName ( PSVar_Loc [ a ] . name ,  offset ,  f ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 11:08:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  SetGLSLPSConstant4fv ( unsigned  int  const_number ,  const  float  * f ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-09 17:30:05 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( g_ActiveConfig . backend_info . bSupportsGLSLUBO ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 04:11:57 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										ProgramShaderCache : : SetMultiPSConstant4fv ( const_number ,  f ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-09 17:30:05 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  ( unsigned  int  a  =  0 ;  a  <  10 ;  + + a ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 11:08:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( const_number  > =  PSVar_Loc [ a ] . reg  & &  const_number  <  ( PSVar_Loc [ a ] . reg  +  PSVar_Loc [ a ] . size ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											unsigned  int  offset  =  const_number  -  PSVar_Loc [ a ] . reg ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											SetPSConstant4fvByName ( PSVar_Loc [ a ] . name ,  offset ,  f ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 11:08:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  SetMultiGLSLPSConstant4fv ( unsigned  int  const_number ,  unsigned  int  count ,  const  float  * f ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-09 17:30:05 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( g_ActiveConfig . backend_info . bSupportsGLSLUBO ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 04:11:57 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										ProgramShaderCache : : SetMultiPSConstant4fv ( const_number ,  f ,  count ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-09 17:30:05 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  ( unsigned  int  a  =  0 ;  a  <  10 ;  + + a ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 11:08:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( const_number  > =  PSVar_Loc [ a ] . reg  & &  const_number  <  ( PSVar_Loc [ a ] . reg  +  PSVar_Loc [ a ] . size ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											unsigned  int  offset  =  const_number  -  PSVar_Loc [ a ] . reg ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											SetPSConstant4fvByName ( PSVar_Loc [ a ] . name ,  offset ,  f ,  count ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 11:08:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-02 18:26:15 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// CG Specific
 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-02 18:26:15 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								bool  CompileCGPixelShader ( FRAGMENTSHADER &  ps ,  const  char *  pstrprogram ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									GLenum  err  =  GL_REPORT_ERROR ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( err  ! =  GL_NO_ERROR ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ERROR_LOG ( VIDEO ,  " glError %08x before PS! " ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-02 18:26:15 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# if defined HAVE_CG && HAVE_CG 
 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									CGprogram  tempprog  =  cgCreateProgram ( g_cgcontext ,  CG_SOURCE ,  pstrprogram ,  g_cgfProf ,  " main " ,  NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-02 18:26:15 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// handle errors
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( ! cgIsProgram ( tempprog ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										cgDestroyProgram ( tempprog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										static  int  num_failures  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										char  szTemp [ MAX_PATH ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										sprintf ( szTemp ,  " bad_ps_%04i.txt " ,  num_failures + + ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										std : : ofstream  file ( szTemp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										file  < <  pstrprogram ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										file . close ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-02 18:26:15 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										PanicAlert ( " Failed to compile pixel shader %d! \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 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											num_failures  -  1 ,  szTemp , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											g_cgfProf , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											cgGetLastListing ( g_cgcontext ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// handle warnings
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( cgGetError ( )  ! =  CG_NO_ERROR ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										WARN_LOG ( VIDEO ,  " Warnings on compile ps %s: " ,  cgGetLastListing ( g_cgcontext ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										WARN_LOG ( VIDEO ,  " %s " ,  pstrprogram ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 11:08:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-02 18:26:15 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05: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 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									while  ( plocal  ! =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										const  char  * penv  =  "   program.env " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										memcpy ( plocal ,  penv ,  13 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										plocal  =  strstr ( plocal + 13 ,  " program.local " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									glGenProgramsARB ( 1 ,  & ps . glprogid ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									ps . bGLSL  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									PixelShaderCache : : SetCurrentShader ( ps . glprogid ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									glProgramStringARB ( GL_FRAGMENT_PROGRAM_ARB ,  GL_PROGRAM_FORMAT_ASCII_ARB ,  ( GLsizei ) strlen ( pcompiledprog ) ,  pcompiledprog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									err  =  GL_REPORT_ERROR ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( err  ! =  GL_NO_ERROR ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										GLint  error_pos ,  native_limit ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glGetIntegerv ( GL_PROGRAM_ERROR_POSITION_ARB ,  & error_pos ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glGetProgramivARB ( GL_FRAGMENT_PROGRAM_ARB ,  GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB ,  & native_limit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// Error occur
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										if  ( error_pos  ! =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											const  char  * program_error  =  ( const  char  * ) glGetString ( GL_PROGRAM_ERROR_STRING_ARB ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											char  line [ 256 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											strncpy ( line ,  ( const  char  * ) pcompiledprog  +  error_pos ,  255 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											line [ 255 ]  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ERROR_LOG ( VIDEO ,  " Error at %i: %s " ,  error_pos ,  program_error ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ERROR_LOG ( VIDEO ,  " Line dump:  \n %s " ,  line ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										}  else  if  ( native_limit  ! =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											ERROR_LOG ( VIDEO ,  " Hit limit? %i " ,  native_limit ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											// TODO
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ERROR_LOG ( VIDEO ,  " %s " ,  pstrprogram ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ERROR_LOG ( VIDEO ,  " %s " ,  pcompiledprog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									cgDestroyProgram ( tempprog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-02 18:26:15 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# endif 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-02 18:26:15 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  SetCGPSConstant4f ( unsigned  int  const_number ,  float  f1 ,  float  f2 ,  float  f3 ,  float  f4 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									float  f [ 4 ]  =  {  f1 ,  f2 ,  f3 ,  f4  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									glProgramEnvParameter4fvARB ( GL_FRAGMENT_PROGRAM_ARB ,  const_number ,  f ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-22 07:55:35 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 20:16:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  SetCGPSConstant4fv ( unsigned  int  const_number ,  const  float  * f ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									glProgramEnvParameter4fvARB ( GL_FRAGMENT_PROGRAM_ARB ,  const_number ,  f ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  SetMultiCGPSConstant4fv ( unsigned  int  const_number ,  unsigned  int  count ,  const  float  * f ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									for  ( unsigned  int  i  =  0 ;  i  <  count ;  i + + , f + = 4 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glProgramEnvParameter4fvARB ( GL_FRAGMENT_PROGRAM_ARB ,  const_number  +  i ,  f ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Renderer functions
 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-31 01:28:32 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Renderer : : SetPSConstant4f ( unsigned  int  const_number ,  float  f1 ,  float  f2 ,  float  f3 ,  float  f4 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 20:16:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 11:08:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									pSetPSConstant4f ( const_number ,  f1 ,  f2 ,  f3 ,  f4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 20:16:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-31 01:28:32 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Renderer : : SetPSConstant4fv ( unsigned  int  const_number ,  const  float  * f ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 20:16:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 11:08:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									pSetPSConstant4fv ( const_number ,  f ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 20:16:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-31 01:28:32 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Renderer : : SetMultiPSConstant4fv ( unsigned  int  const_number ,  unsigned  int  count ,  const  float  * f ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 20:16:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 11:08:18 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									pSetMultiPSConstant4fv ( const_number ,  count ,  f ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 20:16:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-31 01:28:32 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								}   // namespace OGL