OpenBarnyard
 
Loading...
Searching...
No Matches
T2Shader_GL.cpp
Go to the documentation of this file.
1#include "ToshiPCH.h"
2#include "T2Shader_GL.h"
3
4//-----------------------------------------------------------------------------
5// Enables memory debugging.
6// Note: Should be the last include!
7//-----------------------------------------------------------------------------
9
11
12TBOOL T2Shader::Create()
13{
14 TASSERT( m_uiProgram == 0 );
15
16 if ( m_VShader && m_FShader )
17 {
18 m_uiProgram = glCreateProgram();
19 TASSERT( m_uiProgram != 0, "Couldn't create GL shader program" );
20
21 glAttachShader( m_uiProgram, m_VShader.GetId() );
22 glAttachShader( m_uiProgram, m_FShader.GetId() );
23 glLinkProgram( m_uiProgram );
24 glValidateProgram( m_uiProgram );
25
26 GLint iProgramStatus;
27 glGetProgramiv( m_uiProgram, GL_VALIDATE_STATUS, &iProgramStatus );
28
29 return iProgramStatus == GL_TRUE;
30 }
31
32 return TFALSE;
33}
34
35void T2Shader::Destroy( TBOOL a_bDeleteShaders )
36{
37 glDeleteProgram( m_uiProgram );
38
39 if ( a_bDeleteShaders )
40 {
41 glDeleteShader( m_VShader.GetId() );
42 glDeleteShader( m_FShader.GetId() );
43 }
44}
45
46void T2Shader::Use() const
47{
48 TASSERT( m_uiProgram != 0 );
49 glUseProgram( m_uiProgram );
50}
51
52TBOOL T2Shader::SetUniform( const TPString8& a_strSlotName, const TUINT* a_pValue, TUINT a_uiNumItems )
53{
54 if ( a_uiNumItems == 1 )
55 return SetUniform( a_strSlotName, *a_pValue );
56 else
57 {
58 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
59
60 if ( meta.id < 0 )
61 return TFALSE;
62
63 glUniform1uiv( meta.id, a_uiNumItems, a_pValue );
64 meta.uInteger = *a_pValue;
65
66 return TTRUE;
67 }
68}
69
70TBOOL T2Shader::SetUniform( const TPString8& a_strSlotName, TUINT a_uiValue )
71{
72 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
73
74 if ( meta.id < 0 )
75 return TFALSE;
76
77 if ( meta.uInteger != a_uiValue )
78 {
79 glUniform1ui( meta.id, a_uiValue );
80 meta.uInteger = a_uiValue;
81
82 return TTRUE;
83 }
84
85 return TFALSE;
86}
87
88TBOOL T2Shader::SetUniform( const TPString8& a_strSlotName, const TINT* a_pValue, TUINT a_uiNumItems )
89{
90 if ( a_uiNumItems == 1 )
91 return SetUniform( a_strSlotName, *a_pValue );
92 else
93 {
94 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
95
96 if ( meta.id < 0 )
97 return TFALSE;
98
99 glUniform1iv( meta.id, a_uiNumItems, a_pValue );
100 meta.integer = *a_pValue;
101
102 return TTRUE;
103 }
104}
105
106TBOOL T2Shader::SetUniform( const TPString8& a_strSlotName, TINT a_iValue )
107{
108 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
109
110 if ( meta.id < 0 )
111 return TFALSE;
112
113 if ( meta.integer != a_iValue )
114 {
115 glUniform1i( meta.id, a_iValue );
116 meta.integer = a_iValue;
117
118 return TTRUE;
119 }
120
121 return TFALSE;
122}
123
124TBOOL T2Shader::SetUniform( const TPString8& a_strSlotName, const TFLOAT* a_pValue, TUINT a_uiNumItems )
125{
126 if ( a_uiNumItems == 1 )
127 return SetUniform( a_strSlotName, *a_pValue );
128 else
129 {
130 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
131
132 if ( meta.id < 0 )
133 return TFALSE;
134
135 glUniform1fv( meta.id, a_uiNumItems, a_pValue );
136 meta.fp = *a_pValue;
137
138 return TTRUE;
139 }
140}
141
142TBOOL T2Shader::SetUniform( const TPString8& a_strSlotName, TFLOAT a_fValue )
143{
144 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
145
146 if ( meta.id < 0 )
147 return TFALSE;
148
149 if ( meta.fp != a_fValue )
150 {
151 glUniform1f( meta.id, a_fValue );
152 meta.fp = a_fValue;
153 return TTRUE;
154 }
155
156 return TFALSE;
157}
158
159TBOOL T2Shader::SetUniform( const TPString8& a_strSlotName, const TVector3* a_pVector, TUINT a_uiNumItems )
160{
161 if ( a_uiNumItems == 1 )
162 return SetUniform( a_strSlotName, *a_pVector );
163 else
164 {
165 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
166
167 if ( meta.id < 0 )
168 return TFALSE;
169
170 glUniform3fv( meta.id, a_uiNumItems, (const TFLOAT*)a_pVector );
171 meta.vec3 = *a_pVector;
172
173 return TTRUE;
174 }
175}
176
177TBOOL T2Shader::SetUniform( const TPString8& a_strSlotName, const TVector3& a_rVector )
178{
179 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
180
181 if ( meta.id < 0 )
182 return TFALSE;
183
184 if ( meta.vec3.x != a_rVector.x || meta.vec3.y != a_rVector.y || meta.vec3.z != a_rVector.z )
185 {
186 glUniform3fv( meta.id, 1, &a_rVector.x );
187 meta.vec3 = a_rVector;
188
189 return TTRUE;
190 }
191
192 return TFALSE;
193}
194
195TBOOL T2Shader::SetUniform( const TPString8& a_strSlotName, const TVector4* a_pVector, TUINT a_uiNumItems )
196{
197 if ( a_uiNumItems == 1 )
198 return SetUniform( a_strSlotName, *a_pVector );
199 else
200 {
201 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
202
203 if ( meta.id < 0 )
204 return TFALSE;
205
206 glUniform4fv( meta.id, a_uiNumItems, (const TFLOAT*)a_pVector );
207 meta.vec4 = _mm_loadu_ps( (float*)a_pVector );
208
209 return TTRUE;
210 }
211}
212
213TBOOL T2Shader::SetUniform( const TPString8& a_strSlotName, const TVector4& a_rVector )
214{
215 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
216
217 if ( meta.id < 0 )
218 return TFALSE;
219
220 __m128 v0 = _mm_loadu_ps( (float*)&a_rVector.x );
221 __m128 vcmp = _mm_cmpneq_ps( v0, meta.vec4 );
222
223 if ( _mm_movemask_ps( vcmp ) != 0 )
224 {
225 glUniform4fv( meta.id, 1, &a_rVector.x );
226 meta.vec4 = _mm_loadu_ps( (float*)&a_rVector.x );
227
228 return TTRUE;
229 }
230
231 return TFALSE;
232}
233
234TBOOL T2Shader::SetUniform( const TPString8& a_strSlotName, const TMatrix44* a_pMatrix, TUINT a_uiNumItems )
235{
236 if ( a_uiNumItems == 1 )
237 return SetUniform( a_strSlotName, *a_pMatrix );
238 else
239 {
240 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
241
242 if ( meta.id < 0 )
243 return TFALSE;
244
245 glUniformMatrix4fv( meta.id, a_uiNumItems, GL_FALSE, (const TFLOAT*)a_pMatrix );
246 meta.mat44 = *a_pMatrix;
247
248 return TTRUE;
249 }
250}
251
252TBOOL T2Shader::SetUniform( const TPString8& a_strSlotName, const TMatrix44& a_rMatrix )
253{
254 UniformMeta& meta = GetUniformSlotId( a_strSlotName );
255
256 if ( meta.id < 0 )
257 return TFALSE;
258
259 //__m512* m0 = (__m512*)&a_rMatrix;
260
261 if ( TUtil::MemCompare( &meta.mat44, &a_rMatrix, 64 ) != 0 )
262 {
263 glUniformMatrix4fv( meta.id, 1, GL_FALSE, &a_rMatrix.m_f11 );
264 meta.mat44 = a_rMatrix;
265 //meta.mat44 = _mm512_loadu_ps( m0 );
266
267 return TTRUE;
268 }
269
270 return TFALSE;
271}
272
273TBOOL T2Shader::SetUniform( const TPString8& a_strSlotName, const glm::mat4& a_rMatrix )
274{
275 return SetUniform( a_strSlotName, *(TMatrix44*)&a_rMatrix );
276}
277
278TBOOL T2Shader::SetUniform( const TPString8& a_strSlotName, const glm::mat4* a_pMatrix, TUINT a_uiNumItems )
279{
280 return SetUniform( a_strSlotName, (TMatrix44*)a_pMatrix, a_uiNumItems );
281}
282
283TBOOL T2Shader::SetUniform( const TPString8& a_strSlotName, const glm::vec4& a_rVector )
284{
285 return SetUniform( a_strSlotName, *(TVector4*)&a_rVector );
286}
287
288TBOOL T2Shader::SetUniform( const TPString8& a_strSlotName, const glm::vec4* a_pVector, TUINT a_uiNumItems )
289{
290 return SetUniform( a_strSlotName, (TVector4*)a_pVector, a_uiNumItems );
291}
292
293T2Shader& T2Shader::operator=( const T2Shader& a_rOther )
294{
295 if ( this != &a_rOther )
296 {
297 m_uiProgram = a_rOther.m_uiProgram;
298 m_VShader = a_rOther.m_VShader;
299 m_FShader = a_rOther.m_FShader;
300 }
301
302 return *this;
303}
304
305T2Shader::UniformMeta& T2Shader::GetUniformSlotId( const TCHAR* a_szSlotName )
306{
307 return GetUniformSlotId( TPS8D( a_szSlotName ) );
308}
309
310T2Shader::UniformMeta& T2Shader::GetUniformSlotId( const TPString8& a_strSlotName )
311{
312 auto it = m_UniformToSlotId.Find( a_strSlotName );
313
314 if ( it != m_UniformToSlotId.End() )
315 return it->second;
316
317 GLint iLoc = glGetUniformLocation( m_uiProgram, a_strSlotName.GetString() );
318 return *m_UniformToSlotId.Emplace( a_strSlotName, ( iLoc == -1 ) ? -2 : iLoc );
319}
320
#define TASSERT(X,...)
Definition Defines.h:138
#define TOSHI_NAMESPACE_START
Definition Defines.h:47
#define TOSHI_NAMESPACE_END
Definition Defines.h:50
#define TPS8D(STR)
Definition TPString8.h:17
unsigned int TUINT
Definition Typedefs.h:8
char TCHAR
Definition Typedefs.h:20
float TFLOAT
Definition Typedefs.h:4
int TINT
Definition Typedefs.h:7
#define TFALSE
Definition Typedefs.h:24
#define TTRUE
Definition Typedefs.h:25
bool TBOOL
Definition Typedefs.h:6
TFLOAT m_f11
Definition TMatrix44.h:360
TFLOAT y
Definition TVector3.h:163
TFLOAT z
Definition TVector3.h:163
TFLOAT x
Definition TVector3.h:163
TFLOAT x
Definition TVector4.h:367
TFORCEINLINE const TCHAR * GetString() const
Definition TPString8.h:167
static TINT MemCompare(const void *ptr1, const void *ptr2, TSIZE size)
Definition TUtil.h:92