summaryrefslogtreecommitdiff
path: root/materialsystem/stdshaders/motion_blur_dx9.cpp
blob: 6af6ae9c417253ec5c48a057ee4490b061676380 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//===========================================================================//

#include "BaseVSShader.h"
#include "motion_blur_vs20.inc"
#include "motion_blur_ps20.inc"
#include "motion_blur_ps20b.inc"
#include "convar.h"

// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"

ConVar mat_motion_blur_percent_of_screen_max( "mat_motion_blur_percent_of_screen_max", "4.0" );

DEFINE_FALLBACK_SHADER( MotionBlur, MotionBlur_dx9 )
BEGIN_VS_SHADER_FLAGS( MotionBlur_dx9, "Motion Blur", SHADER_NOT_EDITABLE )
	BEGIN_SHADER_PARAMS
		SHADER_PARAM( MOTIONBLURINTERNAL, SHADER_PARAM_TYPE_VEC4, "[0 0 0 0]", "Internal motion blur value set by proxy" )
	END_SHADER_PARAMS

	SHADER_INIT_PARAMS()
	{
	}

	SHADER_FALLBACK
	{
		if ( g_pHardwareConfig->GetDXSupportLevel() < 90 )
		{
			return "Wireframe";
		}

		return 0;
	}

	SHADER_INIT
	{
		if ( params[BASETEXTURE]->IsDefined() )
		{
			LoadTexture( BASETEXTURE, IsOSX() && g_pHardwareConfig->CanDoSRGBReadFromRTs() ? TEXTUREFLAGS_SRGB : 0 );
		}
	}

	SHADER_DRAW
	{
		SHADOW_STATE
		{
			pShaderShadow->VertexShaderVertexFormat( VERTEX_POSITION, 1, 0, 0 );

			// On OpenGL OSX, we must do sRGB reads and writes since these render targets are tagged as such
			bool bForceSRGBReadsAndWrites = IsOSX() && g_pHardwareConfig->CanDoSRGBReadFromRTs();
			
			// NOTE: sRGB is disabled because of the NV8800 brokenness
			pShaderShadow->EnableTexture( SHADER_SAMPLER0, true );
			pShaderShadow->EnableSRGBRead( SHADER_SAMPLER0, bForceSRGBReadsAndWrites );
			pShaderShadow->EnableSRGBWrite( bForceSRGBReadsAndWrites );

			DECLARE_STATIC_VERTEX_SHADER( motion_blur_vs20 );
			SET_STATIC_VERTEX_SHADER( motion_blur_vs20 );

			if ( g_pHardwareConfig->SupportsPixelShaders_2_b() )
			{
				DECLARE_STATIC_PIXEL_SHADER( motion_blur_ps20b );
				SET_STATIC_PIXEL_SHADER( motion_blur_ps20b );
			}
			else
			{
				DECLARE_STATIC_PIXEL_SHADER( motion_blur_ps20 );
				SET_STATIC_PIXEL_SHADER( motion_blur_ps20 );
			}

			pShaderShadow->EnableDepthWrites( false );
			pShaderShadow->EnableAlphaWrites( false );
		}

		DYNAMIC_STATE
		{
			DECLARE_DYNAMIC_VERTEX_SHADER( motion_blur_vs20 );
			SET_DYNAMIC_VERTEX_SHADER( motion_blur_vs20 );

			// Bind textures
			BindTexture( SHADER_SAMPLER0, BASETEXTURE );

			// Get texture dimensions
			ITexture *src_texture = params[BASETEXTURE]->GetTextureValue();
			//int flTextureWidth = src_texture->GetActualWidth();
			int flTextureHeight = src_texture->GetActualHeight();

			// Percent of screen clamp
			float vConst[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
			vConst[0] = mat_motion_blur_percent_of_screen_max.GetFloat() / 100.0f;
			pShaderAPI->SetPixelShaderConstant( 0, vConst, 1 );

			// Set values from material proxy
			pShaderAPI->SetPixelShaderConstant( 1, params[MOTIONBLURINTERNAL]->GetVecValue(), 1 );

			// Quality based on screen resolution height
			int nQuality = 1;
			if ( flTextureHeight >= 1080 ) // 1080p and higher
				nQuality = 3;
			else if ( flTextureHeight >= 720 ) // 720p to 1080p
				nQuality = 2;
			else // Lower resolution than 720p
				nQuality = 1;

			if ( fabs( params[MOTIONBLURINTERNAL]->GetVecValue()[0] ) + fabs( params[MOTIONBLURINTERNAL]->GetVecValue()[1] ) +
				 fabs( params[MOTIONBLURINTERNAL]->GetVecValue()[2] ) + fabs( params[MOTIONBLURINTERNAL]->GetVecValue()[3] ) == 0.0f )
			{
				// No motion blur this frame, so force quality to 0
				nQuality = 0;
			}

			if ( g_pHardwareConfig->SupportsPixelShaders_2_b() )
			{
				DECLARE_DYNAMIC_PIXEL_SHADER( motion_blur_ps20b );
				SET_DYNAMIC_PIXEL_SHADER_COMBO( QUALITY, nQuality );
				SET_DYNAMIC_PIXEL_SHADER( motion_blur_ps20b );
			}
			else
			{
				DECLARE_DYNAMIC_PIXEL_SHADER( motion_blur_ps20 );
				SET_DYNAMIC_PIXEL_SHADER_COMBO( QUALITY, nQuality );
				SET_DYNAMIC_PIXEL_SHADER( motion_blur_ps20 );
			}
		}

		Draw();
	}
END_SHADER