2
* Copyright 2010 Inalogic Inc.
4
* This program is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU Lesser General Public License version 3, as
6
* published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful, but
9
* WITHOUT ANY WARRANTY; without even the implied warranties of
10
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
11
* PURPOSE. See the applicable version of the GNU Lesser General Public
12
* License for more details.
14
* You should have received a copy of both the GNU Lesser General Public
15
* License version 3 along with this program. If not, see
16
* <http://www.gnu.org/licenses/>
18
* Authored by: Jay Taoko <jay.taoko_AT_gmail_DOT_com>
23
#include "GLResource.h"
24
#include "GLRenderStates.h"
28
const struct StateLookUpTable
32
// setup render state map
33
#define UL_MAP(state__, default_value__, checked__) \
34
default_render_state[GFXRS_##state__].iValue = default_value__; \
35
default_render_state[GFXRS_##state__].Checked = checked__;
37
#define UL_MAP_FLOAT(state__, default_value__, checked__) \
38
default_render_state[GFXRS_##state__].fValue = default_value__; \
39
default_render_state[GFXRS_##state__].Checked = checked__; \
42
UL_MAP(FRONT_POLYGONMODE , GL_FILL , 1);
43
UL_MAP(BACK_POLYGONMODE , GL_FILL , 1);
44
UL_MAP(CULLFACEENABLE , GL_FALSE , 1);
45
UL_MAP(CULLFACE , GL_BACK , 1);
46
UL_MAP(FRONTFACE , GL_CCW , 1);
48
UL_MAP(SCISSORTESTENABLE , GL_FALSE , 1);
49
UL_MAP(FOGENABLE , GL_FALSE , 1);
51
UL_MAP(ZTESTENABLE , GL_TRUE , 1);
52
UL_MAP(ZWRITEENABLE , GL_TRUE , 1);
53
UL_MAP(ZFUNC , GL_LESS , 1);
54
UL_MAP_FLOAT(ZNEAR , static_cast<UINT>(0.0f) , 1);
55
UL_MAP_FLOAT(ZFAR , static_cast<UINT>(1.0f) , 1);
57
UL_MAP(ALPHABLENDENABLE , GL_FALSE , 1);
58
UL_MAP(BLENDOP , GL_FUNC_ADD , 1);
59
UL_MAP(BLENDOPALPHA , GL_FUNC_ADD , 1);
60
UL_MAP(SRCBLEND , GL_ONE , 1);
61
UL_MAP(DESTBLEND , GL_ZERO , 1);
62
UL_MAP(SRCBLENDALPHA , GL_ONE , 1);
63
UL_MAP(DESTBLENDALPHA , GL_ZERO , 1);
65
UL_MAP(ALPHATESTENABLE , GL_FALSE , 1);
66
UL_MAP(ALPHATESTREF , 0x0 , 1);
67
UL_MAP(ALPHATESTFUNC , GL_ALWAYS , 1);
69
UL_MAP(STENCILENABLE , GL_FALSE , 1);
70
UL_MAP(TWOSIDEDSTENCILENABLE , GL_FALSE , 1);
71
UL_MAP(FRONT_STENCILWRITEMASK , 0xFFFFFFFF , 1);
72
UL_MAP(BACK_STENCILWRITEMASK , 0xFFFFFFFF , 1);
74
UL_MAP(FRONT_STENCILFUNC , GL_ALWAYS , 1);
75
UL_MAP(FRONT_STENCILREF , 0x0 , 1);
76
UL_MAP(FRONT_STENCILMASK , 0xFF , 1);
77
UL_MAP(FRONT_STENCILFAIL , GL_KEEP , 1);
78
UL_MAP(FRONT_STENCILZFAIL , GL_KEEP , 1);
79
UL_MAP(FRONT_STENCILZPASS , GL_KEEP , 1);
81
UL_MAP(BACK_STENCILFUNC , GL_ALWAYS , 1);
82
UL_MAP(BACK_STENCILREF , 0x0 , 1);
83
UL_MAP(BACK_STENCILMASK , 0xFF , 1);
84
UL_MAP(BACK_STENCILFAIL , GL_KEEP , 1);
85
UL_MAP(BACK_STENCILZFAIL , GL_KEEP , 1);
86
UL_MAP(BACK_STENCILZPASS , GL_KEEP , 1);
89
UL_MAP(POINTSMOOTHENABLE , GL_FALSE , 1);
90
UL_MAP(LINESMOOTHENABLE , GL_FALSE , 1);
91
UL_MAP(POINTSIZE , 1 , 1);
92
UL_MAP(LINEWIDTH , 1 , 1);
93
UL_MAP(POINTHINT , GL_FASTEST , 1);
94
UL_MAP(LINEHINT , GL_FASTEST , 1);
96
UL_MAP(COLORWRITEENABLE_R , GL_TRUE , 1);
97
UL_MAP(COLORWRITEENABLE_G , GL_TRUE , 1);
98
UL_MAP(COLORWRITEENABLE_B , GL_TRUE , 1);
99
UL_MAP(COLORWRITEENABLE_A , GL_TRUE , 1);
105
RenderStateMap default_render_state[GFXRS_MAX_RENDERSTATES];
106
RenderStateMap sampler_state_map[GFXSS_MAX_SAMPLERSTATES];
111
GLRenderStates::GLRenderStates(eGraphicsBoardVendor board)
113
m_BoardVendor = board;
114
Memcpy(&m_RenderStateChanges, &s_StateLUT.default_render_state, sizeof(m_RenderStateChanges));
117
GLRenderStates::~GLRenderStates()
122
void GLRenderStates::ResetDefault()
124
HW__EnableCulling( s_StateLUT.default_render_state[GFXRS_CULLFACEENABLE].iValue );
125
HW__SetFrontFace( s_StateLUT.default_render_state[GFXRS_FRONTFACE].iValue );
126
HW__SetCullFace( s_StateLUT.default_render_state[GFXRS_CULLFACE].iValue );
128
HW__SetDepthMask( s_StateLUT.default_render_state[GFXRS_ZWRITEENABLE].iValue );
129
HW__SetDepthFunc( s_StateLUT.default_render_state[GFXRS_ZFUNC].iValue );
130
HW__SetEnableDepthTest( s_StateLUT.default_render_state[GFXRS_ZTESTENABLE].iValue );
131
HW__SetDepthRange( s_StateLUT.default_render_state[GFXRS_ZNEAR].fValue, s_StateLUT.default_render_state[GFXRS_ZFAR].fValue );
133
HW__EnableAlphaBlend( s_StateLUT.default_render_state[GFXRS_ALPHABLENDENABLE].iValue );
134
HW__SetAlphaBlendOp( s_StateLUT.default_render_state[GFXRS_BLENDOP].iValue, s_StateLUT.default_render_state[GFXRS_BLENDOPALPHA].iValue );
135
HW__SetSeparateAlphaBlendFactors(
136
s_StateLUT.default_render_state[GFXRS_SRCBLEND].iValue, s_StateLUT.default_render_state[GFXRS_DESTBLEND].iValue,
137
s_StateLUT.default_render_state[GFXRS_SRCBLENDALPHA].iValue, s_StateLUT.default_render_state[GFXRS_DESTBLENDALPHA ].iValue );
140
HW__EnableAlphaTest( s_StateLUT.default_render_state[GFXRS_ALPHATESTENABLE].iValue );
141
HW__SetAlphaTestFunc( s_StateLUT.default_render_state[GFXRS_ALPHATESTFUNC].iValue, s_StateLUT.default_render_state[GFXRS_ALPHATESTREF].iValue );
144
HW__EnableStencil( s_StateLUT.default_render_state[GFXRS_STENCILENABLE].iValue );
145
HW__EnableTwoSidedStencil( s_StateLUT.default_render_state[GFXRS_TWOSIDEDSTENCILENABLE].iValue );
147
HW__SetFrontFaceStencilFunc(
148
s_StateLUT.default_render_state[GFXRS_FRONT_STENCILFUNC].iValue,
149
s_StateLUT.default_render_state[GFXRS_FRONT_STENCILREF].iValue,
150
s_StateLUT.default_render_state[GFXRS_FRONT_STENCILMASK].iValue );
151
HW__SetFrontFaceStencilOp(
152
s_StateLUT.default_render_state[GFXRS_FRONT_STENCILFAIL].iValue,
153
s_StateLUT.default_render_state[GFXRS_FRONT_STENCILZFAIL].iValue,
154
s_StateLUT.default_render_state[GFXRS_FRONT_STENCILZPASS].iValue );
156
HW__SetBackFaceStencilFunc(
157
s_StateLUT.default_render_state[GFXRS_BACK_STENCILFUNC].iValue,
158
s_StateLUT.default_render_state[GFXRS_BACK_STENCILREF].iValue,
159
s_StateLUT.default_render_state[GFXRS_BACK_STENCILMASK].iValue );
160
HW__SetBackFaceStencilOp(
161
s_StateLUT.default_render_state[GFXRS_BACK_STENCILFAIL].iValue,
162
s_StateLUT.default_render_state[GFXRS_BACK_STENCILZFAIL].iValue,
163
s_StateLUT.default_render_state[GFXRS_BACK_STENCILZPASS].iValue );
165
HW__EnableScissor( s_StateLUT.default_render_state[GFXRS_SCISSORTESTENABLE].iValue );
167
HW__EnableScissor( s_StateLUT.default_render_state[GFXRS_SCISSORTESTENABLE].iValue );
168
HW__EnableFog( s_StateLUT.default_render_state[GFXRS_FOGENABLE].iValue );
172
void GLRenderStates::SubmitChangeStates()
174
HW__EnableCulling( m_RenderStateChanges[GFXRS_CULLFACEENABLE].iValue );
175
HW__SetFrontFace( m_RenderStateChanges[GFXRS_FRONTFACE].iValue );
176
HW__SetCullFace( m_RenderStateChanges[GFXRS_CULLFACE].iValue );
178
HW__SetDepthMask( m_RenderStateChanges[GFXRS_ZWRITEENABLE].iValue );
179
HW__SetDepthFunc( m_RenderStateChanges[GFXRS_ZFUNC].iValue );
180
HW__SetEnableDepthTest( m_RenderStateChanges[GFXRS_ZTESTENABLE].iValue );
181
HW__SetDepthRange( m_RenderStateChanges[GFXRS_ZNEAR].fValue, m_RenderStateChanges[GFXRS_ZFAR].fValue );
183
HW__EnableAlphaBlend( m_RenderStateChanges[GFXRS_ALPHABLENDENABLE].iValue );
184
HW__SetAlphaBlendOp( m_RenderStateChanges[GFXRS_BLENDOP].iValue, m_RenderStateChanges[GFXRS_BLENDOPALPHA].iValue );
185
HW__SetSeparateAlphaBlendFactors(
186
m_RenderStateChanges[GFXRS_SRCBLEND].iValue, m_RenderStateChanges[GFXRS_DESTBLEND].iValue,
187
m_RenderStateChanges[GFXRS_SRCBLENDALPHA].iValue, m_RenderStateChanges[GFXRS_DESTBLENDALPHA ].iValue );
190
HW__EnableAlphaTest( m_RenderStateChanges[GFXRS_ALPHATESTENABLE].iValue );
191
HW__SetAlphaTestFunc( m_RenderStateChanges[GFXRS_ALPHATESTFUNC].iValue, m_RenderStateChanges[GFXRS_ALPHATESTREF].iValue );
194
HW__EnableStencil( m_RenderStateChanges[GFXRS_STENCILENABLE].iValue );
195
HW__EnableTwoSidedStencil( s_StateLUT.default_render_state[GFXRS_TWOSIDEDSTENCILENABLE].iValue );
197
HW__SetFrontFaceStencilFunc(
198
m_RenderStateChanges[GFXRS_FRONT_STENCILFUNC].iValue,
199
m_RenderStateChanges[GFXRS_FRONT_STENCILREF].iValue,
200
m_RenderStateChanges[GFXRS_FRONT_STENCILMASK].iValue );
201
HW__SetFrontFaceStencilOp(
202
m_RenderStateChanges[GFXRS_FRONT_STENCILFAIL].iValue,
203
m_RenderStateChanges[GFXRS_FRONT_STENCILZFAIL].iValue,
204
m_RenderStateChanges[GFXRS_FRONT_STENCILZPASS].iValue );
206
HW__SetBackFaceStencilFunc(
207
m_RenderStateChanges[GFXRS_BACK_STENCILFUNC].iValue,
208
m_RenderStateChanges[GFXRS_BACK_STENCILREF].iValue,
209
m_RenderStateChanges[GFXRS_BACK_STENCILMASK].iValue );
210
HW__SetBackFaceStencilOp(
211
m_RenderStateChanges[GFXRS_BACK_STENCILFAIL].iValue,
212
m_RenderStateChanges[GFXRS_BACK_STENCILZFAIL].iValue,
213
m_RenderStateChanges[GFXRS_BACK_STENCILZPASS].iValue );
215
HW__EnableScissor( m_RenderStateChanges[GFXRS_SCISSORTESTENABLE].iValue );
217
HW__EnableScissor( m_RenderStateChanges[GFXRS_SCISSORTESTENABLE].iValue );
218
HW__EnableFog( m_RenderStateChanges[GFXRS_FOGENABLE].iValue );
222
void GLRenderStates::ResetStateChangeToDefault()
224
for(UINT i = 0; i < GFXRS_MAX_RENDERSTATES; i++)
226
if(m_RenderStateChanges[i].Checked &&
227
((m_RenderStateChanges[i].iValue != s_StateLUT.default_render_state[i].iValue) ||
228
(m_RenderStateChanges[i].fValue != s_StateLUT.default_render_state[i].fValue) ))
230
m_RenderStateChanges[i].iValue = s_StateLUT.default_render_state[i].iValue;
231
m_RenderStateChanges[i].fValue = s_StateLUT.default_render_state[i].fValue;
236
void GLRenderStates::CheckStateChange()
238
for(UINT i = 0; i < GFXRS_MAX_RENDERSTATES; i++)
240
if(m_RenderStateChanges[i].Checked &&
241
((m_RenderStateChanges[i].iValue != s_StateLUT.default_render_state[i].iValue) ||
242
(m_RenderStateChanges[i].fValue != s_StateLUT.default_render_state[i].fValue) ))
244
m_RenderStateChanges[i].iValue = s_StateLUT.default_render_state[i].iValue;
245
m_RenderStateChanges[i].fValue = s_StateLUT.default_render_state[i].fValue;
246
nuxError(TEXT("[GLRenderStates::Check] Render state doesn't have default value"));
251
void GLRenderStates::SetRenderStates(UINT rs, UINT value)
253
#define RS_VALUE(a) (a).iValue
255
if (value != m_RenderStateChanges[rs].iValue)
257
m_RenderStateChanges[rs].iValue = static_cast<UINT>(value);
259
if(rs == GFXRS_ALPHATESTENABLE ||
260
rs == GFXRS_ALPHATESTREF ||
261
rs == GFXRS_ALPHATESTFUNC)
263
HW__EnableAlphaTest(RS_VALUE(m_RenderStateChanges[GFXRS_ALPHATESTENABLE]));
264
HW__SetAlphaTestFunc(
265
RS_VALUE(m_RenderStateChanges[GFXRS_ALPHATESTFUNC]),
266
RS_VALUE(m_RenderStateChanges[GFXRS_ALPHATESTREF]));
269
if(rs == GFXRS_STENCILENABLE ||
270
rs == GFXRS_TWOSIDEDSTENCILENABLE ||
271
rs == GFXRS_FRONT_STENCILFAIL ||
272
rs == GFXRS_FRONT_STENCILZFAIL ||
273
rs == GFXRS_FRONT_STENCILZPASS ||
274
rs == GFXRS_FRONT_STENCILFUNC ||
275
rs == GFXRS_FRONT_STENCILREF ||
276
rs == GFXRS_FRONT_STENCILMASK ||
277
rs == GFXRS_FRONT_STENCILWRITEMASK ||
278
rs == GFXRS_BACK_STENCILFAIL ||
279
rs == GFXRS_BACK_STENCILZFAIL ||
280
rs == GFXRS_BACK_STENCILZPASS ||
281
rs == GFXRS_BACK_STENCILFUNC ||
282
rs == GFXRS_BACK_STENCILREF ||
283
rs == GFXRS_BACK_STENCILMASK ||
284
rs == GFXRS_BACK_STENCILWRITEMASK)
286
HW__EnableStencil(RS_VALUE(m_RenderStateChanges[GFXRS_STENCILENABLE]));
287
HW__EnableTwoSidedStencil(RS_VALUE(m_RenderStateChanges[GFXRS_TWOSIDEDSTENCILENABLE]));
289
HW__SetFrontFaceStencilFunc(
290
RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILFUNC]),
291
RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILREF]),
292
RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILMASK]));
293
HW__SetFrontFaceStencilOp(
294
RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILFAIL]),
295
RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILZFAIL]),
296
RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILZPASS]));
297
HW__SetStencilFrontFaceWriteMask(
298
RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_STENCILWRITEMASK]));
300
HW__SetBackFaceStencilFunc(
301
RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILFUNC]),
302
RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILREF]),
303
RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILMASK]));
304
HW__SetBackFaceStencilOp(
305
RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILFAIL]),
306
RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILZFAIL]),
307
RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILZPASS]));
308
HW__SetStencilBackFaceWriteMask(
309
RS_VALUE(m_RenderStateChanges[GFXRS_BACK_STENCILWRITEMASK]));
312
if(rs == GFXRS_ALPHABLENDENABLE ||
313
rs == GFXRS_BLENDOP ||
314
rs == GFXRS_BLENDOPALPHA ||
315
rs == GFXRS_SRCBLEND ||
316
rs == GFXRS_DESTBLEND ||
317
rs == GFXRS_SRCBLENDALPHA ||
318
rs == GFXRS_DESTBLENDALPHA)
320
HW__EnableAlphaBlend(
321
RS_VALUE(m_RenderStateChanges[GFXRS_ALPHABLENDENABLE]));
323
HW__SetSeparateAlphaBlendFactors(
324
RS_VALUE(m_RenderStateChanges[GFXRS_SRCBLEND]),
325
RS_VALUE(m_RenderStateChanges[GFXRS_DESTBLEND]),
326
RS_VALUE(m_RenderStateChanges[GFXRS_SRCBLENDALPHA]),
327
RS_VALUE(m_RenderStateChanges[GFXRS_DESTBLENDALPHA]));
329
RS_VALUE(m_RenderStateChanges[GFXRS_BLENDOP]),
330
RS_VALUE(m_RenderStateChanges[GFXRS_BLENDOPALPHA]));
333
if(rs == GFXRS_COLORWRITEENABLE_R ||
334
rs == GFXRS_COLORWRITEENABLE_G ||
335
rs == GFXRS_COLORWRITEENABLE_B ||
336
rs == GFXRS_COLORWRITEENABLE_A)
339
RS_VALUE(m_RenderStateChanges[GFXRS_COLORWRITEENABLE_R]),
340
RS_VALUE(m_RenderStateChanges[GFXRS_COLORWRITEENABLE_G]),
341
RS_VALUE(m_RenderStateChanges[GFXRS_COLORWRITEENABLE_B]),
342
RS_VALUE(m_RenderStateChanges[GFXRS_COLORWRITEENABLE_A]));
345
if(rs == GFXRS_ZTESTENABLE ||
346
rs == GFXRS_ZWRITEENABLE ||
351
HW__SetEnableDepthTest(RS_VALUE(m_RenderStateChanges[GFXRS_ZTESTENABLE]));
352
HW__SetDepthMask(RS_VALUE(m_RenderStateChanges[GFXRS_ZWRITEENABLE]));
353
HW__SetDepthFunc(RS_VALUE(m_RenderStateChanges[GFXRS_ZFUNC]));
355
RS_VALUE(m_RenderStateChanges[GFXRS_ZNEAR]),
356
RS_VALUE(m_RenderStateChanges[GFXRS_ZFAR]));
359
if(rs == GFXRS_POLYGONOFFSETENABLE ||
360
rs == GFXRS_POLYGONOFFSETFACTOR ||
361
rs == GFXRS_POLYGONOFFSETUNITS)
363
HW__EnablePolygonOffset(RS_VALUE(m_RenderStateChanges[GFXRS_POLYGONOFFSETENABLE]));
364
HW__SetPolygonOffset(
365
RS_VALUE(m_RenderStateChanges[GFXRS_POLYGONOFFSETFACTOR]),
366
RS_VALUE(m_RenderStateChanges[GFXRS_POLYGONOFFSETUNITS]));
369
if(rs == GFXRS_FRONT_POLYGONMODE ||
370
rs == GFXRS_BACK_POLYGONMODE)
373
RS_VALUE(m_RenderStateChanges[GFXRS_FRONT_POLYGONMODE]),
374
RS_VALUE(m_RenderStateChanges[GFXRS_BACK_POLYGONMODE]));
377
if(rs == GFXRS_CULLFACEENABLE ||
378
rs == GFXRS_CULLFACE ||
379
rs == GFXRS_FRONTFACE)
381
HW__EnableCulling(RS_VALUE(m_RenderStateChanges[GFXRS_CULLFACEENABLE]));
382
HW__SetFrontFace(RS_VALUE(m_RenderStateChanges[GFXRS_FRONTFACE]));
383
HW__SetCullFace(RS_VALUE(m_RenderStateChanges[GFXRS_CULLFACE]));