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" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "PixelShaderCache.h" 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# include  "PixelShaderManager.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 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								static  GLuint  s_ColorMatrixProgram  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-15 02:39:55 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								static  GLuint  s_DepthMatrixProgram  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											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 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-09-28 02:15:02 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								GLuint  PixelShaderCache : : GetDepthMatrixProgram ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  s_DepthMatrixProgram ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								GLuint  PixelShaderCache : : GetColorMatrixProgram ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  s_ColorMatrixProgram ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  PixelShaderCache : : Init ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-06 14:44:35 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									glEnable ( GL_FRAGMENT_PROGRAM_ARB ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									ShaderEnabled  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									CurrentShader  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 23:32:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									last_entry  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									GL_REPORT_ERRORD ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-03 19:10:23 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									s_displayCompileAlert  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-03-01 00:57:39 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									glGetProgramivARB ( GL_FRAGMENT_PROGRAM_ARB ,  GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB ,  ( GLint  * ) & s_nMaxPixelInstructions ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-25 02:58:37 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if ( s_nMaxPixelInstructions  = =  0 )  // Some combination of drivers and hardware returns zero for some reason.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										s_nMaxPixelInstructions  =  4096 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-06 18:03:31 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									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 
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-03 19:10:23 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( strstr ( ( const  char * ) glGetString ( GL_VENDOR ) ,  " ATI " )  ! =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										s_nMaxPixelInstructions  =  4096 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# endif 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00: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 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-03-21 20:07:56 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									INFO_LOG ( VIDEO ,  " pixel max_alu=%d, max_inst=%d, max_attrib=%d " ,  s_nMaxPixelInstructions ,  maxinst ,  maxattribs ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									char  pmatrixprog [ 2048 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									sprintf ( pmatrixprog ,  " !!ARBfp1.0 " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														" TEMP R0; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														" TEMP R1; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
														" PARAM K0 = { 0.5, 0.5, 0.5, 0.5}; \n "  
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
														" TEX R0, fragment.texcoord[0], texture[0], RECT; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
														" MUL R0, R0, program.env[%d]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														" ADD R0, R0, K0; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														" FLR R0, R0; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														" MUL R0, R0, program.env[%d]; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
														" DP4 R1.x, R0, program.env[%d]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														" DP4 R1.y, R0, program.env[%d]; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
														" DP4 R1.z, R0, program.env[%d]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														" DP4 R1.w, R0, program.env[%d]; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
														" ADD result.color, R1, program.env[%d]; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
														" END \n " , C_COLORMATRIX + 5 , C_COLORMATRIX + 6 ,  C_COLORMATRIX ,  C_COLORMATRIX + 1 ,  C_COLORMATRIX + 2 ,  C_COLORMATRIX + 3 ,  C_COLORMATRIX + 4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									glGenProgramsARB ( 1 ,  & s_ColorMatrixProgram ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-05 00:01:18 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									SetCurrentShader ( s_ColorMatrixProgram ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									glProgramStringARB ( GL_FRAGMENT_PROGRAM_ARB ,  GL_PROGRAM_FORMAT_ASCII_ARB ,  ( GLsizei ) strlen ( pmatrixprog ) ,  pmatrixprog ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-03-22 11:21:44 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									GLenum  err  =  GL_REPORT_ERROR ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( err  ! =  GL_NO_ERROR )  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-03-21 20:07:56 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										ERROR_LOG ( VIDEO ,  " Failed to create color matrix fragment program " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glDeleteProgramsARB ( 1 ,  & s_ColorMatrixProgram ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										s_ColorMatrixProgram  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-15 02:39:55 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								     sprintf ( pmatrixprog ,  " !!ARBfp1.0 \n " 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-15 02:39:55 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
														" TEMP R0; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														" TEMP R1; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        " TEMP R2; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-19 20:01:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        //16777215/16777216*256, 1/255, 256, 0
 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        " PARAM K0 = { 255.99998474121, 0.003921568627451, 256.0, 0.0}; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														" PARAM K1 = { 15.0, 0.066666666666, 0.0, 0.0}; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-19 20:01:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        //sample the depth value
 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-15 02:39:55 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
														" TEX R2, fragment.texcoord[0], texture[0], RECT; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-19 20:01:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        //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
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        " FLR R0.x,R0; \n "         //bits 31..24
 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-19 20:01:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        " SUB R0.yzw,R0,R0.x; \n "  //subtract bits 31..24 from rest
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        " MUL R0.yzw,R0,K0.z; \n "  // *256
 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-19 20:01:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        " FLR R0.y,R0; \n "         //bits 23..16
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        " 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
 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-19 20:01:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                        " MOV R0.w,R0.x; \n "    //duplicate bit 31..24
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														" MUL R0,R0,K0.y; \n "      // /255
 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-19 20:01:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
														" MUL R0.w,R0,K1.x; \n "    // *15
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        " FLR R0.w,R0; \n "         //bits 31..28
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														" MUL R0.w,R0,K1.y; \n "    // /15
 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-19 20:01:17 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-05-15 02:39:55 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
														" 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_COLORMATRIX ,  C_COLORMATRIX + 1 ,  C_COLORMATRIX + 2 ,  C_COLORMATRIX + 3 ,  C_COLORMATRIX + 4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									glGenProgramsARB ( 1 ,  & s_DepthMatrixProgram ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-05 00:01:18 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									SetCurrentShader ( s_DepthMatrixProgram ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-15 02:39:55 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									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 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glDeleteProgramsARB ( 1 ,  & s_DepthMatrixProgram ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-07 19:23:57 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										s_DepthMatrixProgram  =  0 ; 	
							 
						 
					
						
							
								
									
										
										
										
											2009-05-15 02:39:55 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-05 00:01:18 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  PixelShaderCache : : Shutdown ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									glDeleteProgramsARB ( 1 ,  & s_ColorMatrixProgram ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									s_ColorMatrixProgram  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-05-15 02:39:55 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    glDeleteProgramsARB ( 1 ,  & s_DepthMatrixProgram ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									s_DepthMatrixProgram  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-30 15:24:34 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									PSCache : : iterator  iter  =  PixelShaders . begin ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  ( ;  iter  ! =  PixelShaders . end ( ) ;  iter + + ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										iter - > second . Destroy ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-30 15:24:34 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									PixelShaders . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								FRAGMENTSHADER *  PixelShaderCache : : SetShader ( DSTALPHA_MODE  dstAlphaMode ,  u32  components ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									PIXELSHADERUID  uid ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									GetPixelShaderId ( & uid ,  dstAlphaMode ,  components ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-09 00:32:04 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 23:32:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Check if the shader is already set
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( last_entry ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-10 05:02:31 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 23:32:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if  ( uid  = =  last_uid ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											GFX_DEBUGGER_PAUSE_AT ( NEXT_PIXEL_SHADER_CHANGE ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											ValidatePixelShaderIDs ( API_OPENGL ,  last_entry - > safe_uid ,  last_entry - > shader . strprog ,  dstAlphaMode ,  components ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 23:32:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											return  & last_entry - > shader ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-10 05:02:31 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 23:32:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									last_uid  =  uid ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-09-30 15:24:34 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									PSCache : : iterator  iter  =  PixelShaders . find ( uid ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( iter  ! =  PixelShaders . end ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										PSCacheEntry  & entry  =  iter - > second ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 23:32:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										last_entry  =  & entry ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-10 05:02:31 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-05 14:15:36 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										GFX_DEBUGGER_PAUSE_AT ( NEXT_PIXEL_SHADER_CHANGE ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										ValidatePixelShaderIDs ( API_OPENGL ,  entry . safe_uid ,  entry . shader . strprog ,  dstAlphaMode ,  components ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 23:32:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  & last_entry - > shader ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-05 14:15:36 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// Make an entry in the table
 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-30 15:24:34 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									PSCacheEntry &  newentry  =  PixelShaders [ uid ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 23:32:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									last_entry  =  & newentry ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									const  char  * code  =  GeneratePixelShaderCode ( dstAlphaMode ,  API_OPENGL ,  components ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-09 21:34:46 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( g_ActiveConfig . bEnableShaderDebugging  & &  code ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										GetSafePixelShaderId ( & newentry . safe_uid ,  dstAlphaMode ,  components ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-09 21:34:46 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										newentry . shader . strprog  =  code ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# if defined(_DEBUG) || defined(DEBUGFAST) 
 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-13 08:21:35 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( g_ActiveConfig . iLog  &  CONF_SAVESHADERS  & &  code )  { 	
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										static  int  counter  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										char  szTemp [ MAX_PATH ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-28 20:40:15 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										sprintf ( szTemp ,  " %sps_%04i.txt " ,  File : : GetUserPath ( D_DUMP_IDX ) . c_str ( ) ,  counter + + ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										SaveData ( szTemp ,  code ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# endif 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( ! code  | |  ! CompilePixelShader ( newentry . shader ,  code ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-05 14:15:36 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										GFX_DEBUGGER_PAUSE_AT ( NEXT_ERROR ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									INCSTAT ( stats . numPixelShadersCreated ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-30 15:24:34 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									SETSTAT ( stats . numPixelShadersAlive ,  PixelShaders . size ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-05 14:15:36 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									GFX_DEBUGGER_PAUSE_AT ( NEXT_PIXEL_SHADER_CHANGE ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 23:32:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									return  & last_entry - > shader ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								bool  PixelShaderCache : : CompilePixelShader ( FRAGMENTSHADER &  ps ,  const  char *  pstrprogram ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2009-03-22 11:21:44 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									GLenum  err  =  GL_REPORT_ERROR ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									if  ( err  ! =  GL_NO_ERROR ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ERROR_LOG ( VIDEO ,  " glError %08x before PS! " ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-24 10:24:16 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# if defined HAVE_CG && HAVE_CG 
 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-28 16:33:59 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									char  stropt [ 128 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-03 23:24:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									sprintf ( stropt ,  " MaxLocalParams=224,NumInstructionSlots=%d " ,  s_nMaxPixelInstructions ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-28 16:33:59 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									const  char  * opts [ ]  =  { " -profileopts " ,  stropt ,  " -O2 " ,  " -q " ,  NULL } ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									CGprogram  tempprog  =  cgCreateProgram ( g_cgcontext ,  CG_SOURCE ,  pstrprogram ,  g_cgfProf ,  " main " ,  opts ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-14 06:25:00 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// handle errors
 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-15 14:49:34 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( ! cgIsProgram ( tempprog ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										cgDestroyProgram ( tempprog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 22:18:11 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										static  int  num_failures  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										char  szTemp [ MAX_PATH ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										sprintf ( szTemp ,  " %sbad_ps_%04i.txt " ,  File : : GetUserPath ( D_DUMP_IDX ) . c_str ( ) ,  num_failures + + ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										std : : ofstream  file ( szTemp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										file  < <  pstrprogram ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										file . close ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										PanicAlert ( " Failed to compile pixel shader! \n This usually happens when trying to use Dolphin with an outdated GPU or integrated GPU like the Intel GMA series. \n \n If you're sure this is Dolphin's error anyway, post the contents of %s along with this error message at the forums. \n \n Debug info (%d): \n %s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														szTemp , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														g_cgfProf , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
														cgGetLastListing ( g_cgcontext ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-15 14:49:34 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-14 06:25:00 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// handle warnings
 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-17 17:44:09 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if  ( cgGetError ( )  ! =  CG_NO_ERROR ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-14 06:25:00 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-15 14:49:34 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										WARN_LOG ( VIDEO ,  " Warnings on compile ps %s: " ,  cgGetLastListing ( g_cgcontext ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										WARN_LOG ( VIDEO ,  " %s " ,  pstrprogram ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-02-28 16:33:59 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									// This looks evil - we modify the program through the const char * we got from cgGetProgramString!
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									// It SHOULD not have any nasty side effects though - but you never know...
 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									char  * pcompiledprog  =  ( char * ) cgGetProgramString ( tempprog ,  CG_COMPILED_PROGRAM ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									char  * plocal  =  strstr ( pcompiledprog ,  " program.local " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-15 14:49:34 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									while  ( plocal  ! =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-28 16:33:59 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										const  char  * penv  =  "   program.env " ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										memcpy ( plocal ,  penv ,  13 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										plocal  =  strstr ( plocal + 13 ,  " program.local " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-02-28 16:33:59 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									glGenProgramsARB ( 1 ,  & ps . glprogid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-05 00:01:18 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									SetCurrentShader ( ps . glprogid ) ; 	
							 
						 
					
						
							
								
									
										
										
										
											2009-02-28 16:33:59 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									glProgramStringARB ( GL_FRAGMENT_PROGRAM_ARB ,  GL_PROGRAM_FORMAT_ASCII_ARB ,  ( GLsizei ) strlen ( pcompiledprog ) ,  pcompiledprog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-03-22 11:21:44 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									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
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-05 09:04:34 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										ERROR_LOG ( VIDEO ,  " %s " ,  pstrprogram ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ERROR_LOG ( VIDEO ,  " %s " ,  pcompiledprog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									cgDestroyProgram ( tempprog ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-24 10:24:16 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# endif 
 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-23 06:15:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								//Disable Fragment programs and reset the selected Program
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  PixelShaderCache : : DisableShader ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-06 16:05:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if ( ShaderEnabled ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 		
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glDisable ( GL_FRAGMENT_PROGRAM_ARB ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ShaderEnabled  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 	
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								//bind a program if is diferent from the binded oone
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								void  PixelShaderCache : : SetCurrentShader ( GLuint  Shader ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-06 16:05:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if ( ! ShaderEnabled ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glEnable ( GL_FRAGMENT_PROGRAM_ARB ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										ShaderEnabled  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-02-06 16:05:48 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									if ( CurrentShader  ! =  Shader ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-05 19:27:08 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										if ( Shader  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											CurrentShader  =  Shader ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-09-26 12:39:12 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										glBindProgramARB ( GL_FRAGMENT_PROGRAM_ARB ,  CurrentShader ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-22 07:55:35 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 20:16:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-01-31 01:28:32 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								void  Renderer : : SetPSConstant4f ( unsigned  int  const_number ,  float  f1 ,  float  f2 ,  float  f3 ,  float  f4 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 20:16:51 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									float  f [ 4 ]  =  {  f1 ,  f2 ,  f3 ,  f4  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									glProgramEnvParameter4fvARB ( GL_FRAGMENT_PROGRAM_ARB ,  const_number ,  f ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									glProgramEnvParameter4fvARB ( GL_FRAGMENT_PROGRAM_ARB ,  const_number ,  f ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											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 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									for  ( unsigned  int  i  =  0 ;  i  <  count ;  i + + , f + = 4 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										glProgramEnvParameter4fvARB ( GL_FRAGMENT_PROGRAM_ARB ,  const_number  +  i ,  f ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-31 01:28:32 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}   // namespace OGL