12TBOOL T2Shader::Create()
16 if ( m_VShader && m_FShader )
18 m_uiProgram = glCreateProgram();
19 TASSERT( m_uiProgram != 0,
"Couldn't create GL shader program" );
21 glAttachShader( m_uiProgram, m_VShader.GetId() );
22 glAttachShader( m_uiProgram, m_FShader.GetId() );
23 glLinkProgram( m_uiProgram );
24 glValidateProgram( m_uiProgram );
27 glGetProgramiv( m_uiProgram, GL_VALIDATE_STATUS, &iProgramStatus );
29 return iProgramStatus == GL_TRUE;
35void T2Shader::Destroy(
TBOOL a_bDeleteShaders )
37 glDeleteProgram( m_uiProgram );
39 if ( a_bDeleteShaders )
41 glDeleteShader( m_VShader.GetId() );
42 glDeleteShader( m_FShader.GetId() );
46void T2Shader::Use()
const
49 glUseProgram( m_uiProgram );
54 if ( a_uiNumItems == 1 )
55 return SetUniform( a_strSlotName, *a_pValue );
58 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
63 glUniform1uiv( meta.id, a_uiNumItems, a_pValue );
64 meta.uInteger = *a_pValue;
72 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
77 if ( meta.uInteger != a_uiValue )
79 glUniform1ui( meta.id, a_uiValue );
80 meta.uInteger = a_uiValue;
90 if ( a_uiNumItems == 1 )
91 return SetUniform( a_strSlotName, *a_pValue );
94 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
99 glUniform1iv( meta.id, a_uiNumItems, a_pValue );
100 meta.integer = *a_pValue;
108 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
113 if ( meta.integer != a_iValue )
115 glUniform1i( meta.id, a_iValue );
116 meta.integer = a_iValue;
126 if ( a_uiNumItems == 1 )
127 return SetUniform( a_strSlotName, *a_pValue );
130 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
135 glUniform1fv( meta.id, a_uiNumItems, a_pValue );
144 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
149 if ( meta.fp != a_fValue )
151 glUniform1f( meta.id, a_fValue );
161 if ( a_uiNumItems == 1 )
162 return SetUniform( a_strSlotName, *a_pVector );
165 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
170 glUniform3fv( meta.id, a_uiNumItems, (
const TFLOAT*)a_pVector );
171 meta.vec3 = *a_pVector;
179 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
184 if ( meta.vec3.x != a_rVector.
x || meta.vec3.y != a_rVector.
y || meta.vec3.z != a_rVector.
z )
186 glUniform3fv( meta.id, 1, &a_rVector.
x );
187 meta.vec3 = a_rVector;
197 if ( a_uiNumItems == 1 )
198 return SetUniform( a_strSlotName, *a_pVector );
201 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
206 glUniform4fv( meta.id, a_uiNumItems, (
const TFLOAT*)a_pVector );
207 meta.vec4 = _mm_loadu_ps( (
float*)a_pVector );
215 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
220 __m128 v0 = _mm_loadu_ps( (
float*)&a_rVector.
x );
221 __m128 vcmp = _mm_cmpneq_ps( v0, meta.vec4 );
223 if ( _mm_movemask_ps( vcmp ) != 0 )
225 glUniform4fv( meta.id, 1, &a_rVector.
x );
226 meta.vec4 = _mm_loadu_ps( (
float*)&a_rVector.
x );
236 if ( a_uiNumItems == 1 )
237 return SetUniform( a_strSlotName, *a_pMatrix );
240 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
245 glUniformMatrix4fv( meta.id, a_uiNumItems, GL_FALSE, (
const TFLOAT*)a_pMatrix );
246 meta.mat44 = *a_pMatrix;
254 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
263 glUniformMatrix4fv( meta.id, 1, GL_FALSE, &a_rMatrix.
m_f11 );
264 meta.mat44 = a_rMatrix;
273TBOOL T2Shader::SetUniform(
const TPString8& a_strSlotName,
const glm::mat4& a_rMatrix )
275 return SetUniform( a_strSlotName, *(
TMatrix44*)&a_rMatrix );
278TBOOL T2Shader::SetUniform(
const TPString8& a_strSlotName,
const glm::mat4* a_pMatrix,
TUINT a_uiNumItems )
280 return SetUniform( a_strSlotName, (
TMatrix44*)a_pMatrix, a_uiNumItems );
283TBOOL T2Shader::SetUniform(
const TPString8& a_strSlotName,
const glm::vec4& a_rVector )
285 return SetUniform( a_strSlotName, *(
TVector4*)&a_rVector );
288TBOOL T2Shader::SetUniform(
const TPString8& a_strSlotName,
const glm::vec4* a_pVector,
TUINT a_uiNumItems )
290 return SetUniform( a_strSlotName, (
TVector4*)a_pVector, a_uiNumItems );
293T2Shader& T2Shader::operator=(
const T2Shader& a_rOther )
295 if (
this != &a_rOther )
297 m_uiProgram = a_rOther.m_uiProgram;
298 m_VShader = a_rOther.m_VShader;
299 m_FShader = a_rOther.m_FShader;
305T2Shader::UniformMeta& T2Shader::GetUniformSlotId(
const TCHAR* a_szSlotName )
307 return GetUniformSlotId(
TPS8D( a_szSlotName ) );
310T2Shader::UniformMeta& T2Shader::GetUniformSlotId(
const TPString8& a_strSlotName )
312 auto it = m_UniformToSlotId.Find( a_strSlotName );
314 if ( it != m_UniformToSlotId.End() )
317 GLint iLoc = glGetUniformLocation( m_uiProgram, a_strSlotName.
GetString() );
318 return *m_UniformToSlotId.Emplace( a_strSlotName, ( iLoc == -1 ) ? -2 : iLoc );
#define TOSHI_NAMESPACE_START
#define TOSHI_NAMESPACE_END
TFORCEINLINE const TCHAR * GetString() const
static TINT MemCompare(const void *ptr1, const void *ptr2, TSIZE size)