2013-04-17 23:09:55 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Copyright 2013 Dolphin Emulator Project
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Licensed under GPLv2
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Refer to the license.txt file included.
  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-19 02:27:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <cassert> 
  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <cmath> 
  
						 
					
						
							
								
									
										
										
										
											2014-02-17 05:18:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <cstdio> 
  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-13 23:26:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "VideoCommon/BoundingBox.h" 
  
						 
					
						
							
								
									
										
										
										
											2014-02-17 05:18:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "VideoCommon/BPMemory.h" 
  
						 
					
						
							
								
									
										
										
										
											2014-05-30 16:17:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "VideoCommon/ConstantManager.h" 
  
						 
					
						
							
								
									
										
										
										
											2014-12-03 00:29:50 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "VideoCommon/DriverDetails.h" 
  
						 
					
						
							
								
									
										
										
										
											2014-02-17 05:18:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "VideoCommon/LightingShaderGen.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "VideoCommon/NativeVertexFormat.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "VideoCommon/PixelShaderGen.h" 
  
						 
					
						
							
								
									
										
										
										
											2014-10-25 02:05:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "VideoCommon/VertexShaderGen.h" 
  
						 
					
						
							
								
									
										
										
										
											2014-02-17 05:18:15 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "VideoCommon/VideoConfig.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "VideoCommon/XFMemory.h"    // for texture projection mode
  
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-01-08 16:40:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-28 20:34:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  char  * tevKSelTableC [ ]  =  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-08-14 16:25:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" 255,255,255 " ,   // 1   = 0x00
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 223,223,223 " ,   // 7_8 = 0x01
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 191,191,191 " ,   // 3_4 = 0x02
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 159,159,159 " ,   // 5_8 = 0x03
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 13:27:00 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" 128,128,128 " ,   // 1_2 = 0x04
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 96,96,96 " ,      // 3_8 = 0x05
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 64,64,64 " ,      // 1_4 = 0x06
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 32,32,32 " ,      // 1_8 = 0x07
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0,0,0 " ,         // INVALID = 0x08
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0,0,0 " ,         // INVALID = 0x09
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0,0,0 " ,         // INVALID = 0x0a
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0,0,0 " ,         // INVALID = 0x0b
 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-10 20:26:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									I_KCOLORS " [0].rgb " ,  // K0 = 0x0C
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].rgb " ,  // K1 = 0x0D
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].rgb " ,  // K2 = 0x0E
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].rgb " ,  // K3 = 0x0F
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [0].rrr " ,  // K0_R = 0x10
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].rrr " ,  // K1_R = 0x11
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].rrr " ,  // K2_R = 0x12
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].rrr " ,  // K3_R = 0x13
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [0].ggg " ,  // K0_G = 0x14
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].ggg " ,  // K1_G = 0x15
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].ggg " ,  // K2_G = 0x16
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].ggg " ,  // K3_G = 0x17
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [0].bbb " ,  // K0_B = 0x18
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].bbb " ,  // K1_B = 0x19
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].bbb " ,  // K2_B = 0x1A
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].bbb " ,  // K3_B = 0x1B
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [0].aaa " ,  // K0_A = 0x1C
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].aaa " ,  // K1_A = 0x1D
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].aaa " ,  // K2_A = 0x1E
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].aaa " ,  // K3_A = 0x1F
 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-28 20:34:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  char  * tevKSelTableA [ ]  =  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-08-14 16:25:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" 255 " ,   // 1   = 0x00
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 223 " ,   // 7_8 = 0x01
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 191 " ,   // 3_4 = 0x02
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 159 " ,   // 5_8 = 0x03
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 13:27:00 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" 128 " ,   // 1_2 = 0x04
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 96 " ,    // 3_8 = 0x05
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 64 " ,    // 1_4 = 0x06
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 32 " ,    // 1_8 = 0x07
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0 " ,     // INVALID = 0x08
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0 " ,     // INVALID = 0x09
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0 " ,     // INVALID = 0x0a
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0 " ,     // INVALID = 0x0b
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0 " ,     // INVALID = 0x0c
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0 " ,     // INVALID = 0x0d
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0 " ,     // INVALID = 0x0e
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0 " ,     // INVALID = 0x0f
 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-10 20:26:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									I_KCOLORS " [0].r " ,  // K0_R = 0x10
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].r " ,  // K1_R = 0x11
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].r " ,  // K2_R = 0x12
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].r " ,  // K3_R = 0x13
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [0].g " ,  // K0_G = 0x14
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].g " ,  // K1_G = 0x15
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].g " ,  // K2_G = 0x16
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].g " ,  // K3_G = 0x17
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [0].b " ,  // K0_B = 0x18
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].b " ,  // K1_B = 0x19
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].b " ,  // K2_B = 0x1A
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].b " ,  // K3_B = 0x1B
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [0].a " ,  // K0_A = 0x1C
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].a " ,  // K1_A = 0x1D
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].a " ,  // K2_A = 0x1E
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].a " ,  // K3_A = 0x1F
 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-28 20:34:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  char  * tevCInputTable [ ]  =  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:28:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" prev.rgb " ,           // CPREV,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" prev.aaa " ,           // APREV,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" c0.rgb " ,             // C0,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" c0.aaa " ,             // A0,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" c1.rgb " ,             // C1,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" c1.aaa " ,             // A1,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" c2.rgb " ,             // C2,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" c2.aaa " ,             // A2,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" textemp.rgb " ,        // TEXC,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" textemp.aaa " ,        // TEXA,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" rastemp.rgb " ,        // RASC,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" rastemp.aaa " ,        // RASA,
 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 17:26:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" int3(255,255,255) " ,  // ONE
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 13:27:00 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" int3(128,128,128) " ,  // HALF
 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:28:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" konsttemp.rgb " ,      // KONST
 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 17:26:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" int3(0,0,0) " ,        // ZERO
 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-28 20:34:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  char  * tevAInputTable [ ]  =  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2014-03-24 14:41:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" prev.a " ,         // APREV,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" c0.a " ,           // A0,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" c1.a " ,           // A1,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" c2.a " ,           // A2,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" textemp.a " ,      // TEXA,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" rastemp.a " ,      // RASA,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" konsttemp.a " ,    // KONST,  (hw1 had quarter)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0 " ,              // ZERO
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * tevRasTable [ ]  =  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2014-03-17 17:11:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" iround(colors_0 * 255.0) " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" iround(colors_1 * 255.0) " , 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-11 15:47:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" ERROR13 " ,  //2
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" ERROR14 " ,  //3
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" ERROR15 " ,  //4
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-28 20:43:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (int4(1, 1, 1, 1) * alphabump) " ,  // bump alpha (0..248)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (int4(1, 1, 1, 1) * (alphabump | (alphabump >> 5))) " ,  // normalized bump alpha (0..255)
 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 16:16:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" int4(0, 0, 0, 0) " ,  // zero
 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:27:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  char  * tevCOutputTable [ ]   =  {  " prev.rgb " ,  " c0.rgb " ,  " c1.rgb " ,  " c2.rgb "  } ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * tevAOutputTable [ ]   =  {  " prev.a " ,  " c0.a " ,  " c1.a " ,  " c2.a "  } ;  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 11:37:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  char  text [ 16384 ] ;  
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  static  inline  void  WriteStage ( T &  out ,  pixel_shader_uid_data *  uid_data ,  int  n ,  API_TYPE  ApiType ,  const  char  swapModeTable [ 4 ] [ 5 ] ) ;  
						 
					
						
							
								
									
										
										
										
											2014-03-24 14:41:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  static  inline  void  WriteTevRegular ( T &  out ,  const  char *  components ,  int  bias ,  int  op ,  int  clamp ,  int  shift ) ;  
						 
					
						
							
								
									
										
										
										
											2013-08-12 12:52:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  static  inline  void  SampleTexture ( T &  out ,  const  char  * texcoords ,  const  char  * texswap ,  int  texmap ,  API_TYPE  ApiType ) ;  
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  static  inline  void  WriteAlphaTest ( T &  out ,  pixel_shader_uid_data *  uid_data ,  API_TYPE  ApiType , DSTALPHA_MODE  dstAlphaMode ,  bool  per_pixel_depth ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								template < class  T >  static  inline  void  WriteFog ( T &  out ,  pixel_shader_uid_data *  uid_data ) ;  
						 
					
						
							
								
									
										
										
										
											2013-06-17 11:37:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 23:21:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  
						 
					
						
							
								
									
										
										
										
											2013-08-12 12:52:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  inline  void  GeneratePixelShader ( T &  out ,  DSTALPHA_MODE  dstAlphaMode ,  API_TYPE  ApiType ,  u32  components )  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-03-29 21:53:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Non-uid template parameters will write to the dummy data (=> gets optimized out)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pixel_shader_uid_data  dummy_data ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									pixel_shader_uid_data *  uid_data  =  out . template  GetUidData < pixel_shader_uid_data > ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( uid_data  = =  nullptr ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data  =  & dummy_data ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 21:53:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 20:33:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . SetBuffer ( text ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-09 21:14:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  bool  is_writing_shadercode  =  ( out . GetBuffer ( )  ! =  nullptr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 20:33:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-12 13:31:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( is_writing_shadercode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										text [ sizeof ( text )  -  1 ]  =  0x7C ;   // canary
 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  numStages  =  bpmem . genMode . numtevstages  +  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  int  numTexgen  =  bpmem . genMode . numtexgens ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " //Pixel Shader for TEV stages \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-29 19:52:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " //%i TEV stages, %i texgens, %i IND stages \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										numStages ,  numTexgen ,  bpmem . genMode . numindstages ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data - > dstAlphaMode  =  dstAlphaMode ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid_data - > genMode_numindstages  =  bpmem . genMode . numindstages ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid_data - > genMode_numtevstages  =  bpmem . genMode . numtevstages ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid_data - > genMode_numtexgens  =  bpmem . genMode . numtexgens ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-08 01:04:41 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// dot product for integer vectors
 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:21:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " int idot(int3 x, int3 y) \n " 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 20:08:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									          " { \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									          " \t int3 tmp = x * y; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									          " \t return tmp.x + tmp.y + tmp.z; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									          " } \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:21:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									out . Write ( " int idot(int4 x, int4 y) \n " 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 20:08:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									          " { \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									          " \t int4 tmp = x * y; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									          " \t return tmp.x + tmp.y + tmp.z + tmp.w; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									          " } \n \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-08 01:04:41 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-17 17:11:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// rounding + casting to integer at once in a single function
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									out . Write ( " int  iround(float  x) { return int (round(x)); } \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									          " int2 iround(float2 x) { return int2(round(x)); } \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									          " int3 iround(float3 x) { return int3(round(x)); } \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									          " int4 iround(float4 x) { return int4(round(x)); } \n \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-27 22:46:29 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ApiType  = =  API_OPENGL ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-29 19:34:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Declare samplers
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  8 ;  + + i ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-10 00:06:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " SAMPLER_BINDING(%d) uniform sampler2DArray samp%d; \n " ,  i ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 18:07:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else  // D3D
 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-23 02:17:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-08 01:51:08 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Declare samplers
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  8 ;  + + i ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 18:07:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " sampler samp%d : register(s%d); \n " ,  i ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 18:07:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  8 ;  + + i ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-16 13:47:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " Texture2DArray Tex%d : register(t%d); \n " ,  i ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-23 02:17:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-14 14:36:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-01-30 16:38:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ApiType  = =  API_OPENGL ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-30 15:19:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-30 13:58:05 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " layout(std140%s) uniform PSBlock { \n " ,  g_ActiveConfig . backend_info . bSupportsBindingLayout  ?  " , binding = 1 "  :  " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-30 15:19:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-17 10:19:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-30 15:19:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " cbuffer PSBlock : register(b0) { \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-17 10:29:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" \t int4  "  I_COLORS " [4]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" \t int4  "  I_KCOLORS " [4]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" \t int4  "  I_ALPHA " ; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" \t float4  "  I_TEXDIMS " [8]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" \t int4  "  I_ZBIAS " [2]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" \t int4  "  I_INDTEXSCALE " [2]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" \t int4  "  I_INDTEXMTX " [6]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" \t int4  "  I_FOGCOLOR " ; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" \t int4  "  I_FOGI " ; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" \t float4  "  I_FOGF " [2]; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" }; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-30 16:17:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( g_ActiveConfig . bEnablePixelLighting ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-30 15:19:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-30 16:17:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " %s " ,  s_lighting_struct ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-30 15:19:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-30 16:17:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ApiType  = =  API_OPENGL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " layout(std140%s) uniform VSBlock { \n " ,  g_ActiveConfig . backend_info . bSupportsBindingLayout  ?  " , binding = 2 "  :  " " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " cbuffer VSBlock : register(b1) { \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-29 14:15:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( s_shader_uniforms ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " }; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-30 16:17:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-13 23:26:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( g_ActiveConfig . backend_info . bSupportsBBox ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-04 23:01:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ApiType  = =  API_OPENGL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												" layout(std140, binding = 3) buffer BBox { \n " 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-09 19:32:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												" \t int bbox_data[4]; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-04 23:01:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												" }; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												" globallycoherent RWBuffer<int> bbox_data : register(u2); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-13 23:26:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-02 23:40:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GenerateVSOutputStruct < T > ( out ,  ApiType ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GenerateGSOutputStruct < T > ( out ,  ApiType ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-25 02:05:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-17 09:02:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  bool  forced_early_z  =  g_ActiveConfig . backend_info . bSupportsEarlyZ  & &  bpmem . UseEarlyDepthTest ( )  & &  ( g_ActiveConfig . bFastDepthCalc  | |  bpmem . alpha_test . TestResult ( )  = =  AlphaTest : : UNDETERMINED ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  bool  per_pixel_depth  =  ( bpmem . ztex2 . op  ! =  ZTEXTURE_DISABLE  & &  bpmem . UseLateDepthTest ( ) )  | |  ( ! g_ActiveConfig . bFastDepthCalc  & &  bpmem . zmode . testenable  & &  ! forced_early_z ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-31 23:29:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-17 09:02:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( forced_early_z ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Zcomploc (aka early_ztest) is a way to control whether depth test is done before
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// or after texturing and alpha test. PC graphics APIs used to provide no way to emulate
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// this feature properly until 2012: Depth tests were always done after alpha testing.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Most importantly, it was not possible to write to the depth buffer without also writing
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// a color value (unless color writing was disabled altogether).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// OpenGL has a flag which allows the driver to still update the depth buffer if alpha
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// test fails. The driver isn't required to do this, but I (degasus) assume all of them do
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// because it's the much faster code path for the GPU.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// D3D11 also has a way to force the driver to enable early-z, so we're fine here.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if ( ApiType  = =  API_OPENGL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " layout(early_fragment_tests) in; \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " [earlydepthstencil] \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else  if  ( bpmem . UseEarlyDepthTest ( )  & &  ( g_ActiveConfig . bFastDepthCalc  | |  bpmem . alpha_test . TestResult ( )  = =  AlphaTest : : UNDETERMINED )  & &  is_writing_shadercode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										static  bool  warn_once  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( warn_once ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											WARN_LOG ( VIDEO ,  " Early z test enabled but not possible to emulate with current configuration. Make sure to enable fast depth calculations. If this message still shows up your hardware isn't able to emulate the feature properly (a GPU with D3D 11.0 / OGL 4.2 support is required). " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										warn_once  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-28 14:18:39 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ApiType  = =  API_OPENGL ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-21 05:22:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-25 00:06:29 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " out vec4 ocol0; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( dstAlphaMode  = =  DSTALPHA_DUAL_SOURCE_BLEND ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-03 20:56:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " out vec4 ocol1; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-25 14:01:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-15 11:19:52 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( per_pixel_depth ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " #define depth gl_FragDepth \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-17 08:57:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// We use the flag "centroid" to fix some MSAA rendering bugs. With MSAA, the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// pixel shader will be executed for each pixel which has at least one passed sample.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// So there may be rendered pixels where the center of the pixel isn't in the primitive.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// As the pixel shader usually renders at the center of the pixel, this position may be
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// outside the primitive. This will lead to sampling outside the texture, sign changes, ...
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// As a workaround, we interpolate at the centroid of the coveraged pixel, which
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// is always inside the primitive.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Without MSAA, this flag is defined to have no effect.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-30 23:29:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uid_data - > stereo  =  g_ActiveConfig . iStereoMode  >  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( g_ActiveConfig . iStereoMode  >  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 11:53:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-02 23:40:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " centroid in GS_OUTPUT gs; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 11:53:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " centroid in float4 colors_02; \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " centroid in float4 colors_12; \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// compute window position if needed because binding semantic WPOS is not widely supported
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Let's set up attributes
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( unsigned  int  i  =  0 ;  i  <  numTexgen ;  + + i ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												out . Write ( " centroid in float3 uv%d; \n " ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " centroid in float4 clipPos; \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( g_ActiveConfig . bEnablePixelLighting ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												out . Write ( " centroid in float4 Normal; \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-27 00:29:37 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-25 02:05:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " void main() \n { \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-12 18:21:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 11:53:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( g_ActiveConfig . iStereoMode  >  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-24 19:13:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 11:53:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// compute window position if needed because binding semantic WPOS is not widely supported
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Let's set up attributes
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( unsigned  int  i  =  0 ;  i  <  numTexgen ;  + + i ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-02 23:40:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " \t float3 uv%d = gs.vs.tex%d; \n " ,  i ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 11:53:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-02 23:40:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t float4 clipPos = gs.vs.clipPos; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 11:53:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( g_ActiveConfig . bEnablePixelLighting ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-02 23:40:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " \t float4 Normal = gs.vs.Normal; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-04 11:53:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 14:38:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-25 02:05:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// On Mali, global variables must be initialized as constants.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// This is why we initialize these variables locally instead.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-02 23:40:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t float4 colors_0 = %s; \n " ,  ( g_ActiveConfig . iStereoMode  >  0 )  ?  " gs.vs.colors_0 "  :  " colors_02 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " \t float4 colors_1 = %s; \n " ,  ( g_ActiveConfig . iStereoMode  >  0 )  ?  " gs.vs.colors_1 "  :  " colors_12 " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-25 02:05:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-30 12:36:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t float4 rawpos = gl_FragCoord; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-21 05:22:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 18:07:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else  // D3D
 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-21 05:22:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " void main( \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 18:07:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( "   out float4 ocol0 : SV_Target0,%s%s \n   in float4 rawpos : SV_Position, \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											dstAlphaMode  = =  DSTALPHA_DUAL_SOURCE_BLEND  ?  " \n   out float4 ocol1 : SV_Target1, "  :  " " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											per_pixel_depth  ?  " \n   out float depth : SV_Depth, "  :  " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-17 08:57:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( "   in centroid float4 colors_0 : COLOR0, \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-16 13:47:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( "   in centroid float4 colors_1 : COLOR1 \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-28 14:18:39 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// compute window position if needed because binding semantic WPOS is not widely supported
 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-15 14:48:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( unsigned  int  i  =  0 ;  i  <  numTexgen ;  + + i ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-17 08:57:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " , \n   in centroid float3 uv%d : TEXCOORD%d " ,  i ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " , \n   in centroid float4 clipPos : TEXCOORD%d " ,  numTexgen ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-04 16:17:14 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( g_ActiveConfig . bEnablePixelLighting ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-17 08:57:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " , \n   in centroid float4 Normal : TEXCOORD%d " ,  numTexgen  +  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-16 13:47:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uid_data - > stereo  =  g_ActiveConfig . iStereoMode  >  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( g_ActiveConfig . iStereoMode  >  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " , \n   in uint layer : SV_RenderTargetArrayIndex \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-15 14:48:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( "         ) { \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-19 04:41:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:27:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \t int4 c0 =  "  I_COLORS " [1], c1 =  "  I_COLORS " [2], c2 =  "  I_COLORS " [3], prev =  "  I_COLORS " [0]; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 20:08:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									          " \t int4 rastemp = int4(0, 0, 0, 0), textemp = int4(0, 0, 0, 0), konsttemp = int4(0, 0, 0, 0); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									          " \t int3 comp16 = int3(1, 256, 0), comp24 = int3(1, 256, 256*256); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									          " \t int alphabump=0; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									          " \t int3 tevcoord=int3(0, 0, 0); \n " 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-20 20:34:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									          " \t int2 wrappedcoord=int2(0,0), tempcoord=int2(0,0); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									          " \t int4 tevin_a=int4(0,0,0,0),tevin_b=int4(0,0,0,0),tevin_c=int4(0,0,0,0),tevin_d=int4(0,0,0,0); \n \n " ) ;  // tev combiner inputs
 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-04-04 16:17:14 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( g_ActiveConfig . bEnablePixelLighting ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-23 02:17:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-15 14:38:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t float3 _norm0 = normalize(Normal.xyz); \n \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " \t float3 pos = float3(clipPos.x,clipPos.y,Normal.w); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-23 02:17:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-27 14:43:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t int4 lacc; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												" \t float3 ldir, h; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												" \t float dist, dist2, attn; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-31 23:29:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-05-30 16:17:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// TODO: Our current constant usage code isn't able to handle more than one buffer.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//       So we can't mark the VS constant as used here. But keep them here as reference.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-30 15:59:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										//out.SetConstantsUsed(C_PLIGHT_COLORS, C_PLIGHT_COLORS+7); // TODO: Can be optimized further
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//out.SetConstantsUsed(C_PLIGHTS, C_PLIGHTS+31); // TODO: Can be optimized further
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//out.SetConstantsUsed(C_PMATERIALS, C_PMATERIALS+3);
 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uid_data - > components  =  components ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GenerateLightingShader < T > ( out ,  uid_data - > lighting ,  components ,  " colors_ " ,  " colors_ " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-23 02:17:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-15 03:55:38 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// HACK to handle cases where the tex gen is not enabled
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( numTexgen  = =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t int2 fixpoint_uv0 = int2(0, 0); \n \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_TEXDIMS ,  C_TEXDIMS + numTexgen - 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( unsigned  int  i  =  0 ;  i  <  numTexgen ;  + + i ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-30 12:36:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t int2 fixpoint_uv%d = iround( " ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// optional perspective divides
 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											uid_data - > texMtxInfo_n_projection  | =  xfmem . texMtxInfo [ i ] . projection  < <  i ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-27 11:59:04 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( xfmem . texMtxInfo [ i ] . projection  = =  XF_TEXPROJ_STQ ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-01 04:26:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-30 12:36:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " (uv%d.z == 0.0 ? uv%d.xy : uv%d.xy / uv%d.z) " ,  i ,  i ,  i ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-01 04:26:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-30 12:36:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												out . Write ( " uv%d.xy " ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-07-16 17:24:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( "  *  "  I_TEXDIMS " [%d].zw * 128.0); \n " ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-29 15:28:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// TODO: S24 overflows here?
 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// indirect texture map lookup
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-28 22:51:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  nIndirectStagesUsed  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( bpmem . genMode . numindstages  >  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( unsigned  int  i  =  0 ;  i  <  numStages ;  + + i ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( bpmem . tevind [ i ] . IsActive ( )  & &  bpmem . tevind [ i ] . bt  <  bpmem . genMode . numindstages ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												nIndirectStagesUsed  | =  1  < <  bpmem . tevind [ i ] . bt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data - > nIndirectStagesUsed  =  nIndirectStagesUsed ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( u32  i  =  0 ;  i  <  bpmem . genMode . numindstages ;  + + i ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-28 22:51:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( nIndirectStagesUsed  &  ( 1  < <  i ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:16:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											unsigned  int  texcoord  =  bpmem . tevindref . getTexCoord ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											unsigned  int  texmap  =  bpmem . tevindref . getTexMap ( i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											uid_data - > SetTevindrefValues ( i ,  texcoord ,  texmap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-09 14:13:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( texcoord  <  numTexgen ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												out . SetConstantsUsed ( C_INDTEXSCALE + i / 2 , C_INDTEXSCALE + i / 2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-29 15:52:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " \t tempcoord = fixpoint_uv%d >>  "  I_INDTEXSCALE " [%d].%s; \n " ,  texcoord ,  i  /  2 ,  ( i  &  1 )  ?  " zw "  :  " xy " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											else 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-29 15:52:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " \t tempcoord = int2(0, 0); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-11 07:05:57 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 15:40:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t int3 iindtex%d =  " ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-01-29 15:52:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											SampleTexture < T > ( out ,  " (float2(tempcoord)/128.0) " ,  " abg " ,  texmap ,  ApiType ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 14:31:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Uid fields for BuildSwapModeTable are set in WriteStage
 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-04 21:56:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									char  swapModeTable [ 4 ] [ 5 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  char *  swapColors  =  " rgba " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  4 ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										swapModeTable [ i ] [ 0 ]  =  swapColors [ bpmem . tevksel [ i * 2 ] . swap1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										swapModeTable [ i ] [ 1 ]  =  swapColors [ bpmem . tevksel [ i * 2 ] . swap2 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										swapModeTable [ i ] [ 2 ]  =  swapColors [ bpmem . tevksel [ i * 2 + 1 ] . swap1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										swapModeTable [ i ] [ 3 ]  =  swapColors [ bpmem . tevksel [ i * 2 + 1 ] . swap2 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										swapModeTable [ i ] [ 4 ]  =  ' \0 ' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( unsigned  int  i  =  0 ;  i  <  numStages ;  i + + ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 18:24:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										WriteStage < T > ( out ,  uid_data ,  i ,  ApiType ,  swapModeTable ) ;  // build the equation for this stage
 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-29 14:40:37 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-22 21:24:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define MY_STRUCT_OFFSET(str,elem) ((u32)((u64)&(str).elem-(u64)&(str))) 
  
						 
					
						
							
								
									
										
										
										
											2014-04-04 16:17:14 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  enable_pl  =  g_ActiveConfig . bEnablePixelLighting ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-25 15:02:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data - > num_values  =  ( enable_pl )  ?  sizeof ( * uid_data )  :  MY_STRUCT_OFFSET ( * uid_data , stagehash [ numStages ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-22 21:24:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( numStages ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-22 19:55:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// The results of the last texenv stage are put onto the screen,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// regardless of the used destination register
 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-11 00:30:55 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( bpmem . combiners [ numStages  -  1 ] . colorC . dest  ! =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:27:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t prev.rgb = %s; \n " ,  tevCOutputTable [ bpmem . combiners [ numStages  -  1 ] . colorC . dest ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-11 00:30:55 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( bpmem . combiners [ numStages  -  1 ] . alphaC . dest  ! =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:27:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t prev.a = %s; \n " ,  tevAOutputTable [ bpmem . combiners [ numStages  -  1 ] . alphaC . dest ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-22 19:55:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:27:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \t prev = prev & 255; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-01-08 17:18:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									AlphaTest : : TEST_RESULT  Pretest  =  bpmem . alpha_test . TestResult ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data - > Pretest  =  Pretest ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-19 21:27:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-29 01:23:17 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// NOTE: Fragment may not be discarded if alpha test always fails and early depth test is enabled
 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-19 21:27:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// (in this case we need to write a depth value if depth test passes regardless of the alpha testing result)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( Pretest  = =  AlphaTest : : UNDETERMINED  | |  ( Pretest  = =  AlphaTest : : FAIL  & &  bpmem . UseLateDepthTest ( ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 21:53:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										WriteAlphaTest < T > ( out ,  uid_data ,  ApiType ,  dstAlphaMode ,  per_pixel_depth ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-13 16:14:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// FastDepth means to trust the depth generated in perspective division.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-13 14:59:59 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// It should be correct, but it seems not to be as accurate as required. TODO: Find out why!
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// For disabled FastDepth we just calculate the depth value again.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// The performance impact of this additional calculation doesn't matter, but it prevents
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// the host GPU driver from performing any early depth test optimizations.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 18:07:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( g_ActiveConfig . bFastDepthCalc ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-17 17:11:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t int zCoord = iround(rawpos.z * float(0xFFFFFF)); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-04 20:12:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_ZBIAS + 1 ,  C_ZBIAS + 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-09 17:48:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// the screen space depth value = far z + (clip z / clip w) * z range
 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-17 17:11:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t int zCoord =  "  I_ZBIAS " [1].x + iround((clipPos.z / clipPos.w) * float( "  I_ZBIAS " [1].y)); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-15 00:52:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// depth texture can safely be ignored if the result won't be written to the depth buffer (early_ztest) and isn't used for fog either
 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:51:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  bool  skip_ztexture  =  ! per_pixel_depth  & &  ! bpmem . fog . c_proj_fsel . fsel ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:05:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data - > ztex_op  =  bpmem . ztex2 . op ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid_data - > per_pixel_depth  =  per_pixel_depth ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid_data - > forced_early_z  =  forced_early_z ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid_data - > fast_depth_calc  =  g_ActiveConfig . bFastDepthCalc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid_data - > early_ztest  =  bpmem . UseEarlyDepthTest ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid_data - > fog_fsel  =  bpmem . fog . c_proj_fsel . fsel ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-15 00:52:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-10 12:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Note: z-textures are not written to depth buffer if early depth test is used
 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 14:38:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( per_pixel_depth  & &  bpmem . UseEarlyDepthTest ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 18:25:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t depth = float(zCoord) / float(0xFFFFFF); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:05:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-29 23:14:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Note: depth texture output is only written to depth buffer if late depth test is used
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// theoretical final depth value is used for fog calculation, though, so we have to emulate ztextures anyway
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-15 00:52:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( bpmem . ztex2 . op  ! =  ZTEXTURE_DISABLE  & &  ! skip_ztexture ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-25 00:01:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:27:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// use the texture input of the last texture stage (textemp), hopefully this has been read and is in correct format...
 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_ZBIAS ,  C_ZBIAS + 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:27:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t zCoord = idot( "  I_ZBIAS " [0].xyzw, textemp.xyzw) +  "  I_ZBIAS " [1].w %s; \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-08 16:40:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																	( bpmem . ztex2 . op  = =  ZTEXTURE_ADD )  ?  " + zCoord "  :  " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 18:25:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t zCoord = zCoord & 0xFFFFFF; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-29 23:14:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 14:38:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( per_pixel_depth  & &  bpmem . UseLateDepthTest ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 18:25:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t depth = float(zCoord) / float(0xFFFFFF); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-20 03:11:22 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dstAlphaMode  = =  DSTALPHA_ALPHA_PASS ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_ALPHA ,  C_ALPHA ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:27:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t ocol0 = float4(float3(prev.rgb), float( "  I_ALPHA " .a)) / 255.0; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-25 00:01:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-18 07:52:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										WriteFog < T > ( out ,  uid_data ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:27:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t ocol0 = float4(prev) / 255.0; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-25 00:01:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-04-25 14:01:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Use dual-source color blending to perform dst alpha in a single pass
 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dstAlphaMode  = =  DSTALPHA_DUAL_SOURCE_BLEND ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-25 00:01:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_ALPHA ,  C_ALPHA ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 18:07:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Colors will be blended against the alpha from ocol1 and
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// the alpha from ocol0 will be written to the framebuffer.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:27:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t ocol1 = float4(prev) / 255.0; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-10 20:36:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t ocol0.a = float( "  I_ALPHA " .a) / 255.0; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-25 00:01:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-25 14:01:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-11-13 23:26:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( g_ActiveConfig . backend_info . bSupportsBBox  & &  BoundingBox : : active ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data - > bounding_box  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-09 19:32:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  char *  atomic_op  =  ApiType  = =  API_OPENGL  ?  " atomic "  :  " Interlocked " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" \t if(bbox_data[0] > int(rawpos.x)) %sMin(bbox_data[0], int(rawpos.x)); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" \t if(bbox_data[1] < int(rawpos.x)) %sMax(bbox_data[1], int(rawpos.x)); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" \t if(bbox_data[2] > int(rawpos.y)) %sMin(bbox_data[2], int(rawpos.y)); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" \t if(bbox_data[3] < int(rawpos.y)) %sMax(bbox_data[3], int(rawpos.y)); \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											atomic_op ,  atomic_op ,  atomic_op ,  atomic_op ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-13 23:26:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " } \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 21:53:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-12 13:31:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( is_writing_shadercode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( text [ sizeof ( text )  -  1 ]  ! =  0x7C ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											PanicAlert ( " PixelShader generator - buffer too small, canary has been eaten! " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-10-29 03:28:38 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 23:21:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  inline  void  WriteStage ( T &  out ,  pixel_shader_uid_data *  uid_data ,  int  n ,  API_TYPE  ApiType ,  const  char  swapModeTable [ 4 ] [ 5 ] )  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  texcoord  =  bpmem . tevorders [ n / 2 ] . getTexCoord ( n & 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  bHasTexCoord  =  ( u32 ) texcoord  <  bpmem . genMode . numtexgens ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-04 21:36:09 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  bHasIndStage  =  bpmem . tevind [ n ] . bt  <  bpmem . genMode . numindstages ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// HACK to handle cases where the tex gen is not enabled
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! bHasTexCoord ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										texcoord  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-03-05 05:10:25 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-16 17:24:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \n \t // TEV stage %d \n " ,  n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 21:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data - > stagehash [ n ] . hasindstage  =  bHasIndStage ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid_data - > stagehash [ n ] . tevorders_texcoord  =  texcoord ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( bHasIndStage ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uid_data - > stagehash [ n ] . tevind  =  bpmem . tevind [ n ] . hex  &  0x7FFFFF ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t // indirect op \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 16:08:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// perform the indirect op on the incoming regular coordinates using iindtex%d as the offset coords
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( bpmem . tevind [ n ] . bs  ! =  ITBA_OFF ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-12 13:55:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											const  char  * tevIndAlphaSel [ ]    =  { " " ,  " x " ,  " y " ,  " z " } ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 18:25:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											const  char  * tevIndAlphaMask [ ]  =  { " 248 " ,  " 224 " ,  " 240 " ,  " 248 " } ;  // 0b11111000, 0b11100000, 0b11110000, 0b11111000
 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 18:24:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " alphabump = iindtex%d.%s & %s; \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													bpmem . tevind [ n ] . bt , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													tevIndAlphaSel [ bpmem . tevind [ n ] . bs ] , 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 16:08:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													tevIndAlphaMask [ bpmem . tevind [ n ] . fmt ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-12 13:55:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// TODO: Should we reset alphabump to 0 here?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( bpmem . tevind [ n ] . mid  ! =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-04 21:36:09 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// format
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  char  * tevIndFmtMask [ ]  =  {  " 255 " ,  " 31 " ,  " 15 " ,  " 7 "  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " \t int3 iindtevcrd%d = iindtex%d & %s; \n " ,  n ,  bpmem . tevind [ n ] . bt ,  tevIndFmtMask [ bpmem . tevind [ n ] . fmt ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// bias - TODO: Check if this needs to be this complicated..
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  char  * tevIndBiasField [ ]  =  {  " " ,  " x " ,  " y " ,  " xy " ,  " z " ,  " xz " ,  " yz " ,  " xyz "  } ;  // indexed by bias
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  char  * tevIndBiasAdd [ ]  =  {  " -128 " ,  " 1 " ,  " 1 " ,  " 1 "  } ;  // indexed by fmt
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( bpmem . tevind [ n ] . bias  = =  ITB_S  | |  bpmem . tevind [ n ] . bias  = =  ITB_T  | |  bpmem . tevind [ n ] . bias  = =  ITB_U ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												out . Write ( " \t iindtevcrd%d.%s += int(%s); \n " ,  n ,  tevIndBiasField [ bpmem . tevind [ n ] . bias ] ,  tevIndBiasAdd [ bpmem . tevind [ n ] . fmt ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											else  if  ( bpmem . tevind [ n ] . bias  = =  ITB_ST  | |  bpmem . tevind [ n ] . bias  = =  ITB_SU  | |  bpmem . tevind [ n ] . bias  = =  ITB_TU ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												out . Write ( " \t iindtevcrd%d.%s += int2(%s, %s); \n " ,  n ,  tevIndBiasField [ bpmem . tevind [ n ] . bias ] ,  tevIndBiasAdd [ bpmem . tevind [ n ] . fmt ] ,  tevIndBiasAdd [ bpmem . tevind [ n ] . fmt ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											else  if  ( bpmem . tevind [ n ] . bias  = =  ITB_STU ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												out . Write ( " \t iindtevcrd%d.%s += int3(%s, %s, %s); \n " ,  n ,  tevIndBiasField [ bpmem . tevind [ n ] . bias ] ,  tevIndBiasAdd [ bpmem . tevind [ n ] . fmt ] ,  tevIndBiasAdd [ bpmem . tevind [ n ] . fmt ] ,  tevIndBiasAdd [ bpmem . tevind [ n ] . fmt ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// multiply by offset matrix and scale - calculations are likely to overflow badly,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// yet it works out since we only care about the lower 23 bits (+1 sign bit) of the result
 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-09 14:13:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( bpmem . tevind [ n ] . mid  < =  3 ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  mtxidx  =  2 * ( bpmem . tevind [ n ] . mid - 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . SetConstantsUsed ( C_INDTEXMTX + mtxidx ,  C_INDTEXMTX + mtxidx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-12 13:55:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " \t int2 indtevtrans%d = int2(idot( "  I_INDTEXMTX " [%d].xyz, iindtevcrd%d), idot( "  I_INDTEXMTX " [%d].xyz, iindtevcrd%d)) >> 3; \n " ,  n ,  mtxidx ,  n ,  mtxidx + 1 ,  n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-10 21:09:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-05 13:26:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// TODO: should use a shader uid branch for this for better performance
 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " \t if ( "  I_INDTEXMTX " [%d].w >= 0) indtevtrans%d = indtevtrans%d >>  "  I_INDTEXMTX " [%d].w; \n " ,  mtxidx ,  n ,  n ,  mtxidx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												out . Write ( " \t else indtevtrans%d = indtevtrans%d << (- "  I_INDTEXMTX " [%d].w); \n " ,  n ,  n ,  mtxidx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-09 14:13:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											else  if  ( bpmem . tevind [ n ] . mid  < =  7  & &  bHasTexCoord ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											{  // s matrix
 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 23:32:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												_assert_ ( bpmem . tevind [ n ] . mid  > =  5 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  mtxidx  =  2 * ( bpmem . tevind [ n ] . mid - 5 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . SetConstantsUsed ( C_INDTEXMTX + mtxidx ,  C_INDTEXMTX + mtxidx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " \t int2 indtevtrans%d = int2(fixpoint_uv%d * iindtevcrd%d.xx) >> 8; \n " ,  n ,  texcoord ,  n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-10 21:09:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " \t if ( "  I_INDTEXMTX " [%d].w >= 0) indtevtrans%d = indtevtrans%d >>  "  I_INDTEXMTX " [%d].w; \n " ,  mtxidx ,  n ,  n ,  mtxidx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												out . Write ( " \t else indtevtrans%d = indtevtrans%d << (- "  I_INDTEXMTX " [%d].w); \n " ,  n ,  n ,  mtxidx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-09 14:13:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											else  if  ( bpmem . tevind [ n ] . mid  < =  11  & &  bHasTexCoord ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											{  // t matrix
 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 23:32:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												_assert_ ( bpmem . tevind [ n ] . mid  > =  9 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  mtxidx  =  2 * ( bpmem . tevind [ n ] . mid - 9 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . SetConstantsUsed ( C_INDTEXMTX + mtxidx ,  C_INDTEXMTX + mtxidx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " \t int2 indtevtrans%d = int2(fixpoint_uv%d * iindtevcrd%d.yy) >> 8; \n " ,  n ,  texcoord ,  n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-10 21:09:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " \t if ( "  I_INDTEXMTX " [%d].w >= 0) indtevtrans%d = indtevtrans%d >>  "  I_INDTEXMTX " [%d].w; \n " ,  mtxidx ,  n ,  n ,  mtxidx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												out . Write ( " \t else indtevtrans%d = indtevtrans%d << (- "  I_INDTEXMTX " [%d].w); \n " ,  n ,  n ,  mtxidx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											else 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " \t int2 indtevtrans%d = int2(0, 0); \n " ,  n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t int2 indtevtrans%d = int2(0, 0); \n " ,  n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// ---------
 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Wrapping
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// ---------
 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-02 11:42:30 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  char  * tevIndWrapStart [ ]   =  { " 0 " ,  " (256<<7) " ,  " (128<<7) " ,  " (64<<7) " ,  " (32<<7) " ,  " (16<<7) " ,  " 1 "  } ;  // TODO: Should the last one be 1 or (1<<7)?
 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// wrap S
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( bpmem . tevind [ n ] . sw  = =  ITW_OFF ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t wrappedcoord.x = fixpoint_uv%d.x; \n " ,  texcoord ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( bpmem . tevind [ n ] . sw  = =  ITW_0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t wrappedcoord.x = 0; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t wrappedcoord.x = fixpoint_uv%d.x %% %s; \n " ,  texcoord ,  tevIndWrapStart [ bpmem . tevind [ n ] . sw ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// wrap T
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( bpmem . tevind [ n ] . tw  = =  ITW_OFF ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t wrappedcoord.y = fixpoint_uv%d.y; \n " ,  texcoord ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( bpmem . tevind [ n ] . tw  = =  ITW_0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t wrappedcoord.y = 0; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t wrappedcoord.y = fixpoint_uv%d.y %% %s; \n " ,  texcoord ,  tevIndWrapStart [ bpmem . tevind [ n ] . tw ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( bpmem . tevind [ n ] . fb_addprev )  // add previous tevcoord
 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t tevcoord.xy += wrappedcoord + indtevtrans%d; \n " ,  n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t tevcoord.xy = wrappedcoord + indtevtrans%d; \n " ,  n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-12 13:55:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Emulate s24 overflows
 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t tevcoord.xy = (tevcoord.xy << 8) >> 8; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-08-16 22:37:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									TevStageCombiner : : ColorCombiner  & cc  =  bpmem . combiners [ n ] . colorC ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									TevStageCombiner : : AlphaCombiner  & ac  =  bpmem . combiners [ n ] . alphaC ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data - > stagehash [ n ] . cc  =  cc . hex  &  0xFFFFFF ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid_data - > stagehash [ n ] . ac  =  ac . hex  &  0xFFFFF0 ;  // Storing rswap and tswap later
 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 18:30:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-11 00:30:55 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cc . a  = =  TEVCOLORARG_RASA  | |  cc . a  = =  TEVCOLORARG_RASC  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   cc . b  = =  TEVCOLORARG_RASA  | |  cc . b  = =  TEVCOLORARG_RASC  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   cc . c  = =  TEVCOLORARG_RASA  | |  cc . c  = =  TEVCOLORARG_RASC  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   cc . d  = =  TEVCOLORARG_RASA  | |  cc . d  = =  TEVCOLORARG_RASC  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   ac . a  = =  TEVALPHAARG_RASA  | |  ac . b  = =  TEVALPHAARG_RASA  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   ac . c  = =  TEVALPHAARG_RASA  | |  ac . d  = =  TEVALPHAARG_RASA ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-16 22:37:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  int  i  =  bpmem . combiners [ n ] . alphaC . rswap ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uid_data - > stagehash [ n ] . ac  | =  bpmem . combiners [ n ] . alphaC . rswap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data - > stagehash [ n ] . tevksel_swap1a  =  bpmem . tevksel [ i * 2 ] . swap1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data - > stagehash [ n ] . tevksel_swap2a  =  bpmem . tevksel [ i * 2 ] . swap2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data - > stagehash [ n ] . tevksel_swap1b  =  bpmem . tevksel [ i * 2 + 1 ] . swap1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data - > stagehash [ n ] . tevksel_swap2b  =  bpmem . tevksel [ i * 2 + 1 ] . swap2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data - > stagehash [ n ] . tevorders_colorchan  =  bpmem . tevorders [ n  /  2 ] . getColorChan ( n  &  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-04 21:56:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  char  * rasswap  =  swapModeTable [ bpmem . combiners [ n ] . alphaC . rswap ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:27:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t rastemp = %s.%s; \n " ,  tevRasTable [ bpmem . tevorders [ n  /  2 ] . getColorChan ( n  &  1 ) ] ,  rasswap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-16 22:37:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data - > stagehash [ n ] . tevorders_enable  =  bpmem . tevorders [ n  /  2 ] . getEnable ( n  &  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( bpmem . tevorders [ n / 2 ] . getEnable ( n & 1 ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-12 13:55:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  texmap  =  bpmem . tevorders [ n / 2 ] . getTexMap ( n & 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! bHasIndStage ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// calc tevcord
 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-11 00:30:55 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( bHasTexCoord ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " \t tevcoord.xy = fixpoint_uv%d; \n " ,  texcoord ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											else 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " \t tevcoord.xy = int2(0, 0); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  int  i  =  bpmem . combiners [ n ] . alphaC . tswap ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uid_data - > stagehash [ n ] . ac  | =  bpmem . combiners [ n ] . alphaC . tswap  < <  2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data - > stagehash [ n ] . tevksel_swap1c  =  bpmem . tevksel [ i * 2 ] . swap1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data - > stagehash [ n ] . tevksel_swap2c  =  bpmem . tevksel [ i * 2 ] . swap2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data - > stagehash [ n ] . tevksel_swap1d  =  bpmem . tevksel [ i * 2 + 1 ] . swap1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data - > stagehash [ n ] . tevksel_swap2d  =  bpmem . tevksel [ i * 2 + 1 ] . swap2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-22 20:41:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uid_data - > stagehash [ n ] . tevorders_texmap =  bpmem . tevorders [ n / 2 ] . getTexMap ( n & 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-04 21:56:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  char  * texswap  =  swapModeTable [ bpmem . combiners [ n ] . alphaC . tswap ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uid_data - > SetTevindrefTexmap ( i ,  texmap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-12 13:31:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:27:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t textemp =  " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-11-02 11:42:30 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										SampleTexture < T > ( out ,  " (float2(tevcoord.xy)/128.0) " ,  texswap ,  texmap ,  ApiType ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:27:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t textemp = int4(255, 255, 255, 255); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-11 00:30:55 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cc . a  = =  TEVCOLORARG_KONST  | |  cc . b  = =  TEVCOLORARG_KONST  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    cc . c  = =  TEVCOLORARG_KONST  | |  cc . d  = =  TEVCOLORARG_KONST  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    ac . a  = =  TEVALPHAARG_KONST  | |  ac . b  = =  TEVALPHAARG_KONST  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									    ac . c  = =  TEVALPHAARG_KONST  | |  ac . d  = =  TEVALPHAARG_KONST ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-16 22:37:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 21:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  kc  =  bpmem . tevksel [ n  /  2 ] . getKC ( n  &  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  ka  =  bpmem . tevksel [ n  /  2 ] . getKA ( n  &  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uid_data - > stagehash [ n ] . tevksel_kc  =  kc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data - > stagehash [ n ] . tevksel_ka  =  ka ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:27:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t konsttemp = int4(%s, %s); \n " ,  tevKSelTableC [ kc ] ,  tevKSelTableA [ ka ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 16:25:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( kc  >  7 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . SetConstantsUsed ( C_KCOLORS + ( ( kc - 0xc ) % 4 ) , C_KCOLORS + ( ( kc - 0xc ) % 4 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ka  >  7 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . SetConstantsUsed ( C_KCOLORS + ( ( ka - 0xc ) % 4 ) , C_KCOLORS + ( ( ka - 0xc ) % 4 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-16 22:37:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 20:59:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cc . d  = =  TEVCOLORARG_C0  | |  cc . d  = =  TEVCOLORARG_A0  | |  ac . d  = =  TEVALPHAARG_A0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_COLORS + 1 , C_COLORS + 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 20:59:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cc . d  = =  TEVCOLORARG_C1  | |  cc . d  = =  TEVCOLORARG_A1  | |  ac . d  = =  TEVALPHAARG_A1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_COLORS + 2 , C_COLORS + 2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 20:59:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cc . d  = =  TEVCOLORARG_C2  | |  cc . d  = =  TEVCOLORARG_A2  | |  ac . d  = =  TEVALPHAARG_A2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_COLORS + 3 , C_COLORS + 3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 20:59:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cc . dest  > =  GX_TEVREG0  & &  cc . dest  < =  GX_TEVREG2 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_COLORS + cc . dest ,  C_COLORS + cc . dest ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 20:59:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ac . dest  > =  GX_TEVREG0  & &  ac . dest  < =  GX_TEVREG2 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_COLORS + ac . dest ,  C_COLORS + ac . dest ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-20 20:34:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-16 17:24:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \t tevin_a = int4(%s, %s)&255; \n " ,  tevCInputTable [ cc . a ] ,  tevAInputTable [ ac . a ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									out . Write ( " \t tevin_b = int4(%s, %s)&255; \n " ,  tevCInputTable [ cc . b ] ,  tevAInputTable [ ac . b ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									out . Write ( " \t tevin_c = int4(%s, %s)&255; \n " ,  tevCInputTable [ cc . c ] ,  tevAInputTable [ ac . c ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									out . Write ( " \t tevin_d = int4(%s, %s); \n " ,  tevCInputTable [ cc . d ] ,  tevAInputTable [ ac . d ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-20 20:34:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-01 14:08:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \t // color combine \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									out . Write ( " \t %s = clamp( " ,  tevCOutputTable [ cc . dest ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-24 14:41:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cc . bias  ! =  TevBias_COMPARE ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-24 14:41:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										WriteTevRegular ( out ,  " rgb " ,  cc . bias ,  cc . op ,  cc . clamp ,  cc . shift ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:28:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  char  * function_table [ ]  = 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-28 20:24:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-20 20:34:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											" ((tevin_a.r > tevin_b.r) ? tevin_c.rgb : int3(0,0,0)) " ,  // TEVCMP_R8_GT
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" ((tevin_a.r == tevin_b.r) ? tevin_c.rgb : int3(0,0,0)) " ,  // TEVCMP_R8_EQ
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" ((idot(tevin_a.rgb, comp16) >  idot(tevin_b.rgb, comp16)) ? tevin_c.rgb : int3(0,0,0)) " ,  // TEVCMP_GR16_GT
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" ((idot(tevin_a.rgb, comp16) == idot(tevin_b.rgb, comp16)) ? tevin_c.rgb : int3(0,0,0)) " ,  // TEVCMP_GR16_EQ
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" ((idot(tevin_a.rgb, comp24) >  idot(tevin_b.rgb, comp24)) ? tevin_c.rgb : int3(0,0,0)) " ,  // TEVCMP_BGR24_GT
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" ((idot(tevin_a.rgb, comp24) == idot(tevin_b.rgb, comp24)) ? tevin_c.rgb : int3(0,0,0)) " ,  // TEVCMP_BGR24_EQ
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" (max(sign(tevin_a.rgb - tevin_b.rgb), int3(0,0,0)) * tevin_c.rgb) " ,  // TEVCMP_RGB8_GT
 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-15 23:35:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											" ((int3(1,1,1) - sign(abs(tevin_a.rgb - tevin_b.rgb))) * tevin_c.rgb) "  // TEVCMP_RGB8_EQ
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-28 20:24:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  mode  =  ( cc . shift < < 1 ) | cc . op ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-20 20:34:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( "    tevin_d.rgb +  " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( function_table [ mode ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cc . clamp ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 18:24:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " , int3(0,0,0), int3(255,255,255)) " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 18:54:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " , int3(-1024,-1024,-1024), int3(1023,1023,1023)) " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 18:24:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " ; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 18:54:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \t // alpha combine \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									out . Write ( " \t %s = clamp( " ,  tevAOutputTable [ ac . dest ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-24 14:41:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ac . bias  ! =  TevBias_COMPARE ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-24 14:41:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										WriteTevRegular ( out ,  " a " ,  ac . bias ,  ac . op ,  ac . clamp ,  ac . shift ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:28:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  char  * function_table [ ]  = 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-28 20:24:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-20 20:34:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											" ((tevin_a.r > tevin_b.r) ? tevin_c.a : 0) " ,  // TEVCMP_R8_GT
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" ((tevin_a.r == tevin_b.r) ? tevin_c.a : 0) " ,  // TEVCMP_R8_EQ
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" ((idot(tevin_a.rgb, comp16) >  idot(tevin_b.rgb, comp16)) ? tevin_c.a : 0) " ,  // TEVCMP_GR16_GT
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" ((idot(tevin_a.rgb, comp16) == idot(tevin_b.rgb, comp16)) ? tevin_c.a : 0) " ,  // TEVCMP_GR16_EQ
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" ((idot(tevin_a.rgb, comp24) >  idot(tevin_b.rgb, comp24)) ? tevin_c.a : 0) " ,  // TEVCMP_BGR24_GT
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" ((idot(tevin_a.rgb, comp24) == idot(tevin_b.rgb, comp24)) ? tevin_c.a : 0) " ,  // TEVCMP_BGR24_EQ
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" ((tevin_a.a >  tevin_b.a) ? tevin_c.a : 0) " ,  // TEVCMP_A8_GT
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" ((tevin_a.a == tevin_b.a) ? tevin_c.a : 0) "  // TEVCMP_A8_EQ
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-28 20:24:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  mode  =  ( ac . shift < < 1 ) | ac . op ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-20 20:34:51 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( "    tevin_d.a +  " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( function_table [ mode ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ac . clamp ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 18:24:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " , 0, 255) " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 18:54:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " , -1024, 1023) " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-16 17:24:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " ; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-24 14:41:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  inline  void  WriteTevRegular ( T &  out ,  const  char *  components ,  int  bias ,  int  op ,  int  clamp ,  int  shift )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  char  * tevScaleTableLeft [ ]  = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" " ,        // SCALE_1
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"  << 1 " ,   // SCALE_2
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"  << 2 " ,   // SCALE_4
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" " ,        // DIVIDE_2
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  char  * tevScaleTableRight [ ]  = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" " ,        // SCALE_1
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" " ,        // SCALE_2
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" " ,        // SCALE_4
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"  >> 1 " ,   // DIVIDE_2
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  char  * tevLerpBias [ ]  =  // indexed by 2*op+(shift==3)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"  + 128 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"  + 127 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  char  * tevBiasTable [ ]  = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" " ,         // ZERO,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"  + 128 " ,   // ADDHALF,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"  - 128 " ,   // SUBHALF,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  char  * tevOpTable [ ]  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" + " ,       // TEVOP_ADD = 0,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" - " ,       // TEVOP_SUB = 1,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Regular TEV stage: (d + bias + lerp(a,b,c)) * scale
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// The GC/Wii GPU uses a very sophisticated algorithm for scale-lerping:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// - c is scaled from 0..255 to 0..256, which allows dividing the result by 256 instead of 255
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// - if scale is bigger than one, it is moved inside the lerp calculation for increased accuracy
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// - a rounding bias is added before dividing by 256
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									out . Write ( " (((tevin_d.%s%s)%s) " ,  components ,  tevBiasTable [ bias ] ,  tevScaleTableLeft [ shift ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									out . Write ( "  %s  " ,  tevOpTable [ op ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-14 12:34:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " (((((tevin_a.%s<<8) + (tevin_b.%s-tevin_a.%s)*(tevin_c.%s+(tevin_c.%s>>7)))%s)%s)>>8) " , 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-24 14:41:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									          components ,  components ,  components ,  components ,  components , 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-15 16:47:01 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									          tevScaleTableLeft [ shift ] ,  tevLerpBias [ 2 * op + ( shift ! = 3 ) ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-24 14:41:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " )%s " ,  tevScaleTableRight [ shift ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 23:21:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  
						 
					
						
							
								
									
										
										
										
											2013-08-14 13:21:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  inline  void  SampleTexture ( T &  out ,  const  char  * texcoords ,  const  char  * texswap ,  int  texmap ,  API_TYPE  ApiType )  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . SetConstantsUsed ( C_TEXDIMS + texmap , C_TEXDIMS + texmap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-12 13:31:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 18:07:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ApiType  = =  API_D3D ) 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-16 13:47:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " iround(255.0 * Tex%d.Sample(samp%d, float3(%s.xy *  "  I_TEXDIMS " [%d].xy, %s))).%s; \n " ,  texmap ,  texmap ,  texcoords ,  texmap ,  g_ActiveConfig . iStereoMode  >  0  ?  " layer "  :  " 0 " ,  texswap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 15:40:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2014-11-02 23:40:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " iround(255.0 * texture(samp%d, float3(%s.xy *  "  I_TEXDIMS " [%d].xy, %s))).%s; \n " ,  texmap ,  texcoords ,  texmap ,  g_ActiveConfig . iStereoMode  >  0  ?  " gs.layer "  :  " 0.0 " ,  texswap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  char  * tevAlphaFuncsTable [ ]  =  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-08-14 15:06:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (false) " , 					// NEVER
 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:27:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (prev.a <  %s) " , 			// LESS
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (prev.a == %s) " , 			// EQUAL
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (prev.a <= %s) " , 			// LEQUAL
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (prev.a >  %s) " , 			// GREATER
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (prev.a != %s) " , 			// NEQUAL
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (prev.a >= %s) " , 			// GEQUAL
 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-14 15:06:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (true) " 					// ALWAYS
 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-25 02:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * tevAlphaFunclogicTable [ ]  =  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"  &&  " ,  // and
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"  ||  " ,  // or
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"  !=  " ,  // xor
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"  ==  "   // xnor
 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-25 02:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
									
										
										
										
											2013-01-08 16:40:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 23:21:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  inline  void  WriteAlphaTest ( T &  out ,  pixel_shader_uid_data *  uid_data ,  API_TYPE  ApiType ,  DSTALPHA_MODE  dstAlphaMode ,  bool  per_pixel_depth )  
						 
					
						
							
								
									
										
										
										
											2010-10-10 14:35:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-09-29 21:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  const  char  * alphaRef [ 2 ]  = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-10 20:36:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										I_ALPHA " .r " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										I_ALPHA " .g " 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									out . SetConstantsUsed ( C_ALPHA ,  C_ALPHA ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-10 14:35:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-03 00:29:50 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( DriverDetails : : HasBug ( DriverDetails : : BUG_BROKENNEGATEDBOOLEAN ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " \t if((  " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " \t if(!(  " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data - > alpha_test_comp0  =  bpmem . alpha_test . comp0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid_data - > alpha_test_comp1  =  bpmem . alpha_test . comp1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid_data - > alpha_test_logic  =  bpmem . alpha_test . logic ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Lookup the first component from the alpha function table
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-08 17:18:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  compindex  =  bpmem . alpha_test . comp0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( tevAlphaFuncsTable [ compindex ] ,  alphaRef [ 0 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-05 13:26:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " %s " ,  tevAlphaFunclogicTable [ bpmem . alpha_test . logic ] ) ;  // lookup the logic op
 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Lookup the second component from the alpha function table
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-08 17:18:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									compindex  =  bpmem . alpha_test . comp1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( tevAlphaFuncsTable [ compindex ] ,  alphaRef [ 1 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-03 00:29:50 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( DriverDetails : : HasBug ( DriverDetails : : BUG_BROKENNEGATEDBOOLEAN ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " ) == false) { \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " )) { \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-04 04:44:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-06 03:12:13 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \t \t ocol0 = float4(0.0, 0.0, 0.0, 0.0); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dstAlphaMode  = =  DSTALPHA_DUAL_SOURCE_BLEND ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-06 03:12:13 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t \t ocol1 = float4(0.0, 0.0, 0.0, 0.0); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-11 00:30:55 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( per_pixel_depth ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-10-06 03:12:13 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t \t depth = 1.0; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-17 09:02:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// ZCOMPLOC HACK:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// The only way to emulate alpha test + early-z is to force early-z in the shader.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// As this isn't available on all drivers and as we can't emulate this feature otherwise,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// we are only able to choose which one we want to respect more.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Tests seem to have proven that writing depth even when the alpha test fails is more
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// important that a reliable alpha test, so we just force the alpha test to always succeed.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// At least this seems to be less buggy.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data - > alpha_test_use_zcomploc_hack  =  bpmem . UseEarlyDepthTest ( )  & &  bpmem . zmode . updateenable  & &  ! g_ActiveConfig . backend_info . bSupportsEarlyZ ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! uid_data - > alpha_test_use_zcomploc_hack ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t \t discard; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-22 18:07:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ApiType  ! =  API_D3D ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t \t return; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-04 04:44:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-07-16 17:24:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \t } \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2009-02-19 04:41:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-10-25 02:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  char  * tevFogFuncsTable [ ]  =  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2014-02-16 15:30:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" " ,                                                       // No Fog
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" " ,                                                       // ?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" " ,                                                       // Linear
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" " ,                                                       // ?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" \t fog = 1.0 - exp2(-8.0 * fog); \n " ,                      // exp
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" \t fog = 1.0 - exp2(-8.0 * fog * fog); \n " ,                // exp2
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" \t fog = exp2(-8.0 * (1.0 - fog)); \n " ,                    // backward exp
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" \t fog = 1.0 - fog; \n    fog = exp2(-8.0 * fog * fog); \n "  // backward exp2
 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-25 02:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 23:21:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  inline  void  WriteFog ( T &  out ,  pixel_shader_uid_data *  uid_data )  
						 
					
						
							
								
									
										
										
										
											2009-02-19 04:41:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data - > fog_fsel  =  bpmem . fog . c_proj_fsel . fsel ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-11 00:30:55 +13:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( bpmem . fog . c_proj_fsel . fsel  = =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ;  // no Fog
 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-19 04:41:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data - > fog_proj  =  bpmem . fog . c_proj_fsel . proj ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 18:30:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-10-27 13:10:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . SetConstantsUsed ( C_FOGCOLOR ,  C_FOGCOLOR ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-16 13:08:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . SetConstantsUsed ( C_FOGI ,  C_FOGI ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									out . SetConstantsUsed ( C_FOGF ,  C_FOGF + 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( bpmem . fog . c_proj_fsel . proj  = =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// perspective
 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-23 13:57:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// ze = A/(B - (Zs >> B_SHF)
 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-16 13:08:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// TODO: Verify that we want to drop lower bits here! (currently taken over from software renderer)
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-28 20:53:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										//       Maybe we want to use "ze = (A << B_SHF)/((B << B_SHF) - Zs)" instead?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//       That's equivalent, but keeps the lower bits of Zs.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-03 19:23:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t float ze = ( "  I_FOGF " [1].x * 16777215.0) / float( "  I_FOGI " .y - (zCoord >>  "  I_FOGI " .w)); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-25 02:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// orthographic
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-16 15:30:18 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// ze = a*Zs    (here, no B_SHF)
 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-16 13:08:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t float ze =  "  I_FOGF " [1].x * float(zCoord) / 16777215.0; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-11-23 13:57:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// x_adjust = sqrt((x-center)^2 + k^2)/k
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// ze *= x_adjust
 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-16 13:08:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// TODO Instead of this theoretical calculation, we should use the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									//      coefficient table given in the fog range BP registers!
 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-21 02:52:45 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data - > fog_RangeBaseEnabled  =  bpmem . fogRange . Base . Enabled ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( bpmem . fogRange . Base . Enabled ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 04:31:56 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-16 13:08:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_FOGF ,  C_FOGF ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-30 12:19:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t float x_adjust = (2.0 * (rawpos.x /  "  I_FOGF " [0].y)) - 1.0 -  "  I_FOGF " [0].x; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-12-16 13:08:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t x_adjust = sqrt(x_adjust * x_adjust +  "  I_FOGF " [0].z *  "  I_FOGF " [0].z) /  "  I_FOGF " [0].z; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t ze *= x_adjust; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 04:31:56 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-19 04:41:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-12-16 13:08:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \t float fog = clamp(ze -  "  I_FOGF " [1].z, 0.0, 1.0); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-19 04:41:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( bpmem . fog . c_proj_fsel . fsel  >  3 ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-25 02:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " %s " ,  tevFogFuncsTable [ bpmem . fog . c_proj_fsel . fsel ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-25 02:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-09 21:14:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( bpmem . fog . c_proj_fsel . fsel  ! =  2  & &  out . GetBuffer ( )  ! =  nullptr ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-25 02:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											WARN_LOG ( VIDEO ,  " Unknown Fog Type! %08x " ,  bpmem . fog . c_proj_fsel . fsel ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-19 04:41:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-03-17 17:11:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \t int ifog = iround(fog * 256.0); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-03-06 19:27:11 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \t prev.rgb = (prev.rgb * (256 - ifog) +  "  I_FOGCOLOR " .rgb * ifog) >> 8; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 14:31:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GetPixelShaderUid ( PixelShaderUid &  object ,  DSTALPHA_MODE  dstAlphaMode ,  API_TYPE  ApiType ,  u32  components )  
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-03-26 23:21:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GeneratePixelShader < PixelShaderUid > ( object ,  dstAlphaMode ,  ApiType ,  components ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 14:31:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GeneratePixelShaderCode ( PixelShaderCode &  object ,  DSTALPHA_MODE  dstAlphaMode ,  API_TYPE  ApiType ,  u32  components )  
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-03-26 23:21:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GeneratePixelShader < PixelShaderCode > ( object ,  dstAlphaMode ,  ApiType ,  components ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-19 04:41:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  GetPixelShaderConstantProfile ( PixelShaderConstantProfile &  object ,  DSTALPHA_MODE  dstAlphaMode ,  API_TYPE  ApiType ,  u32  components )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-03-26 23:21:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GeneratePixelShader < PixelShaderConstantProfile > ( object ,  dstAlphaMode ,  ApiType ,  components ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}