| 
									
										
										
										
											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:25:12 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <cmath>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "Common/Common.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "VideoCommon/PixelShaderManager.h"
 | 
					
						
							|  |  |  | #include "VideoCommon/RenderBase.h"
 | 
					
						
							|  |  |  | #include "VideoCommon/Statistics.h"
 | 
					
						
							|  |  |  | #include "VideoCommon/VideoCommon.h"
 | 
					
						
							|  |  |  | #include "VideoCommon/VideoConfig.h"
 | 
					
						
							| 
									
										
										
										
											2011-01-31 01:28:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-29 04:31:56 +00:00
										 |  |  | static bool s_bFogRangeAdjustChanged; | 
					
						
							| 
									
										
										
										
											2013-10-13 15:41:11 +02:00
										 |  |  | static bool s_bViewPortChanged; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-07 16:02:24 +02:00
										 |  |  | PixelShaderConstants PixelShaderManager::constants; | 
					
						
							|  |  |  | bool PixelShaderManager::dirty; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-26 10:43:18 +00:00
										 |  |  | void PixelShaderManager::Init() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-10-07 16:02:24 +02:00
										 |  |  | 	memset(&constants, 0, sizeof(constants)); | 
					
						
							| 
									
										
										
										
											2009-09-15 21:49:15 +00:00
										 |  |  | 	Dirty(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void PixelShaderManager::Dirty() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	s_bFogRangeAdjustChanged = true; | 
					
						
							| 
									
										
										
										
											2013-10-13 15:41:11 +02:00
										 |  |  | 	s_bViewPortChanged = true; | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 17:56:41 +02:00
										 |  |  | 	SetColorChanged(0, 0); | 
					
						
							|  |  |  | 	SetColorChanged(0, 1); | 
					
						
							|  |  |  | 	SetColorChanged(0, 2); | 
					
						
							|  |  |  | 	SetColorChanged(0, 3); | 
					
						
							|  |  |  | 	SetColorChanged(1, 0); | 
					
						
							|  |  |  | 	SetColorChanged(1, 1); | 
					
						
							|  |  |  | 	SetColorChanged(1, 2); | 
					
						
							|  |  |  | 	SetColorChanged(1, 3); | 
					
						
							|  |  |  | 	SetAlpha(); | 
					
						
							|  |  |  | 	SetDestAlpha(); | 
					
						
							|  |  |  | 	SetZTextureBias(); | 
					
						
							|  |  |  | 	SetViewportChanged(); | 
					
						
							|  |  |  | 	SetIndTexScaleChanged(false); | 
					
						
							|  |  |  | 	SetIndTexScaleChanged(true); | 
					
						
							|  |  |  | 	SetIndMatrixChanged(0); | 
					
						
							|  |  |  | 	SetIndMatrixChanged(1); | 
					
						
							|  |  |  | 	SetIndMatrixChanged(2); | 
					
						
							|  |  |  | 	SetZTextureTypeChanged(); | 
					
						
							|  |  |  | 	SetTexCoordChanged(0); | 
					
						
							|  |  |  | 	SetTexCoordChanged(1); | 
					
						
							|  |  |  | 	SetTexCoordChanged(2); | 
					
						
							|  |  |  | 	SetTexCoordChanged(3); | 
					
						
							|  |  |  | 	SetTexCoordChanged(4); | 
					
						
							|  |  |  | 	SetTexCoordChanged(5); | 
					
						
							|  |  |  | 	SetTexCoordChanged(6); | 
					
						
							|  |  |  | 	SetTexCoordChanged(7); | 
					
						
							|  |  |  | 	SetFogColorChanged(); | 
					
						
							|  |  |  | 	SetFogParamChanged(); | 
					
						
							| 
									
										
										
										
											2008-12-26 10:43:18 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void PixelShaderManager::Shutdown() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-15 16:58:36 +01:00
										 |  |  | void PixelShaderManager::SetConstants() | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-06-25 13:37:38 +02:00
										 |  |  | 	if (s_bFogRangeAdjustChanged) | 
					
						
							| 
									
										
										
										
											2011-01-29 04:31:56 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 		// set by two components, so keep changed flag here
 | 
					
						
							|  |  |  | 		// TODO: try to split both registers and move this logic to the shader
 | 
					
						
							| 
									
										
										
										
											2014-03-11 00:30:55 +13:00
										 |  |  | 		if (!g_ActiveConfig.bDisableFog && bpmem.fogRange.Base.Enabled == 1) | 
					
						
							| 
									
										
										
										
											2011-01-29 04:31:56 +00:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			//bpmem.fogRange.Base.Center : center of the viewport in x axis. observation: bpmem.fogRange.Base.Center = realcenter + 342;
 | 
					
						
							|  |  |  | 			int center = ((u32)bpmem.fogRange.Base.Center) - 342; | 
					
						
							| 
									
										
										
										
											2013-04-07 17:11:29 -04:00
										 |  |  | 			// normalize center to make calculations easy
 | 
					
						
							| 
									
										
										
										
											2014-04-27 11:59:04 -07:00
										 |  |  | 			float ScreenSpaceCenter = center / (2.0f * xfmem.viewport.wd); | 
					
						
							| 
									
										
										
										
											2011-01-29 04:31:56 +00:00
										 |  |  | 			ScreenSpaceCenter = (ScreenSpaceCenter * 2.0f) - 1.0f; | 
					
						
							| 
									
										
										
										
											2013-04-07 17:11:29 -04:00
										 |  |  | 			//bpmem.fogRange.K seems to be  a table of precalculated coefficients for the adjust factor
 | 
					
						
							|  |  |  | 			//observations: bpmem.fogRange.K[0].LO appears to be the lowest value and bpmem.fogRange.K[4].HI the largest
 | 
					
						
							|  |  |  | 			// they always seems to be larger than 256 so my theory is :
 | 
					
						
							|  |  |  | 			// they are the coefficients from the center to the border of the screen
 | 
					
						
							|  |  |  | 			// so to simplify I use the hi coefficient as K in the shader taking 256 as the scale
 | 
					
						
							| 
									
										
										
										
											2013-10-27 13:10:00 +01:00
										 |  |  | 			// TODO: Shouldn't this be EFBToScaledXf?
 | 
					
						
							| 
									
										
										
										
											2013-12-16 13:08:09 +01:00
										 |  |  | 			constants.fogf[0][0] = ScreenSpaceCenter; | 
					
						
							| 
									
										
										
										
											2014-04-27 11:59:04 -07:00
										 |  |  | 			constants.fogf[0][1] = (float)Renderer::EFBToScaledX((int)(2.0f * xfmem.viewport.wd)); | 
					
						
							| 
									
										
										
										
											2013-12-16 13:08:09 +01:00
										 |  |  | 			constants.fogf[0][2] = bpmem.fogRange.K[4].HI / 256.0f; | 
					
						
							| 
									
										
										
										
											2011-06-20 05:48:12 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2013-12-16 13:08:09 +01:00
										 |  |  | 			constants.fogf[0][0] = 0; | 
					
						
							|  |  |  | 			constants.fogf[0][1] = 1; | 
					
						
							|  |  |  | 			constants.fogf[0][2] = 1; | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 		dirty = true; | 
					
						
							| 
									
										
										
										
											2011-06-20 05:48:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-29 04:31:56 +00:00
										 |  |  | 		s_bFogRangeAdjustChanged = false; | 
					
						
							| 
									
										
										
										
											2013-06-25 13:37:38 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-01-29 04:31:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-11 00:30:55 +13:00
										 |  |  | 	if (s_bViewPortChanged) | 
					
						
							| 
									
										
										
										
											2013-10-13 15:41:11 +02:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2014-04-27 11:59:04 -07:00
										 |  |  | 		constants.zbias[1][0] = xfmem.viewport.farZ; | 
					
						
							|  |  |  | 		constants.zbias[1][1] = xfmem.viewport.zRange; | 
					
						
							| 
									
										
										
										
											2013-10-13 15:41:11 +02:00
										 |  |  | 		dirty = true; | 
					
						
							| 
									
										
										
										
											2013-12-03 09:36:48 +01:00
										 |  |  | 		s_bViewPortChanged = false; | 
					
						
							| 
									
										
										
										
											2013-10-13 15:41:11 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 17:56:41 +02:00
										 |  |  | void PixelShaderManager::SetColorChanged(int type, int num) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-10-10 20:26:41 +02:00
										 |  |  | 	int4* c = type ? constants.kcolors : constants.colors; | 
					
						
							| 
									
										
										
										
											2014-03-10 16:15:40 +01:00
										 |  |  | 	c[num][0] = bpmem.tevregs[num].red; | 
					
						
							|  |  |  | 	c[num][3] = bpmem.tevregs[num].alpha; | 
					
						
							|  |  |  | 	c[num][2] = bpmem.tevregs[num].blue; | 
					
						
							|  |  |  | 	c[num][1] = bpmem.tevregs[num].green; | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	dirty = true; | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-10 20:26:41 +02:00
										 |  |  | 	PRIM_LOG("pixel %scolor%d: %d %d %d %d\n", type?"k":"", num, c[num][0], c[num][1], c[num][2], c[num][3]); | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 17:56:41 +02:00
										 |  |  | void PixelShaderManager::SetAlpha() | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-10-10 20:36:55 +02:00
										 |  |  | 	constants.alpha[0] = bpmem.alpha_test.ref0; | 
					
						
							|  |  |  | 	constants.alpha[1] = bpmem.alpha_test.ref1; | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	dirty = true; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 17:56:41 +02:00
										 |  |  | void PixelShaderManager::SetDestAlpha() | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-10-10 20:36:55 +02:00
										 |  |  | 	constants.alpha[3] = bpmem.dstalpha.alpha; | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	dirty = true; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 04:47:28 +01:00
										 |  |  | void PixelShaderManager::SetTexDims(int texmapid, u32 width, u32 height, u32 wraps, u32 wrapt) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	// TODO: move this check out to callee. There we could just call this function on texture changes
 | 
					
						
							|  |  |  | 	// or better, use textureSize() in glsl
 | 
					
						
							| 
									
										
										
										
											2014-03-11 00:30:55 +13:00
										 |  |  | 	if (constants.texdims[texmapid][0] != 1.0f/width || constants.texdims[texmapid][1] != 1.0f/height) | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 		dirty = true; | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	constants.texdims[texmapid][0] = 1.0f/width; | 
					
						
							|  |  |  | 	constants.texdims[texmapid][1] = 1.0f/height; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 17:56:41 +02:00
										 |  |  | void PixelShaderManager::SetZTextureBias() | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-11-23 20:58:24 +01:00
										 |  |  | 	constants.zbias[1][3] = bpmem.ztex1.bias; | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	dirty = true; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-05 18:25:34 +00:00
										 |  |  | void PixelShaderManager::SetViewportChanged() | 
					
						
							| 
									
										
										
										
											2009-02-08 22:08:20 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-10-13 15:41:11 +02:00
										 |  |  | 	s_bViewPortChanged = true; | 
					
						
							| 
									
										
										
										
											2013-03-15 15:05:48 +01:00
										 |  |  | 	s_bFogRangeAdjustChanged = true; // TODO: Shouldn't be necessary with an accurate fog range adjust implementation
 | 
					
						
							| 
									
										
										
										
											2009-10-25 23:10:30 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 17:56:41 +02:00
										 |  |  | void PixelShaderManager::SetIndTexScaleChanged(bool high) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-01-29 15:52:24 +01:00
										 |  |  | 	constants.indtexscale[high][0] = bpmem.texscale[high].ss0; | 
					
						
							|  |  |  | 	constants.indtexscale[high][1] = bpmem.texscale[high].ts0; | 
					
						
							|  |  |  | 	constants.indtexscale[high][2] = bpmem.texscale[high].ss1; | 
					
						
							|  |  |  | 	constants.indtexscale[high][3] = bpmem.texscale[high].ts1; | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	dirty = true; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-26 10:43:18 +00:00
										 |  |  | void PixelShaderManager::SetIndMatrixChanged(int matrixidx) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	int scale = ((u32)bpmem.indmtx[matrixidx].col0.s0 << 0) | | 
					
						
							| 
									
										
										
										
											2013-10-10 21:09:00 +02:00
										 |  |  | 				((u32)bpmem.indmtx[matrixidx].col1.s1 << 2) | | 
					
						
							|  |  |  | 				((u32)bpmem.indmtx[matrixidx].col2.s2 << 4); | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// xyz - static matrix
 | 
					
						
							| 
									
										
										
										
											2013-09-12 13:55:38 +02:00
										 |  |  | 	// w - dynamic matrix scale / 128
 | 
					
						
							| 
									
										
										
										
											2013-10-10 21:09:00 +02:00
										 |  |  | 	constants.indtexmtx[2*matrixidx  ][0] = bpmem.indmtx[matrixidx].col0.ma; | 
					
						
							|  |  |  | 	constants.indtexmtx[2*matrixidx  ][1] = bpmem.indmtx[matrixidx].col1.mc; | 
					
						
							|  |  |  | 	constants.indtexmtx[2*matrixidx  ][2] = bpmem.indmtx[matrixidx].col2.me; | 
					
						
							|  |  |  | 	constants.indtexmtx[2*matrixidx  ][3] = 17 - scale; | 
					
						
							|  |  |  | 	constants.indtexmtx[2*matrixidx+1][0] = bpmem.indmtx[matrixidx].col0.mb; | 
					
						
							|  |  |  | 	constants.indtexmtx[2*matrixidx+1][1] = bpmem.indmtx[matrixidx].col1.md; | 
					
						
							|  |  |  | 	constants.indtexmtx[2*matrixidx+1][2] = bpmem.indmtx[matrixidx].col2.mf; | 
					
						
							|  |  |  | 	constants.indtexmtx[2*matrixidx+1][3] = 17 - scale; | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	dirty = true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-10 21:09:00 +02:00
										 |  |  | 	PRIM_LOG("indmtx%d: scale=%d, mat=(%d %d %d; %d %d %d)\n", | 
					
						
							|  |  |  | 			matrixidx, scale, | 
					
						
							|  |  |  | 			bpmem.indmtx[matrixidx].col0.ma, bpmem.indmtx[matrixidx].col1.mc, bpmem.indmtx[matrixidx].col2.me, | 
					
						
							|  |  |  | 			bpmem.indmtx[matrixidx].col0.mb, bpmem.indmtx[matrixidx].col1.md, bpmem.indmtx[matrixidx].col2.mf); | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-08-31 20:58:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-08 22:08:20 +00:00
										 |  |  | void PixelShaderManager::SetZTextureTypeChanged() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	switch (bpmem.ztex2.type) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		case TEV_ZTEX_TYPE_U8: | 
					
						
							|  |  |  | 			constants.zbias[0][0] = 0; | 
					
						
							|  |  |  | 			constants.zbias[0][1] = 0; | 
					
						
							|  |  |  | 			constants.zbias[0][2] = 0; | 
					
						
							| 
									
										
										
										
											2013-11-23 20:58:24 +01:00
										 |  |  | 			constants.zbias[0][3] = 1; | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 			break; | 
					
						
							|  |  |  | 		case TEV_ZTEX_TYPE_U16: | 
					
						
							| 
									
										
										
										
											2013-11-23 20:58:24 +01:00
										 |  |  | 			constants.zbias[0][0] = 1; | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 			constants.zbias[0][1] = 0; | 
					
						
							|  |  |  | 			constants.zbias[0][2] = 0; | 
					
						
							| 
									
										
										
										
											2013-11-23 20:58:24 +01:00
										 |  |  | 			constants.zbias[0][3] = 256; | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 			break; | 
					
						
							|  |  |  | 		case TEV_ZTEX_TYPE_U24: | 
					
						
							| 
									
										
										
										
											2013-11-23 20:58:24 +01:00
										 |  |  | 			constants.zbias[0][0] = 65536; | 
					
						
							|  |  |  | 			constants.zbias[0][1] = 256; | 
					
						
							|  |  |  | 			constants.zbias[0][2] = 1; | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 			constants.zbias[0][3] = 0; | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         dirty = true; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-15 03:55:38 +00:00
										 |  |  | void PixelShaderManager::SetTexCoordChanged(u8 texmapid) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	TCoordInfo& tc = bpmem.texcoords[texmapid]; | 
					
						
							| 
									
										
										
										
											2013-11-13 04:03:46 -05:00
										 |  |  | 	constants.texdims[texmapid][2] = (float)(tc.s.scale_minus_1 + 1); | 
					
						
							|  |  |  | 	constants.texdims[texmapid][3] = (float)(tc.t.scale_minus_1 + 1); | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	dirty = true; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-19 04:41:58 +00:00
										 |  |  | void PixelShaderManager::SetFogColorChanged() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-05-03 15:08:11 -04:00
										 |  |  | 	if (g_ActiveConfig.bDisableFog) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-27 13:10:00 +01:00
										 |  |  | 	constants.fogcolor[0] = bpmem.fog.color.r; | 
					
						
							|  |  |  | 	constants.fogcolor[1] = bpmem.fog.color.g; | 
					
						
							|  |  |  | 	constants.fogcolor[2] = bpmem.fog.color.b; | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	dirty = true; | 
					
						
							| 
									
										
										
										
											2009-02-19 04:41:58 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void PixelShaderManager::SetFogParamChanged() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-03-11 00:30:55 +13:00
										 |  |  | 	if (!g_ActiveConfig.bDisableFog) | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2013-12-16 13:08:09 +01:00
										 |  |  | 		constants.fogf[1][0] = bpmem.fog.a.GetA(); | 
					
						
							| 
									
										
										
										
											2014-03-03 19:23:46 +01:00
										 |  |  | 		constants.fogi[1] = bpmem.fog.b_magnitude; | 
					
						
							| 
									
										
										
										
											2013-12-16 13:08:09 +01:00
										 |  |  | 		constants.fogf[1][2] = bpmem.fog.c_proj_fsel.GetC(); | 
					
						
							| 
									
										
										
										
											2014-03-03 19:23:46 +01:00
										 |  |  | 		constants.fogi[3] = bpmem.fog.b_shift; | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2013-12-16 13:08:09 +01:00
										 |  |  | 		constants.fogf[1][0] = 0.f; | 
					
						
							| 
									
										
										
										
											2014-03-03 19:23:46 +01:00
										 |  |  | 		constants.fogi[1] = 1; | 
					
						
							| 
									
										
										
										
											2013-12-16 13:08:09 +01:00
										 |  |  | 		constants.fogf[1][2] = 0.f; | 
					
						
							| 
									
										
										
										
											2014-03-03 19:23:46 +01:00
										 |  |  | 		constants.fogi[3] = 1; | 
					
						
							| 
									
										
										
										
											2013-10-07 21:57:18 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	dirty = true; | 
					
						
							| 
									
										
										
										
											2009-02-19 04:41:58 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-29 04:31:56 +00:00
										 |  |  | void PixelShaderManager::SetFogRangeAdjustChanged() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-05-03 15:08:11 -04:00
										 |  |  | 	if (g_ActiveConfig.bDisableFog) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-19 21:51:12 -04:00
										 |  |  | 	s_bFogRangeAdjustChanged = true; | 
					
						
							| 
									
										
										
										
											2011-01-29 04:31:56 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-01 12:46:02 -08:00
										 |  |  | void PixelShaderManager::DoState(PointerWrap &p) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-10-07 16:02:24 +02:00
										 |  |  | 	p.Do(constants); | 
					
						
							|  |  |  | 	p.Do(dirty); | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-01 12:46:02 -08:00
										 |  |  | 	if (p.GetMode() == PointerWrap::MODE_READ) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		Dirty(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |